From 053ed3c641097a5f782f18d4c1b4d400e5deceb3 Mon Sep 17 00:00:00 2001 From: Horilla Date: Tue, 10 Sep 2024 13:50:14 +0530 Subject: [PATCH] [UPDT] PMS: Subbordinates,collegue,manager change according to the employee selected --- pms/forms.py | 43 ++++---- pms/static/src/feedback/feedback_creation.js | 14 --- pms/templates/feedback/employees_select.html | 4 + pms/templates/feedback/feedback_creation.html | 19 ++++ pms/urls.py | 1 + pms/views.py | 99 ++++++++++++------- 6 files changed, 106 insertions(+), 74 deletions(-) create mode 100644 pms/templates/feedback/employees_select.html diff --git a/pms/forms.py b/pms/forms.py index b3d067b52..8431a0187 100644 --- a/pms/forms.py +++ b/pms/forms.py @@ -19,9 +19,13 @@ from django.utils.translation import gettext_lazy as _ from base.forms import ModelForm as BaseForm from base.forms import ModelForm as MF -from base.methods import reload_queryset +from base.methods import ( + filtersubordinatesemployeemodel, + is_reportingmanager, + reload_queryset, +) from employee.filters import EmployeeFilter -from employee.models import Department, JobPosition +from horilla import horilla_middlewares from horilla_widgets.widgets.horilla_multi_select_field import HorillaMultiSelectField from horilla_widgets.widgets.select_widgets import HorillaMultiSelectWidget from pms.models import ( @@ -734,11 +738,10 @@ class FeedbackForm(ModelForm): Initializes the feedback form instance. If an instance is provided, sets the initial value for the form's date fields. """ - + request = getattr(horilla_middlewares._thread_locals, "request", None) instance = kwargs.get("instance") - employee = kwargs.pop( - "employee", None - ) # access the logged-in user's information + employee = kwargs.pop("employee", None) + if instance: kwargs["initial"] = set_date_field_initial(instance) super().__init__(*args, **kwargs) @@ -757,23 +760,19 @@ class FeedbackForm(ModelForm): self.fields["period"].choices = list(self.fields["period"].choices) self.fields["period"].choices.append(("create_new_period", "Create new period")) - if instance: - self.fields["employee_id"].widget.attrs.update( - {"class": "oh-select oh-select-2"} - ) - employees = Employee.objects.filter( - is_active=True, employee_work_info__reporting_manager_id=employee + self.fields["employee_id"].widget.attrs.update( + {"onchange": "get_collegues($(this))"} ) - if employee and employees: - department = employee.employee_work_info.department_id - employees = Employee.objects.filter( - is_active=True, employee_work_info__department_id=department - ) - # manager level access - self.fields["employee_id"].queryset = employees - self.fields["manager_id"].queryset = employees - self.fields["colleague_id"].queryset = employees - self.fields["subordinate_id"].queryset = employees + if request.user.has_perm("pms.add_period"): + employees = Employee.objects.all() + elif is_reportingmanager(request): + # Queryset of subordinate employees + employees = filtersubordinatesemployeemodel(request, Employee.objects.all()) + # managers queryset + managers = Employee.objects.filter(id=employee.id) + self.fields["manager_id"].queryset = managers + + self.fields["employee_id"].queryset = employees def clean(self): """ diff --git a/pms/static/src/feedback/feedback_creation.js b/pms/static/src/feedback/feedback_creation.js index 3ec6271c8..b028d948a 100644 --- a/pms/static/src/feedback/feedback_creation.js +++ b/pms/static/src/feedback/feedback_creation.js @@ -61,20 +61,6 @@ $(document).ready(function () { .trigger("change"); }); - if (reporting_manager) { - // assigning the reporting manager of the employee - var options = $( - ` +{% endfor %} + \ No newline at end of file diff --git a/pms/templates/feedback/feedback_creation.html b/pms/templates/feedback/feedback_creation.html index 337dd15e8..a27731f2d 100644 --- a/pms/templates/feedback/feedback_creation.html +++ b/pms/templates/feedback/feedback_creation.html @@ -185,7 +185,26 @@ + + + + diff --git a/pms/urls.py b/pms/urls.py index 326aba601..64b84fc25 100644 --- a/pms/urls.py +++ b/pms/urls.py @@ -133,6 +133,7 @@ urlpatterns = [ path("feedback-update/", views.feedback_update, name="feedback-update"), path("feedback-delete/", views.feedback_delete, name="feedback-delete"), path("feedback-archive/", views.feedback_archive, name="feedback-archive"), + path("get-collegues", views.get_collegues, name="get-collegues"), path( "feedback-answer-get/", views.feedback_answer_get, diff --git a/pms/views.py b/pms/views.py index 28e940b1d..48900a1f0 100644 --- a/pms/views.py +++ b/pms/views.py @@ -19,6 +19,7 @@ from django.db.utils import IntegrityError from django.forms import modelformset_factory from django.http import HttpResponse, HttpResponseRedirect, JsonResponse from django.shortcuts import get_object_or_404, redirect, render +from django.template.loader import render_to_string from django.urls import reverse from django.utils.translation import gettext_lazy as _ @@ -1733,25 +1734,20 @@ def feedback_list_view(request): it will return the filtered and searched object. """ user = request.user - employee = Employee.objects.filter(employee_user_id=user).first() - feedback_requested_ids = Feedback.objects.filter( - Q(manager_id=employee, manager_id__is_active=True) - | Q(colleague_id=employee, colleague_id__is_active=True) - | Q(subordinate_id=employee, subordinate_id__is_active=True) - ).values_list("id", flat=True) - feedback_own = Feedback.objects.filter(employee_id=employee).filter( - archive=False, employee_id__is_active=True - ) - feedback_requested = Feedback.objects.filter(pk__in=feedback_requested_ids).filter( - archive=False, employee_id__is_active=True - ) - feedback_all = Feedback.objects.all().filter( - Q( - manager_id=employee, - manager_id__is_active=True, - archive=False, - ) + employee = user.employee_get + # filter own feedbacks (self feedbacks) + feedback_own = Feedback.objects.filter( + employee_id=employee, + archive=False, ) + # feedbacks to answer + feedback_requested = Feedback.objects.filter( + Q(manager_id=employee) | Q(colleague_id=employee) | Q(subordinate_id=employee) + ).distinct() + + # feedbacks to review if employee is a manager + feedback_all = Feedback.objects.all().filter(Q(manager_id=employee, archive=False)) + # Anonymous feedbacks anonymous_feedback = ( AnonymousFeedback.objects.filter(employee_id=employee, archive=False) if not request.user.has_perm("pms.view_feedback") @@ -1760,26 +1756,11 @@ def feedback_list_view(request): anonymous_feedback = anonymous_feedback | AnonymousFeedback.objects.filter( anonymous_feedback_id=request.user.id, archive=False ) - employees = Employee.objects.filter( - employee_work_info__reporting_manager_id=employee, is_active=True - ) # checking the user is reporting manager or not - feedback_available = Feedback.objects.all() - if request.user.has_perm("pms.view_feedback"): - context = filter_pagination_feedback( - request, feedback_own, feedback_requested, feedback_all, anonymous_feedback - ) - elif employees: - # based on the reporting manager - feedback_all = Feedback.objects.filter(employee_id__in=employees) - context = filter_pagination_feedback( - request, feedback_own, feedback_requested, feedback_all, anonymous_feedback - ) - else: - feedback_all = Feedback.objects.none() - context = filter_pagination_feedback( - request, feedback_own, feedback_requested, feedback_all, anonymous_feedback - ) - if feedback_available.exists(): + context = filter_pagination_feedback( + request, feedback_own, feedback_requested, feedback_all, anonymous_feedback + ) + # checking condition for empty page + if Feedback.objects.all().exists(): template = "feedback/feedback_list_view.html" else: template = "feedback/feedback_empty.html" @@ -2065,6 +2046,48 @@ def feedback_archive(request, id): return redirect(feedback_list_view) +@login_required +def get_collegues(request): + """ + Get collegues and subordinates for the manager. + """ + try: + employee_id = request.GET.get("employee_id") + employee = Employee.objects.get(id=int(employee_id)) if employee_id else None + + if employee: + if request.GET.get("data") == "colleagues": + department = employee.get_department() + # Get employees in the same department as the employee + employees_queryset = Employee.objects.filter( + is_active=True, employee_work_info__department_id=department + ).values_list("id", "employee_first_name") + elif request.GET.get("data") == "manager": + reporting_manager = ( + employee.employee_work_info.reporting_manager_id + if employee.employee_work_info + else None + ) + employees_queryset = Employee.objects.filter( + id=reporting_manager.id + ).values_list("id", "employee_first_name") + elif request.GET.get("data") == "subordinates": + employees_queryset = Employee.objects.filter( + is_active=True, employee_work_info__reporting_manager_id=employee + ).values_list("id", "employee_first_name") + # Convert QuerySets to a list + employees = list(employees_queryset) + context = {"employees": employees} + employee_html = render_to_string("feedback/employees_select.html", context) + return HttpResponse(employee_html) + else: + return JsonResponse({"error": "Employee not found"}, status=404) + except Employee.DoesNotExist: + return JsonResponse({"error": "Invalid Employee ID"}, status=400) + except Exception as e: + return JsonResponse({"error": str(e)}, status=500) + + @login_required def feedback_status(request): """this function is used to un-archive the feedback