[UPDT] PMS: Added cyclic feedback option

This commit is contained in:
Horilla
2024-04-02 10:11:55 +05:30
parent f9fa6be56c
commit 47f938abd3
8 changed files with 168 additions and 6 deletions

View File

@@ -0,0 +1 @@
from . import scheduler

View File

@@ -4,6 +4,7 @@ forms.py
This module is used to register the forms for pms models
"""
import datetime
from typing import Any
import uuid
from django import forms
@@ -661,6 +662,24 @@ class FeedbackForm(ModelForm):
"required": "false",
}
),
"cyclic_feedback": forms.CheckboxInput(
attrs={
"class": "oh-switch__checkbox",
}
),
"cyclic_feedback_period": forms.Select(
attrs={
"class": "oh-select oh-select--lg oh-select-no-search",
"style": "width:100%; display:none;",
"required": "false",
}
),
"cyclic_feedback_days_count": forms.NumberInput(
attrs={
"class": "oh-input",
"required": "false",
}
),
}
def __init__(self, *args, **kwargs):

View File

@@ -326,6 +326,8 @@ class EmployeeKeyResult(models.Model):
# if self.target_value != 0:
if not self.pk and not self.current_value:
self.current_value = self.start_value
if self.key_result_id:
self.key_result = self.key_result_id.title
self.update_kr_progress()
super().save(*args, **kwargs)
self.employee_objective_id.update_objective_progress()
@@ -409,6 +411,11 @@ class Feedback(models.Model):
("At Risk", _("At Risk")),
("Not Started", _("Not Started")),
)
PERIOD = (
("days", _("Days")),
("months", _("Months")),
("years", _("Years")),
)
review_cycle = models.CharField(max_length=100, null=False, blank=False)
manager_id = models.ForeignKey(
Employee,
@@ -448,7 +455,36 @@ class Feedback(models.Model):
EmployeeKeyResult,
blank=True,
)
cyclic_feedback = models.BooleanField(default=False)
cyclic_feedback_days_count = models.IntegerField(blank=True, null=True)
cyclic_feedback_period = models.CharField(
max_length=50, choices=PERIOD, blank=True, null=True
)
cyclic_next_start_date = models.DateField(null=True, blank=True)
cyclic_next_end_date = models.DateField(null=True, blank=True)
objects = HorillaCompanyManager("employee_id__employee_work_info__company_id")
class Meta:
ordering = ["-id"]
def save(self, *args, **kwargs):
start_date = self.start_date
end_date = self.end_date
cyclic_feedback_period = self.cyclic_feedback_period
cyclic_feedback_days_count = self.cyclic_feedback_days_count
if cyclic_feedback_period == "months":
self.cyclic_next_start_date = self.start_date + relativedelta(months=cyclic_feedback_days_count)
self.cyclic_next_end_date = end_date + relativedelta(months=cyclic_feedback_days_count)
elif cyclic_feedback_period == "years":
self.cyclic_next_start_date = start_date + relativedelta(years=cyclic_feedback_days_count)
self.cyclic_next_end_date = end_date + relativedelta(years=cyclic_feedback_days_count)
elif cyclic_feedback_period == "days":
self.cyclic_next_start_date = start_date + relativedelta(days=cyclic_feedback_days_count)
self.cyclic_next_end_date = end_date + relativedelta(days=cyclic_feedback_days_count)
super().save(*args, **kwargs)
def __str__(self):
return f"{self.employee_id.employee_first_name} - {self.review_cycle}"

47
pms/scheduler.py Normal file
View File

@@ -0,0 +1,47 @@
from apscheduler.schedulers.background import BackgroundScheduler
from apscheduler.triggers.cron import CronTrigger
from datetime import datetime
from notifications.signals import notify
def cyclic_feedback_creation():
from pms.models import Feedback
try:
feedbacks = Feedback.objects.filter(
cyclic_next_start_date=datetime.today().date()
)
for feedback in feedbacks:
if feedback.cyclic_feedback:
feedback_obj = Feedback()
for field in feedback._meta.fields:
if field.name not in [
"id",
"cyclic_next_start_date",
"cyclic_next_end_date",
]:
setattr(feedback_obj, field.name, getattr(feedback, field.name))
title = (
f"{feedback_obj.review_cycle.split('- cyclic')[0]} - cyclic {feedback_obj.start_date}"
if "- cyclic" in feedback_obj.review_cycle
else f"{feedback_obj.review_cycle} - cyclic {feedback_obj.start_date}"
)
feedback_obj.review_cycle = title
feedback_obj.status = "Not Started"
feedback_obj.start_date = feedback.cyclic_next_start_date
feedback_obj.end_date = feedback.cyclic_next_end_date
feedback_obj.save()
feedback.cyclic_feedback = False
feedback.save()
return feedback_obj
except Exception as e:
print(e)
scheduler = BackgroundScheduler()
cron_trigger = CronTrigger(hour=8)
scheduler.add_job(cyclic_feedback_creation, cron_trigger)
scheduler.start()

View File

@@ -73,7 +73,7 @@ $(document).ready(function () {
},
error: (error) => {
console.log(error);
}
});
}
@@ -91,7 +91,14 @@ $(document).ready(function () {
});
}
});
$("#id_cyclic_feedback").on("change", function(){
if (this.checked){
$("#cyclic_feedback_period").show()
}
else{
$("#cyclic_feedback_period").hide()
}
})
});
@@ -101,7 +108,6 @@ function validateFeedBack(event) {
var employeElement = $("#id_employee_id")
var managerElement = $("#id_manager_id")
var questionTemplateElement = $("#id_question_template_id")
console.log(employeElement.val());
if (employeElement.val()=='') {
$(employeElement).siblings(".errorlist").first().show();
}

View File

@@ -110,7 +110,6 @@
</div>
</div>
<div class="row">
<div class="col-12 col-sm-12 col-md-6 col-lg-6">
<div class="oh-input__group">
<label class="oh-input__label" for="{{feedback_form.question_template_id.id_for_label}}">{% trans "Question Template" %}</label>
@@ -129,7 +128,26 @@
</select>
</div>
</div>
</div>
<div class="row">
<div class="col-12 col-sm-12 col-md-6 col-lg-6 mb-5" id="">
<div class="oh-input__group">
<label class="oh-input__label" for="{{feedback_form.cyclic_feedback.id_for_label}}">{% trans "Is Cyclic Feedback" %}</label>
<div class="oh-switch">
{{feedback_form.cyclic_feedback}}
</div>
{{feedback_form.cyclic_feedback.errors}}
</div>
</div>
<div class="col-12 col-sm-12 col-md-6 col-lg-6" style="display:none" id="cyclic_feedback_period">
<div class="oh-input__group">
<label class="oh-input__label" for="id_employee_key_results_id">{% trans "Cycle Period" %}</label>
<div class="w-100 d-flex">
{{feedback_form.cyclic_feedback_days_count}}
{{feedback_form.cyclic_feedback_period}}
</div>
</div>
</div>
</div>
</div>
</section>

View File

@@ -99,11 +99,46 @@
</div>
</div>
<div class="row">
<div class="col-12 col-sm-12 col-md-6 col-lg-6 mb-5" id="">
<div class="oh-input__group">
<label class="oh-input__label" for="{{feedback_form.cyclic_feedback.id_for_label}}">{% trans "Is Cyclic Feedback" %}</label>
<div class="oh-switch">
{{feedback_form.cyclic_feedback}}
</div>
{{feedback_form.cyclic_feedback.errors}}
</div>
</div>
<div class="col-12 col-sm-12 col-md-6 col-lg-6" style="display:none" id="cyclic_feedback_period">
<div class="oh-input__group">
<label class="oh-input__label" for="id_employee_key_results_id">{% trans "Cycle Period" %}</label>
<div class="w-100 d-flex">
{{feedback_form.cyclic_feedback_days_count}}
{{feedback_form.cyclic_feedback_period}}
</div>
</div>
</div>
</div>
<button type="submit" class=" w-100 oh-btn oh-btn--secondary oh-btn--shadow mt-4 mb-4">
{% trans "Save" %}
</button>
</form>
<script>
$(document).ready(function() {
if ($("#id_cyclic_feedback").prop("checked")){
$("#cyclic_feedback_period").show()
}
$("#id_cyclic_feedback").on("change", function(){
if (this.checked){
$("#cyclic_feedback_period").show()
}
else{
$("#cyclic_feedback_period").hide()
}
})
})
</script>
<script src="{% static 'src/feedback/feedback_creation.js' %}"></script>

View File

@@ -1269,7 +1269,7 @@ def feedback_creation_ajax(request):
if request.method == "POST":
employee_id = request.POST.get("employee_id")
key_results = EmployeeKeyResult.objects.filter(
employee_id=employee_id
employee_objective_id__employee_id=employee_id
).values()
employee_work_info = EmployeeWorkInformation.objects.filter(
employee_id__id=employee_id