Files
ihrm/base/cbv/company.py

210 lines
6.5 KiB
Python

"""
this page is handling the cbv methods for company in settings
"""
from typing import Any
from django import forms
from django.contrib import messages
from django.http import HttpResponse
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 CompanyFilter
from base.forms import CompanyForm
from base.models import Company
from horilla_views.cbv_methods import login_required, permission_required
from horilla_views.forms import DynamicBulkUpdateForm
from horilla_views.generic.cbv.views import (
HorillaFormView,
HorillaListView,
HorillaNavView,
)
@method_decorator(login_required, name="dispatch")
@method_decorator(permission_required(perm="base.view_company"), name="dispatch")
class CompanyListView(HorillaListView):
"""
list view for company in settings
"""
def __init__(self, **kwargs: Any) -> None:
super().__init__(**kwargs)
self.search_url = reverse("company-list")
self.actions = []
if self.request.user.has_perm("base.change_company"):
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_company"):
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.company&pk={pk}"
data-toggle="oh-modal-toggle"
data-target="#deleteConfirmation"
hx-target="#deleteConfirmationBody"
""",
}
)
model = Company
filter_class = CompanyFilter
selected_instances_key_id = "selectedInstance"
bulk_update_fields = ["country", "state", "city", "zip"]
def get_bulk_form(self):
"""
Bulk from generating method
"""
form = DynamicBulkUpdateForm(
root_model=Company, bulk_update_fields=self.bulk_update_fields
)
form.fields["country"] = forms.ChoiceField(
widget=forms.Select(
attrs={
"class": "oh-select oh-select-2",
"required": True,
"style": "width: 100%; height:45px;",
}
)
)
form.fields["state"] = forms.ChoiceField(
widget=forms.Select(
attrs={
"class": "oh-select oh-select-2",
"required": True,
"style": "width: 100%; height:45px;",
}
)
)
return form
columns = [
(_("Company"), "company_icon_with_name"),
(_("Is Hq"), "hq"),
(_("Address"), "address"),
(_("Country"), "country"),
(_("State"), "state"),
(_("City"), "city"),
(_("Zip"), "zip"),
]
sortby_mapping = [
("Company", "company_icon_with_name"),
("Country", "country"),
("State", "state"),
("City", "city"),
("Zip", "zip"),
]
row_attrs = """
id="companyTr{get_delete_instance}"
"""
header_attrs = {
"company_icon_with_name": """ style="width:180px !important" """,
}
@method_decorator(login_required, name="dispatch")
@method_decorator(permission_required(perm="base.view_company"), name="dispatch")
class CompanyNavView(HorillaNavView):
"""
nav bar of the department view
"""
def __init__(self, **kwargs: Any) -> None:
super().__init__(**kwargs)
self.search_url = reverse("company-list")
if self.request.user.has_perm("base.add_company"):
self.create_attrs = f"""
onclick = "event.stopPropagation();"
data-toggle="oh-modal-toggle"
data-target="#genericModal"
hx-target="#genericModalBody"
hx-get="{reverse('company-create-form')}"
"""
nav_title = _("Company")
search_swap_target = "#listContainer"
filter_instance = CompanyFilter()
@method_decorator(login_required, name="dispatch")
@method_decorator(permission_required(perm="base.add_company"), name="dispatch")
class CompanyCreateForm(HorillaFormView):
"""
form view for creating and editing company in settings
"""
model = Company
form_class = CompanyForm
new_display_title = _("Create Company")
def get_form(self, form_class=None):
form = super().get_form(form_class)
if self.form.instance.pk:
self.form_class.verbose_name = _("Update Company")
form.fields["country"].widget = forms.Select(
attrs={
"class": "oh-select oh-select-2",
}
)
form.fields["state"].widget = forms.Select(
attrs={"class": "oh-select oh-select-2"}
)
return form
def form_invalid(self, form: Any) -> HttpResponse:
"""
Handles and renders form errors or defers to superclass.
"""
if self.form.instance.pk:
self.form_class.verbose_name = _("Update Company")
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: CompanyForm) -> HttpResponse:
if form.is_valid():
form.save()
if self.form.instance.pk:
messages.success(
self.request, _("Company have been successfully updated.")
)
else:
messages.success(
self.request, _("Company have been successfully created.")
)
return self.HttpResponse()
return super().form_valid(form)