Files
ihrm/base/cbv/department.py
2025-04-07 10:20:47 +05:30

166 lines
5.6 KiB
Python

"""
this page is handling the cbv methods for department in settings
"""
from typing import Any
from django.contrib import messages
from django.http import HttpResponse
from django.middleware.csrf import get_token
from django.shortcuts import render
from django.urls import reverse
from django.utils.decorators import method_decorator
from django.utils.translation import gettext_lazy as _
from base.filters import DepartmentViewFilter
from base.forms import DepartmentForm
from base.models import Department
from horilla.horilla_middlewares import _thread_locals
from horilla_views.cbv_methods import login_required, permission_required
from horilla_views.generic.cbv.views import (
HorillaFormView,
HorillaListView,
HorillaNavView,
)
@method_decorator(login_required, name="dispatch")
@method_decorator(permission_required(perm="base.view_department"), name="dispatch")
class DepartmentListView(HorillaListView):
"""
list view for department in settings
"""
model = Department
filter_class = DepartmentViewFilter
def __init__(self, **kwargs: Any) -> None:
super().__init__(**kwargs)
self.search_url = reverse("department-list")
self.actions = []
if self.request.user.has_perm("base.change_department"):
self.actions.append(
{
"action": _("Edit"),
"icon": "create-outline",
"attrs": """
class="oh-btn oh-btn--light-bkg w-100"
hx-get='{get_update_url}?instance_ids={ordered_ids}'
hx-target="#genericModalBody"
data-toggle="oh-modal-toggle"
data-target="#genericModal"
""",
}
)
if self.request.user.has_perm("base.delete_department"):
self.actions.append(
{
"action": _("Delete"),
"icon": "trash-outline",
"attrs": """
class="oh-btn oh-btn--danger-outline oh-btn--light-bkg w-100"
hx-get="{get_delete_url}?model=base.Department&pk={pk}"
data-toggle="oh-modal-toggle"
data-target="#deleteConfirmation"
hx-target="#deleteConfirmationBody"
""",
}
)
# <button
# class="oh-btn oh-btn--danger-outline oh-btn--light-bkg w-100"
# title="{% trans 'Remove' %}"
# hx-get="{% url 'generic-delete' %}?model=base.Department&pk={{dep.id}}"
# data-toggle="oh-modal-toggle"
# data-target="#deleteConfirmation"
# hx-target="#deleteConfirmationBody"
# >
# <ion-icon name="trash-outline"></ion-icon>
# </button>
row_attrs = """
id="departmentTr{get_delete_instance}"
"""
columns = [
(_("Department"), "department"),
]
sortby_mapping = [
(_("Department"), "department"),
]
header_attrs = {
"department": """ style="width:300px !important" """,
"action": """ style="width:180px !important" """,
}
records_per_page = 7
@method_decorator(login_required, name="dispatch")
@method_decorator(permission_required(perm="base.view_department"), name="dispatch")
class DepartmentNavView(HorillaNavView):
"""
nav bar of the department view
"""
def __init__(self, **kwargs: Any) -> None:
super().__init__(**kwargs)
self.search_url = reverse("department-list")
if self.request.user.has_perm("base.add_department"):
self.create_attrs = f"""
onclick = "event.stopPropagation();"
data-toggle="oh-modal-toggle"
data-target="#genericModal"
hx-target="#genericModalBody"
hx-get="{reverse('settings-department-creation')}"
"""
nav_title = _("Department")
search_swap_target = "#listContainer"
filter_instance = DepartmentViewFilter()
@method_decorator(login_required, name="dispatch")
@method_decorator(permission_required(perm="base.add_department"), name="dispatch")
class DepartmentCreateForm(HorillaFormView):
"""
form view for creating and editing departments in settings
"""
model = Department
form_class = DepartmentForm
new_display_title = _("Create Department")
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
form = self.form_class()
if self.form.instance.pk:
form = self.form_class(instance=self.form.instance)
self.form_class.verbose_name = _("Update Department")
context[form] = form
return context
def form_invalid(self, form: Any) -> HttpResponse:
if self.form.instance.pk:
self.form_class.verbose_name = _("Update Department")
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: DepartmentForm) -> HttpResponse:
if form.is_valid():
if form.instance.pk:
messages.success(self.request, _("Department updated"))
else:
messages.success(
self.request, _("Department has been created successfully!")
)
form.save()
return self.HttpResponse()
return super().form_valid(form)