From 5ca421c8463bedf9c647e60b3c336b1e54932026 Mon Sep 17 00:00:00 2001 From: Horilla Date: Mon, 26 Feb 2024 20:03:58 +0530 Subject: [PATCH] [ADD] OFFBOARDING: Added group by to resignation letter --- offboarding/filters.py | 16 + .../offboarding/resignation/filter.html | 1 + .../offboarding/resignation/group_by.html | 353 ++++++++++++++++++ .../offboarding/resignation/nav.html | 103 ++++- .../resignation/request_cards.html | 8 +- .../offboarding/resignation/request_list.html | 338 +++++++++++++++++ .../resignation/request_single_view.html | 174 +++++++++ .../resignation/requests_view.html | 8 +- offboarding/views.py | 72 +++- 9 files changed, 1056 insertions(+), 17 deletions(-) create mode 100644 offboarding/templates/offboarding/resignation/group_by.html create mode 100644 offboarding/templates/offboarding/resignation/request_list.html create mode 100644 offboarding/templates/offboarding/resignation/request_single_view.html diff --git a/offboarding/filters.py b/offboarding/filters.py index e0b0e8ef9..436b84e4f 100644 --- a/offboarding/filters.py +++ b/offboarding/filters.py @@ -132,3 +132,19 @@ class PipelineEmployeeFilter(FilterSet): | queryset.filter(stage_id__title__icontains=value) | queryset.filter(stage_id__offboarding_id__title__icontains=value) ).distinct() + + +class LetterReGroup(FilterSet): + """ + Class to keep the field name for group by option + """ + + fields = [ + ("", "Select"), + ("employee_id", "Employee"), + ("planned_to_leave_on", "Planned to leave date"), + ("status", "Status"), + ("employee_id__employee_work_info__department_id", "Department"), + ("employee_id__employee_work_info__job_position_id", "Job Position"), + ("employee_id__employee_work_info__reporting_manager_id", "Reporting Manager"), + ] \ No newline at end of file diff --git a/offboarding/templates/offboarding/resignation/filter.html b/offboarding/templates/offboarding/resignation/filter.html index c3ba4f2b5..3a273dd9d 100644 --- a/offboarding/templates/offboarding/resignation/filter.html +++ b/offboarding/templates/offboarding/resignation/filter.html @@ -9,6 +9,7 @@ x-show="open" @click.outside="open = false" > +
{% trans "Resignation" %}
diff --git a/offboarding/templates/offboarding/resignation/group_by.html b/offboarding/templates/offboarding/resignation/group_by.html new file mode 100644 index 000000000..2bd768cc6 --- /dev/null +++ b/offboarding/templates/offboarding/resignation/group_by.html @@ -0,0 +1,353 @@ +{% load attendancefilters %} {% load basefilters %} {% load static %} +{% load i18n %} {% include 'filter_tags.html' %} +{% comment %} {% if perms.base.view_worktyperequest %} +
+ {% trans "Select All Worktypes" %} +
+ +{% endif %} +
+ {% trans "Export Worktypes" %} +
+ {% endcomment %} + +
+ {% for letter_list in letters %} +
+
+
+ +
+ + {{letter_list.list.paginator.count}} + + {{letter_list.grouper}} +
+
+
+
+
+
+
+
+
+ {% trans "Employee" %} +
+
+ {% trans "Title" %} +
+
+ {% trans "Planned To Leave" %} +
+
+ {% trans "Status" %} +
+
+ {% trans "Description" %} +
+
+ {% trans "Actions" %} +
+
+
+ {% for letter in letter_list.list %} +
+
+
+ {{letter.employee_id}} +
+
{{letter.title}}
+
+ {{letter.planned_to_leave_on}} +
+
+ {{letter.status}} +
+
+ {{letter.description|safe|truncatechars:30}} +
+
+
+ {% if perms.offboarding.change_resignationletter %} +
+ {% if letter.status != "approved" %} + + {% else %} + + {% endif %} + + + + + + + +
+ {% endif %} + +
+
+
+
+ {% endfor %} +
+
+
+ + {% trans "Page" %} {{ letter_list.list.number }} + {%trans "of" %} {{letter_list.list.paginator.num_pages }}. + + +
+
+
+
+ {% endfor %} +
+ + {% trans "Page" %} {{ letters.number }} {% trans "of" %} + {{letters.paginator.num_pages }}. + + +
+
+ +{% comment %} + + + + + {% endcomment %} diff --git a/offboarding/templates/offboarding/resignation/nav.html b/offboarding/templates/offboarding/resignation/nav.html index c3602bdb3..6ac129b7b 100644 --- a/offboarding/templates/offboarding/resignation/nav.html +++ b/offboarding/templates/offboarding/resignation/nav.html @@ -5,13 +5,79 @@
-
+
+ +
{% include 'offboarding/resignation/filter.html' %} - +
+ + +
@@ -30,6 +96,37 @@
-
+
+ + + + \ No newline at end of file diff --git a/offboarding/templates/offboarding/resignation/request_cards.html b/offboarding/templates/offboarding/resignation/request_cards.html index 17f2cee22..82a97589b 100644 --- a/offboarding/templates/offboarding/resignation/request_cards.html +++ b/offboarding/templates/offboarding/resignation/request_cards.html @@ -25,7 +25,7 @@
-
{{ record.status|capfirst }}
+
{{ record.status|capfirst }}
@@ -38,13 +38,13 @@ {% endif %} - {% if perms.offboarding.delete_resignationletter %} - diff --git a/offboarding/templates/offboarding/resignation/request_list.html b/offboarding/templates/offboarding/resignation/request_list.html new file mode 100644 index 000000000..0e9609e63 --- /dev/null +++ b/offboarding/templates/offboarding/resignation/request_list.html @@ -0,0 +1,338 @@ +{% load i18n %} {% load yes_no %} {% load static %} +{% include 'filter_tags.html' %} {% if messages %} +
+ {% for message in messages %} +
+
+ {{ message }} +
+
+ {% endfor %} +
+{% endif %} {% if letters %} + +
+
+
+ +
+
    +
    +
    +
    +
    + +
    + +
    +
    +
    +
    +
    + {% trans "Employee" %} +
    +
    + {% trans "Title" %} +
    +
    + {% trans "Planned To Leave" %} +
    +
    + {% trans "Status" %} +
    +
    + {% trans "Description" %} +
    +
    + {% trans "Actions" %} +
    +
    +
    + {% for letter in letters %} +
    +
    +
    + {{letter.employee_id}} +
    +
    {{letter.title}}
    +
    + {{letter.planned_to_leave_on}} +
    +
    + {{letter.status}} +
    +
    + {{letter.description|safe|truncatechars:30}} +
    +
    +
    + {% if perms.offboarding.change_resignationletter %} +
    + {% if letter.status != "approved" %} + + {% else %} + + {% endif %} + + + + + + + +
    + {% endif %} + +
    +
    +
    +
    + {% endfor %} +
    +
    + + + +
    + + {% trans "Page" %} {{ letters.number }} {% trans "of" %} + {{letters.paginator.num_pages }}. + + +
    + +
    +{% else %} + +
    + +
    {% trans "No search result found!" %}
    +
    + +{% endif %} + + diff --git a/offboarding/templates/offboarding/resignation/request_single_view.html b/offboarding/templates/offboarding/resignation/request_single_view.html new file mode 100644 index 000000000..6508dc0c6 --- /dev/null +++ b/offboarding/templates/offboarding/resignation/request_single_view.html @@ -0,0 +1,174 @@ +{% load i18n %} +{% if request.GET.requests_ids %} +
    + + + +
    +{% endif %} +
    +
    +
    +
    + {{ letter.status|capfirst }} +
    +
    +
    +
    + {% if perms.offboarding.change_resignationletter %} + + {% endif %} + + {% if perms.offboarding.delete_resignationletter %} + + + {% endif %} +
    +
    +
    +
    +
    +
    + +
    +
    + {{ letter.employee_id.get_full_name }} + + {{ letter.employee_id.get_department }} / + {{letter.employee_id.get_job_position }} + +
    +
    +
    +

    {{ letter.title }}

    +
    {{ letter.description|safe }}
    +
    + {% if perms.offboarding.change_resignationletter %} +
    + {% if letter.status != "approved" %} + + {% else %} + + {% endif %} + + + + + + + +
    + {% endif %} + +
    +
    + diff --git a/offboarding/templates/offboarding/resignation/requests_view.html b/offboarding/templates/offboarding/resignation/requests_view.html index 577f002f3..ce1e7ec8a 100644 --- a/offboarding/templates/offboarding/resignation/requests_view.html +++ b/offboarding/templates/offboarding/resignation/requests_view.html @@ -1,7 +1,7 @@ {% extends "index.html" %} {% block content %} {% include "offboarding/resignation/nav.html" %}
    - {% include "offboarding/resignation/request_cards.html" %} + {% if request.GET.view == 'list' %} + {% include "offboarding/resignation/request_list.html" %} + {% else %} + {% include "offboarding/resignation/request_cards.html" %} + {% endif %}
    {% endblock content %} \ No newline at end of file diff --git a/offboarding/views.py b/offboarding/views.py index b961a57de..f883c0885 100644 --- a/offboarding/views.py +++ b/offboarding/views.py @@ -1,21 +1,24 @@ import datetime +import json from urllib.parse import parse_qs from django.http import HttpResponse, JsonResponse from django.shortcuts import redirect, render from django.contrib import messages from django.contrib.auth.models import User from base.context_processors import intial_notice_period +from base.methods import closest_numbers, sortby from employee.models import Employee from horilla.decorators import login_required, manager_can_enter, permission_required from base.views import paginator_qry from offboarding.decorators import ( any_manager_can_enter, - check_feature_endabled, + check_feature_enabled, offboarding_manager_can_enter, offboarding_or_stage_manager_can_enter, ) from offboarding.filters import ( LetterFilter, + LetterReGroup, PipelineEmployeeFilter, PipelineFilter, PipelineStageFilter, @@ -45,6 +48,7 @@ from django.utils.translation import gettext_lazy as _ from onboarding.filters import OnboardingStageFilter from payroll.models.models import Contract +from attendance.methods.group_by import group_by_queryset as group_by from recruitment.pipeline_grouper import group_by_queryset @@ -597,7 +601,7 @@ def offboarding_individual_view(request, emp_id): @login_required @permission_required("offboarding.view_resignationletter") -@check_feature_endabled("resignation_request") +@check_feature_enabled("resignation_request") def request_view(request): """ This method is used to view the resignation request @@ -614,12 +618,34 @@ def request_view(request): "f": filter_instance, "filter_dict": {"status": ["Requested"]}, "offboardings": offboardings, + "gp_fields": LetterReGroup.fields, }, ) @login_required -@check_feature_endabled("resignation_request") +@permission_required("offboarding.view_resignationletter") +def request_single_view(request, id): + letter = ResignationLetter.objects.get(id=id) + context = { + "letter": letter, + } + requests_ids_json = request.GET.get("requests_ids") + if requests_ids_json: + requests_ids = json.loads(requests_ids_json) + previous_id, next_id = closest_numbers(requests_ids, id) + context["requests_ids"] = requests_ids_json + context["previous"] = previous_id + context["next"] = next_id + return render( + request, + "offboarding/resignation/request_single_view.html", + context, + ) + + +@login_required +@check_feature_enabled("resignation_request") def search_resignation_request(request): """ This method is used to search/filter the letter @@ -630,20 +656,50 @@ def search_resignation_request(request): letters = ResignationLetter.objects.filter( employee_id__employee_user_id=request.user ) + field = request.GET.get("field") data_dict = parse_qs(request.GET.urlencode()) + template = "offboarding/resignation/request_cards.html" + if request.GET.get("view") == "list": + template = "offboarding/resignation/request_list.html" + + if request.GET.get("sortby"): + letters = sortby(request, letters, "sortby") + data_dict.pop("sortby") + + if field != "" and field is not None: + letters = group_by(letters, field, request.GET.get("page"), "page") + list_values = [entry["list"] for entry in letters] + id_list = [] + for value in list_values: + for instance in value.object_list: + id_list.append(instance.id) + + requests_ids = json.dumps(list(id_list)) + template = "offboarding/resignation/group_by.html" + + else: + letters = paginator_qry(letters, request.GET.get("page")) + requests_ids = json.dumps([instance.id for instance in letters.object_list]) + + if request.GET.get("view"): + data_dict.pop("view") + + return render( request, - "offboarding/resignation/request_cards.html", + template, { - "letters": paginator_qry(letters, request.GET.get("page")), + "letters": letters, "filter_dict": data_dict, "pd": request.GET.urlencode(), + "requests_ids": requests_ids, + "field": field, }, ) @login_required -@check_feature_endabled("resignation_request") +@check_feature_enabled("resignation_request") @permission_required("offboarding.delete_resignationletter") def delete_resignation_request(request): """ @@ -656,7 +712,7 @@ def delete_resignation_request(request): @login_required -@check_feature_endabled("resignation_request") +@check_feature_enabled("resignation_request") def create_resignation_request(request): """ This method is used to render form to create resignation requests @@ -676,7 +732,7 @@ def create_resignation_request(request): @login_required -@check_feature_endabled("resignation_request") +@check_feature_enabled("resignation_request") @permission_required("offboarding.change_resignationletter") def update_status(request): """