diff --git a/pms/forms.py b/pms/forms.py index 4a49d0b98..4c60a11cf 100644 --- a/pms/forms.py +++ b/pms/forms.py @@ -18,7 +18,7 @@ from django.template.loader import render_to_string from django.utils.translation import gettext_lazy as _ from base.forms import ModelForm as BaseForm -from base.forms import ModelForm as MF +from base.forms import ModelForm as HorillaModelForm from base.methods import ( filtersubordinatesemployeemodel, is_reportingmanager, @@ -447,10 +447,7 @@ class EmployeeKeyResultForm(BaseForm): ) -from base.forms import ModelForm as MF - - -class KRForm(MF): +class KRForm(HorillaModelForm): """ A form used for creating KeyResult object """ @@ -661,28 +658,20 @@ class KeyResultForm(ModelForm): return cleaned_data -class FeedbackForm(ModelForm): +class FeedbackForm(HorillaModelForm): """ - A form used for creating and updating Feedback objects. + FeedbackForm for better performance. """ period = forms.ModelChoiceField( - queryset=Period.objects.all(), + queryset=Period.objects.none(), + label=_("Period"), empty_label="", - widget=forms.Select( - attrs={ - "class": " oh-select--period-change ", - "style": "width:100%;", - } - ), + widget=forms.Select(attrs={"class": "oh-select--period-change"}), required=False, ) class Meta: - """ - A nested class that specifies the model,fields and exclude fields for the form. - """ - model = Feedback fields = "__all__" exclude = ["status", "archive", "is_active"] @@ -692,45 +681,10 @@ class FeedbackForm(ModelForm): attrs={"placeholder": _("Enter a title"), "class": "oh-input w-100"} ), "start_date": forms.DateInput( - attrs={"type": "date", "class": "oh-input w-100"} + attrs={"type": "date", "class": "oh-input w-100"} ), "end_date": forms.DateInput( - attrs={"type": "date", "class": "oh-input w-100"} - ), - "employee_id": forms.Select( - attrs={ - "class": "oh-select oh-select-2", - "required": "false", - }, - ), - "manager_id": forms.Select( - attrs={ - "class": "oh-select oh-select-2 ", - "style": "width:100%;", - "required": "true", - }, - ), - "colleague_id": forms.SelectMultiple( - attrs={ - "class": "oh-select oh-select-2 w-100", - "multiple": "multiple", - "style": "width:100%;", - } - ), - "subordinate_id": forms.SelectMultiple( - attrs={ - "class": "oh-select oh-select-2 w-100", - "multiple": "multiple", - "style": "width:100%;", - "required": "false", - } - ), - "question_template_id": forms.Select( - attrs={ - "class": "oh-select oh-select--lg oh-select-no-search", - "style": "width:100%;", - "required": "true", - } + attrs={"type": "date", "class": "oh-input w-100"} ), "cyclic_feedback": forms.CheckboxInput( attrs={ @@ -738,41 +692,41 @@ class FeedbackForm(ModelForm): "onchange": "changeCyclicFeedback(this)", } ), - "cyclic_feedback_period": forms.Select( - attrs={ - "class": "oh-select oh-select--lg oh-select-no-search", - "style": "width:100%;", - } - ), - "cyclic_feedback_days_count": forms.NumberInput( - attrs={ - "class": "oh-input", - } - ), } def __init__(self, *args, **kwargs): """ - Initializes the feedback form instance. - If an instance is provided, sets the initial value for the form's date fields. + Initializes the form and queryset filtering. """ - # fetch request request = getattr(horilla_middlewares._thread_locals, "request", None) - # get instance - instance = kwargs.get("instance") - # set employee - if instance: - employee = instance.employee_id - else: - employee = request.user.employee_get - - if not instance: - today = datetime.datetime.today().date() - kwargs["initial"] = {"start_date": today, "end_date": today} - super().__init__(*args, **kwargs) - # Horilla multi select filter for employee + user = request.user if request else None + user_perms = user.get_all_permissions() if user else set() + + self.fields["period"].queryset = Period.objects.all() + self.fields["period"].widget.attrs.update({"class": "w-100"}) + + if user and ("pms.add_period" in user_perms or is_reportingmanager(request)): + self.fields["period"].choices = [ + *self.fields["period"].choices, + ("create_new_period", "Create new period"), + ] + + employee_queryset = Employee.objects.none() + if user and ("pms.add_feedback" in user_perms or is_reportingmanager(request)): + employee_queryset = filtersubordinatesemployeemodel( + request, + Employee.objects.all(), + perm="pms.add_feedback", + ) + + self.fields["employee_id"].queryset = ( + employee_queryset | Employee.objects.filter(employee_user_id=request.user) + ) + self.fields["employee_id"].widget.attrs["onchange"] = "get_collegues($(this))" + + # Horilla multi-select filter for subordinates self.fields["subordinate_id"] = HorillaMultiSelectField( queryset=Employee.objects.all(), widget=HorillaMultiSelectWidget( @@ -783,32 +737,10 @@ class FeedbackForm(ModelForm): instance=self.instance, required=False, ), - label="Subordinates", + label=_("Subordinates"), ) - reload_queryset(self.fields) - # check the request user has permission to add period - if request.user.has_perm("pms.add_period") or is_reportingmanager(request): - # add dyanamic period creation as choice - self.fields["period"].choices = list(self.fields["period"].choices) - self.fields["period"].choices.append( - ("create_new_period", "Create new period") - ) - # add onchange function to get employee data - self.fields["employee_id"].widget.attrs.update( - {"onchange": "get_collegues($(this))"} - ) - # filtering employees accordig to the request user - if request.user.has_perm("pms.add_feedback") or is_reportingmanager(request): - # Queryset of subordinate employees - employees = filtersubordinatesemployeemodel( - request, Employee.objects.all(), perm="pms.add_feedback" - ) - self.fields["employee_id"].queryset = employees | Employee.objects.filter( - employee_user_id=request.user - ) - if not instance: - self.fields["employee_id"].initial = employee + reload_queryset(self.fields) def clean(self): """ @@ -1119,7 +1051,7 @@ class MeetingsForm(BaseForm): pass -class BonusPointSettingForm(MF): +class BonusPointSettingForm(HorillaModelForm): """ BonusPointSetting form """ @@ -1165,7 +1097,7 @@ class BonusPointSettingForm(MF): return cleaned_data -class EmployeeBonusPointForm(MF): +class EmployeeBonusPointForm(HorillaModelForm): """ EmployeeBonusPoint form """ diff --git a/pms/models.py b/pms/models.py index 3680bb2ae..d1899bd88 100644 --- a/pms/models.py +++ b/pms/models.py @@ -497,13 +497,16 @@ class Feedback(HorillaModel): ("months", _("Months")), ("years", _("Years")), ) - review_cycle = models.CharField(max_length=100, null=False, blank=False) + review_cycle = models.CharField( + max_length=100, null=False, blank=False, verbose_name=_("Title") + ) manager_id = models.ForeignKey( Employee, related_name="feedback_manager", on_delete=models.DO_NOTHING, null=True, blank=False, + verbose_name=_("Manager"), ) employee_id = models.ForeignKey( Employee, @@ -511,12 +514,19 @@ class Feedback(HorillaModel): related_name="feedback_employee", null=False, blank=False, + verbose_name=_("Employee"), ) colleague_id = models.ManyToManyField( - Employee, related_name="feedback_colleague", blank=True + Employee, + related_name="feedback_colleague", + blank=True, + verbose_name=_("Colleague"), ) subordinate_id = models.ManyToManyField( - Employee, related_name="feedback_subordinate", blank=True + Employee, + related_name="feedback_subordinate", + blank=True, + verbose_name=_("Subordinates"), ) question_template_id = models.ForeignKey( QuestionTemplate, @@ -524,19 +534,23 @@ class Feedback(HorillaModel): related_name="feedback_question_template", null=False, blank=False, + verbose_name=_("Question Template"), ) status = models.CharField( max_length=50, choices=STATUS_CHOICES, default="Not Started" ) archive = models.BooleanField(null=True, blank=True, default=False) - start_date = models.DateField(null=False, blank=False) - end_date = models.DateField(null=True, blank=False) + start_date = models.DateField(null=False, blank=False, verbose_name=_("Start Date")) + end_date = models.DateField(null=True, blank=False, verbose_name=_("End Date")) employee_key_results_id = models.ManyToManyField( - EmployeeKeyResult, - blank=True, + EmployeeKeyResult, blank=True, verbose_name=_("Key Result") + ) + cyclic_feedback = models.BooleanField( + default=False, verbose_name=_("Is Cyclic Feedback") + ) + cyclic_feedback_days_count = models.IntegerField( + blank=True, null=True, verbose_name=_("Cycle Period") ) - 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 ) @@ -547,6 +561,8 @@ class Feedback(HorillaModel): class Meta: ordering = ["-id"] + verbose_name = _("Feedback") + verbose_name_plural = _("Feedbacks") def save(self, *args, **kwargs): start_date = self.start_date diff --git a/pms/templates/feedback/feedback_creation.html b/pms/templates/feedback/feedback_creation.html index e1c1d890b..695e4e360 100644 --- a/pms/templates/feedback/feedback_creation.html +++ b/pms/templates/feedback/feedback_creation.html @@ -9,32 +9,29 @@ {% block content %} {% if feedback_form.errors %} - -