diff --git a/pms/cbvs.py b/pms/cbvs.py index f6e61d122..48a504cc7 100644 --- a/pms/cbvs.py +++ b/pms/cbvs.py @@ -8,12 +8,18 @@ from django.utils.decorators import method_decorator from django.utils.translation import gettext_lazy as _trans from base.methods import filter_own_and_subordinate_recordes, is_reportingmanager +from employee.forms import EmployeeForm from horilla import horilla_middlewares from horilla.decorators import login_required, permission_required from horilla_views.generic.cbv import views from pms import models from pms.filters import BonusPointSettingFilter, EmployeeBonusPointFilter -from pms.forms import BonusPointSettingForm, EmployeeBonusPointForm +from pms.forms import ( + BonusPointSettingForm, + EmployeeBonusPointForm, + EmployeeFeedbackForm, +) +from pms.methods import check_duplication # ================Models for BonusPointSetting============== @@ -264,3 +270,45 @@ class EmployeeBonusPointListView(views.HorillaListView): ) else: return queryset.filter(employee_id=request.user.employee_get) + + +####################### Feedback ######################################## + + +# @method_decorator(login_required, name="dispatch") +# @method_decorator( +# permission_required("pms.change_feedback"), name="dispatch" +# ) +class FeedbackEmployeeFormView(views.HorillaFormView): + """ + Feedback other employee form View + """ + + form_class = EmployeeFeedbackForm + model = models.Feedback + new_display_title = _trans("Share Feedback request ") + # template_name = "bonus/bonus_form.html" + + def get_context_data(self, **kwargs): + context = super().get_context_data(**kwargs) + return context + + def form_invalid(self, form: Any) -> HttpResponse: + if not form.is_valid(): + errors = form.errors.as_data() + return render( + self.request, self.template_name, {"form": form, "errors": errors} + ) + return super().form_invalid(form) + + def form_valid(self, form: EmployeeForm) -> views.HttpResponse: + if form.is_valid(): + message = "Feedback request sent." + other_employees = check_duplication( + form.instance, form.cleaned_data.get("others_id", []) + ) + form.cleaned_data["others_id"] = other_employees + form.save() + messages.success(self.request, _trans(message)) + return self.HttpResponse("") + return super().form_valid(form) diff --git a/pms/forms.py b/pms/forms.py index bfc946a7f..31257c9a8 100644 --- a/pms/forms.py +++ b/pms/forms.py @@ -1154,3 +1154,40 @@ class EmployeeBonusPointForm(HorillaModelForm): {"bonus_point": _("Point should be greater than zero.")} ) return cleaned_data + + +class EmployeeFeedbackForm(HorillaModelForm): + + cols = {"others_id": 12} + + class Meta: + model = Feedback + fields = ["others_id"] + + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + self.fields["others_id"] = HorillaMultiSelectField( + queryset=Employee.objects.filter(employee_work_info__isnull=False), + widget=HorillaMultiSelectWidget( + filter_route_name="employee-widget-filter", + filter_class=EmployeeFilter, + filter_instance_contex_name="f", + filter_template_path="employee_filters.html", + form=self, + instance=self.instance, + ), + label=_("Employees"), + ) + + def clean(self): + cleaned_data = super().clean() + if isinstance(self.fields["others_id"], HorillaMultiSelectField): + self.errors.pop("others_id", None) + + employee_data = self.fields["others_id"].queryset.filter( + id__in=self.data.getlist("others_id") + ) + + cleaned_data["others_id"] = employee_data + + return cleaned_data diff --git a/pms/methods.py b/pms/methods.py index 5a5bced00..0ca84980d 100644 --- a/pms/methods.py +++ b/pms/methods.py @@ -123,3 +123,16 @@ def get_anonymous_feedbacks(employee): | AnonymousFeedback.objects.filter(employee_id=employee) ) return anonymous_feedbacks + + +def check_duplication(feedback, other_employees): + """Remove already existing employee from feedback request and return updated employees""" + req_employees = set(feedback.subordinate_id.all()) + req_employees.update(feedback.colleague_id.all()) + if feedback.manager_id: + req_employees.add(feedback.manager_id) + if feedback.employee_id: + req_employees.add(feedback.employee_id) + # Remove already requested employees from others_id + updated_employees = [emp for emp in other_employees if emp not in req_employees] + return updated_employees diff --git a/pms/models.py b/pms/models.py index ee00e7092..5f4b0cedb 100644 --- a/pms/models.py +++ b/pms/models.py @@ -528,6 +528,12 @@ class Feedback(HorillaModel): blank=True, verbose_name=_("Subordinates"), ) + others_id = models.ManyToManyField( + Employee, + related_name="feedback_others", + blank=True, + verbose_name=_("Employees"), + ) question_template_id = models.ForeignKey( QuestionTemplate, on_delete=models.DO_NOTHING, @@ -598,24 +604,14 @@ class Feedback(HorillaModel): return f"{self.employee_id.employee_first_name} - {self.review_cycle}" def requested_employees(self): - manager = self.manager_id - colleagues = self.colleague_id.all() - subordinates = self.subordinate_id.all() - owner = self.employee_id - - employees = [employee for employee in subordinates] - - for employee in colleagues: - if employee not in employees: - employees.append(employee) - - if manager not in employees: - employees.append(manager) - - if owner not in employees: - employees.append(owner) - - return employees + employees = set(self.subordinate_id.all()) + employees.update(self.colleague_id.all()) + employees.update(self.others_id.all()) + if self.manager_id: + employees.add(self.manager_id) + if self.employee_id: + employees.add(self.employee_id) + return list(employees) class AnonymousFeedback(models.Model): diff --git a/pms/templates/feedback/feedback_detailed_view.html b/pms/templates/feedback/feedback_detailed_view.html index a5a7e61f2..825452b56 100644 --- a/pms/templates/feedback/feedback_detailed_view.html +++ b/pms/templates/feedback/feedback_detailed_view.html @@ -112,10 +112,10 @@ {% trans feedback.get_status_display %} {% endif %} - {% if perms.pms.change_feedback or perms.pms.delete_feedback %} + {% if perms.pms.change_feedback or perms.pms.delete_feedback or request.user.employee_get == feedback.created_by or perms.pms.change_feedback %}