diff --git a/pms/__init__.py b/pms/__init__.py index e69de29bb..b59ad94a5 100644 --- a/pms/__init__.py +++ b/pms/__init__.py @@ -0,0 +1 @@ +from . import scheduler diff --git a/pms/forms.py b/pms/forms.py index 2f3f483b1..f2a64c846 100644 --- a/pms/forms.py +++ b/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): diff --git a/pms/models.py b/pms/models.py index ca63b0963..3eef20114 100644 --- a/pms/models.py +++ b/pms/models.py @@ -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}" diff --git a/pms/scheduler.py b/pms/scheduler.py new file mode 100644 index 000000000..edd0504e5 --- /dev/null +++ b/pms/scheduler.py @@ -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() diff --git a/pms/static/src/feedback/feedback_creation.js b/pms/static/src/feedback/feedback_creation.js index 3e269e9e7..bf23df28d 100644 --- a/pms/static/src/feedback/feedback_creation.js +++ b/pms/static/src/feedback/feedback_creation.js @@ -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(); } diff --git a/pms/templates/feedback/feedback_creation.html b/pms/templates/feedback/feedback_creation.html index 542b3205b..fcd81acda 100644 --- a/pms/templates/feedback/feedback_creation.html +++ b/pms/templates/feedback/feedback_creation.html @@ -110,7 +110,6 @@