From 7c6b30512b710a9a16b515e1ccaaa6901ca554ee Mon Sep 17 00:00:00 2001 From: Horilla Date: Sat, 9 Aug 2025 15:38:27 +0530 Subject: [PATCH] [UPDT] OFFBOARDING: Added kanban view for exit process --- offboarding/cbv/exit_process.py | 75 +++++++++++++++++-- offboarding/cbv/resignation.py | 11 +-- offboarding/models.py | 18 +++++ .../cbv/exit_process/pipeline_view.html | 51 ++++++++++++- offboarding/urls.py | 5 ++ 5 files changed, 148 insertions(+), 12 deletions(-) diff --git a/offboarding/cbv/exit_process.py b/offboarding/cbv/exit_process.py index a57b65041..5c02dd221 100644 --- a/offboarding/cbv/exit_process.py +++ b/offboarding/cbv/exit_process.py @@ -15,6 +15,7 @@ from django.utils.translation import gettext_lazy as _ from base.context_processors import intial_notice_period from base.methods import eval_validate from horilla_views.cbv_methods import login_required, permission_required +from horilla_views.generic.cbv.kanban import KanbanView from horilla_views.generic.cbv.pipeline import Pipeline from horilla_views.generic.cbv.views import ( HorillaDetailedView, @@ -267,10 +268,11 @@ class OffboardingPipelineNav(HorillaNavView): Offboarding Pipeline Navigation View """ - nav_title = "Pipeline" + nav_title = "Exit Process" search_swap_target = "#pipelineContainer" search_url = reverse_lazy("get-offboarding-tab") filter_body_template = "cbv/exit_process/pipeline_filter.html" + apply_first_filter = False def __init__(self, **kwargs): super().__init__(**kwargs) @@ -283,6 +285,25 @@ class OffboardingPipelineNav(HorillaNavView): data-target="#objectDetailsModal" """ + self.view_types = [ + { + "type": "list", + "icon": "list-outline", + "url": f'{reverse_lazy("get-offboarding-tab")}', + "attrs": f""" + title ='List' + """, + }, + { + "type": "card", + "icon": "grid-outline", + "url": f'{reverse_lazy("get-offboarding-tab")}?view=card', + "attrs": f""" + title ='Card' + """, + }, + ] + def get_context_data(self, **kwargs): context = super().get_context_data(**kwargs) @@ -299,18 +320,25 @@ class PipeLineTabView(HorillaTabView): Pipeline List View """ + filter_class = PipelineFilter + def __init__(self, **kwargs): super().__init__(**kwargs) - offboardings = PipelineFilter(self.request.GET).qs.filter(is_active=True) - + offboardings = self.filter_class(self.request.GET).qs.filter(is_active=True) + view_type = self.request.GET.get("view", "list") self.tabs = [] for offboarding in offboardings: tab = {} tab["actions"] = [] tab["title"] = offboarding.title - tab["url"] = reverse( - "get-offboarding-stage", kwargs={"offboarding_id": offboarding.pk} - ) + url = reverse("get-offboarding-kanban-stage", kwargs={"pk": offboarding.pk}) + if view_type == "list": + url = reverse( + "get-offboarding-stage", kwargs={"offboarding_id": offboarding.pk} + ) + + tab["url"] = url + tab["badge_label"] = _("Stages") if self.request.user.has_perm( "offboarding.add_offboardingstage" @@ -433,6 +461,41 @@ class OffboardingPipelineStage(Pipeline): return self.queryset +class OffboardingKanbanView(KanbanView): + """ + Offboarding Kanban View + """ + + model = OffboardingEmployee + filter_class = PipelineEmployeeFilter + group_key = "stage_id" + records_per_page = 10 + show_kanban_confirmation = False + + kanban_attrs = """ + hx-get='{get_individual_url}' + hx-target='#genericModalBody' + data-toggle = 'oh-modal-toggle' + data-target="#genericModal" + data-group-order='{ordered_group_json}' + """ + + details = { + "image_src": "{employee_id__get_avatar}", + "title": "{employee_id__get_full_name}", + "Notice period start": "{notice_period_starts}", + "Notice period end": "{notice_period_ends}", + } + + def get_related_groups(self, *args, **kwargs): + related_groups = super().get_related_groups(*args, **kwargs) + off_id = self.kwargs.get("pk") + if off_id: + related_groups = related_groups.filter(offboarding_id=off_id) + + return related_groups + + @method_decorator(login_required, name="dispatch") class OffboardingEmployeeList(HorillaListView): """ diff --git a/offboarding/cbv/resignation.py b/offboarding/cbv/resignation.py index 3a6f2fa23..3f60485a5 100644 --- a/offboarding/cbv/resignation.py +++ b/offboarding/cbv/resignation.py @@ -153,17 +153,18 @@ class ResinationLettersNav(HorillaNavView): super().__init__(**kwargs) self.search_url = reverse("list-resignation-request") self.create_attrs = f""" - hx-get="{reverse_lazy("resignation-requests-create")}" - hx-target="#genericModalBody" - data-target="#genericModal" - data-toggle="oh-modal-toggle" - """ + hx-get="{reverse_lazy("resignation-requests-create")}" + hx-target="#genericModalBody" + data-target="#genericModal" + data-toggle="oh-modal-toggle" + """ nav_title = _("Resignations") filter_instance = LetterFilter() filter_form_context_name = "form" filter_body_template = "cbv/resignation/filter.html" search_swap_target = "#listContainer" + apply_first_filter = False group_by_fields = [ ("employee_id", _("Employee")), diff --git a/offboarding/models.py b/offboarding/models.py index 2765978f5..62e239159 100644 --- a/offboarding/models.py +++ b/offboarding/models.py @@ -1,3 +1,4 @@ +import json from ast import literal_eval from collections.abc import Iterable from datetime import date, timedelta @@ -271,6 +272,23 @@ class OffboardingEmployee(HorillaModel): return value + def ordered_group_json(self): + """ + This method is used to get ordered group json + """ + Offboarding = self.stage_id.offboarding_id + offboarding_stages = Offboarding.offboardingstage_set.all().order_by("sequence") + ordered_group_json = json.dumps( + [ + { + "id": stage.id, + "stage": stage.title, + } + for stage in offboarding_stages + ] + ) + return ordered_group_json + class ResignationLetter(HorillaModel): """ diff --git a/offboarding/templates/cbv/exit_process/pipeline_view.html b/offboarding/templates/cbv/exit_process/pipeline_view.html index 0cbc77a8c..652607bbb 100644 --- a/offboarding/templates/cbv/exit_process/pipeline_view.html +++ b/offboarding/templates/cbv/exit_process/pipeline_view.html @@ -1,6 +1,55 @@ +{% extends "index.html" %} +{% block content %} {% load static i18n %} -{% include "generic/horilla_section.html" %} +{% for path in style_static_paths %} + +{% endfor %} +{% for path in script_static_paths %} + +{% endfor %} + + +{% include "generic/components.html" %} + + + +{% if nav_url %} +
+
+
+
+{% endif %} + +{% if view_url %} +
+
+
+
+{% endif %} + + +{% endblock content %} +
/", + exit_process.OffboardingKanbanView.as_view(), + name="get-offboarding-kanban-stage", + ), path( "get-offboarding-employees-cbv", exit_process.OffboardingEmployeeList.as_view(),