[UPDT] PMS: Added cyclic feedback option
This commit is contained in:
@@ -0,0 +1 @@
|
||||
from . import scheduler
|
||||
|
||||
19
pms/forms.py
19
pms/forms.py
@@ -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):
|
||||
|
||||
@@ -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
47
pms/scheduler.py
Normal 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()
|
||||
@@ -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();
|
||||
}
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user