From 67b1b8abcb00a2381c6450d8d929fe8d9ee73bfd Mon Sep 17 00:00:00 2001 From: Horilla Date: Wed, 2 Apr 2025 14:30:50 +0530 Subject: [PATCH] [UPDT] LEAVE: Refactor forms with Horilla label craft --- leave/forms.py | 134 +++--------------- leave/models.py | 29 ++-- .../leave_allocation_request_create.html | 38 +++-- .../leave_assign/available_update_form.html | 100 ++++++------- .../leave_request/leave_request_form.html | 49 +++---- .../leave/restrict/restrict_form.html | 35 ++--- .../leave/restrict/restrict_update_form.html | 18 +-- .../leave/user_leave/user_request_form.html | 2 +- 8 files changed, 150 insertions(+), 255 deletions(-) diff --git a/leave/forms.py b/leave/forms.py index f8001969b..3607cc42f 100644 --- a/leave/forms.py +++ b/leave/forms.py @@ -13,11 +13,11 @@ from django import forms from django.apps import apps from django.core.exceptions import ValidationError from django.db.models import Q -from django.forms import ModelForm from django.forms.widgets import TextInput from django.template.loader import render_to_string from django.utils.translation import gettext_lazy as _ +from base.forms import ModelForm as BaseModelForm from base.methods import filtersubordinatesemployeemodel, reload_queryset from base.models import CompanyLeaves, Holidays from employee.filters import EmployeeFilter @@ -49,67 +49,6 @@ CHOICES = [("yes", _("Yes")), ("no", _("No"))] LEAVE_MAX_LIMIT = 1e5 -class ModelForm(forms.ModelForm): - """ - Customized ModelForm class with additional functionality for field customization - based on the type of widget and setting initial values based on the current request. - """ - - def __init__(self, *args, **kwargs): - """ - Initializes the ModelForm instance. - - This method customizes field attributes such as CSS classes and placeholders - based on the type of widget. It also sets initial values for specific fields - based on the current request, particularly for 'employee_id' and 'company_id' fields. - """ - super().__init__(*args, **kwargs) - request = getattr(horilla_middlewares._thread_locals, "request", None) - reload_queryset(self.fields) - for field_name, field in self.fields.items(): - widget = field.widget - - if isinstance(widget, (forms.DateInput)): - field.widget.attrs.update({"class": "oh-input oh-calendar-input w-100"}) - field.initial = date.today() - elif isinstance( - widget, (forms.NumberInput, forms.EmailInput, forms.TextInput) - ): - field.widget.attrs.update( - {"class": "oh-input w-100", "placeholder": field.label} - ) - elif isinstance(widget, (forms.Select,)): - field.widget.attrs.update( - {"class": "oh-select oh-select-2 select2-hidden-accessible"} - ) - elif isinstance(widget, (forms.Textarea)): - field.widget.attrs.update( - { - "class": "oh-input w-100", - "placeholder": field.label, - "rows": 2, - "cols": 40, - } - ) - elif isinstance( - widget, - ( - forms.CheckboxInput, - forms.CheckboxSelectMultiple, - ), - ): - field.widget.attrs.update({"class": "oh-switch__checkbox"}) - try: - self.fields["employee_id"].initial = request.user.employee_get - except: - pass - - try: - self.fields["company_id"].initial = request.user.employee_get.get_company - except: - pass - - class ConditionForm(forms.ModelForm): def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) @@ -170,7 +109,7 @@ class LeaveTypeForm(ConditionForm): filter_template_path="employee_filters.html", required=False, ), - label="Employee", + label=_("Employee"), ) class Meta: @@ -305,7 +244,6 @@ def leaveoverlaping( ) if len(overlapping_requests) == 1: existing_leave = overlapping_requests.first() - print("existing_leave =", existing_leave) if ( existing_leave.start_date == start_date @@ -318,7 +256,7 @@ def leaveoverlaping( return overlapping_requests -class LeaveRequestCreationForm(ModelForm): +class LeaveRequestCreationForm(BaseModelForm): start_date = forms.DateField(widget=forms.DateInput(attrs={"type": "date"})) end_date = forms.DateField(widget=forms.DateInput(attrs={"type": "date"})) @@ -458,7 +396,7 @@ class LeaveRequestCreationForm(ModelForm): ] -class LeaveRequestUpdationForm(ModelForm): +class LeaveRequestUpdationForm(BaseModelForm): start_date = forms.DateField(widget=forms.DateInput(attrs={"type": "date"})) end_date = forms.DateField(widget=forms.DateInput(attrs={"type": "date"})) @@ -587,7 +525,7 @@ class LeaveRequestUpdationForm(ModelForm): ] -class AvailableLeaveForm(ModelForm): +class AvailableLeaveForm(BaseModelForm): """ Form for managing available leave data. @@ -651,7 +589,7 @@ class LeaveOneAssignForm(HorillaModelForm): reload_queryset(self.fields) -class AvailableLeaveUpdateForm(ModelForm): +class AvailableLeaveUpdateForm(BaseModelForm): """ Form for updating available leave data. @@ -673,31 +611,7 @@ class AvailableLeaveUpdateForm(ModelForm): fields = ["available_days", "carryforward_days", "is_active"] -class CompanyLeaveForm(ModelForm): - """ - Form for managing company leave data. - - This form allows users to manage company leave data by including all fields from - the CompanyLeaves model except for is_active. - - Attributes: - - Meta: Inner class defining metadata options. - - model: The model associated with the form (CompanyLeaves). - - fields: A special value indicating all fields should be included in the form. - - exclude: A list of fields to exclude from the form (is_active). - """ - - class Meta: - """ - Meta class for additional options - """ - - model = CompanyLeaves - fields = "__all__" - exclude = ["is_active"] - - -class UserLeaveRequestForm(ModelForm): +class UserLeaveRequestForm(BaseModelForm): start_date = forms.DateField(widget=forms.DateInput(attrs={"type": "date"})) end_date = forms.DateField(widget=forms.DateInput(attrs={"type": "date"})) description = forms.CharField(label=_("Description"), widget=forms.Textarea) @@ -878,7 +792,7 @@ class RejectForm(forms.Form): fields = ["reject_reason"] -class UserLeaveRequestCreationForm(ModelForm): +class UserLeaveRequestCreationForm(BaseModelForm): start_date = forms.DateField(widget=forms.DateInput(attrs={"type": "date"})) end_date = forms.DateField(widget=forms.DateInput(attrs={"type": "date"})) @@ -990,7 +904,7 @@ class UserLeaveRequestCreationForm(ModelForm): } -class LeaveAllocationRequestForm(ModelForm): +class LeaveAllocationRequestForm(BaseModelForm): """ Form for creating a leave allocation request. @@ -1131,7 +1045,7 @@ class AssignLeaveForm(HorillaForm): self.fields["leave_type_id"].label = "Leave Type" -class LeaverequestcommentForm(ModelForm): +class LeaverequestcommentForm(BaseModelForm): """ LeaverequestComment form """ @@ -1145,7 +1059,7 @@ class LeaverequestcommentForm(ModelForm): fields = ("comment",) -class LeaveCommentForm(ModelForm): +class LeaveCommentForm(BaseModelForm): """ Leave request comment model form """ @@ -1193,7 +1107,7 @@ class LeaveCommentForm(ModelForm): return instance, files -class LeaveallocationrequestcommentForm(ModelForm): +class LeaveallocationrequestcommentForm(BaseModelForm): """ Leave Allocation Requestcomment form """ @@ -1207,7 +1121,7 @@ class LeaveallocationrequestcommentForm(ModelForm): fields = ("comment",) -class LeaveAllocationCommentForm(ModelForm): +class LeaveAllocationCommentForm(BaseModelForm): """ Leave request comment model form """ @@ -1253,14 +1167,7 @@ class LeaveAllocationCommentForm(ModelForm): return instance, files -class RestrictLeaveForm(ModelForm): - start_date = forms.DateField( - widget=forms.DateInput(attrs={"type": "date"}), - ) - end_date = forms.DateField( - widget=forms.DateInput(attrs={"type": "date"}), - ) - +class RestrictLeaveForm(BaseModelForm): def clean_end_date(self): start_date = self.cleaned_data.get("start_date") end_date = self.cleaned_data.get("end_date") @@ -1276,13 +1183,16 @@ class RestrictLeaveForm(ModelForm): model = RestrictLeave fields = "__all__" exclude = ["is_active"] - labels = { - "title": _("Title"), - } def __init__(self, *args, **kwargs): super(RestrictLeaveForm, self).__init__(*args, **kwargs) self.fields["title"].widget.attrs["autocomplete"] = "title" + self.fields["start_date"].widget = forms.DateInput( + attrs={"type": "date", "class": "oh-input w-100"} + ) + self.fields["end_date"].widget = forms.DateInput( + attrs={"type": "date", "class": "oh-input w-100"} + ) self.fields["department"].widget.attrs.update( { "hx-include": "#leaveRestrictForm", @@ -1296,7 +1206,7 @@ class RestrictLeaveForm(ModelForm): if apps.is_installed("attendance"): from .models import CompensatoryLeaveRequest, CompensatoryLeaverequestComment - class CompensatoryLeaveForm(ModelForm): + class CompensatoryLeaveForm(BaseModelForm): """ Form for creating a leave allocation request. @@ -1417,7 +1327,7 @@ if apps.is_installed("attendance"): model = CompensatoryLeaveRequest fields = ["reject_reason"] - class CompensatoryLeaveRequestcommentForm(ModelForm): + class CompensatoryLeaveRequestcommentForm(BaseModelForm): """ LeaverequestComment form """ diff --git a/leave/models.py b/leave/models.py index 737fb9428..cab12841e 100644 --- a/leave/models.py +++ b/leave/models.py @@ -592,6 +592,8 @@ class LeaveRequest(HorillaModel): class Meta: ordering = ["-id"] + verbose_name = "Leave Request" + verbose_name_plural = "Leave Requests" def tracking(self): return get_diff(self) @@ -1004,16 +1006,21 @@ class LeaverequestComment(HorillaModel): class LeaveAllocationRequest(HorillaModel): leave_type_id = models.ForeignKey( - LeaveType, on_delete=models.PROTECT, verbose_name="Leave type" + LeaveType, on_delete=models.PROTECT, verbose_name=_("Leave type") ) employee_id = models.ForeignKey( - Employee, on_delete=models.CASCADE, verbose_name="Employee" + Employee, on_delete=models.CASCADE, verbose_name=_("Employee") + ) + requested_days = models.FloatField( + blank=True, null=True, verbose_name=_("Requested days") ) - requested_days = models.FloatField(blank=True, null=True) requested_date = models.DateField(default=timezone.now) - description = models.TextField(max_length=255) + description = models.TextField(max_length=255, verbose_name=_("Description")) attachment = models.FileField( - null=True, blank=True, upload_to="leave/leave_attachment" + null=True, + blank=True, + upload_to="leave/leave_attachment", + verbose_name=_("Attachment"), ) status = models.CharField( max_length=30, choices=LEAVE_ALLOCATION_STATUS, default="requested" @@ -1031,6 +1038,8 @@ class LeaveAllocationRequest(HorillaModel): class Meta: ordering = ["-id"] + verbose_name = _("Leave Allocation Request") + verbose_name_plural = _("Leave Allocation Requests") def __str__(self): return f"{self.employee_id}| {self.leave_type_id}| {self.id}" @@ -1084,7 +1093,7 @@ class LeaveRequestConditionApproval(models.Model): class RestrictLeave(HorillaModel): - title = models.CharField(max_length=200) + title = models.CharField(max_length=200, verbose_name=_("Title")) start_date = models.DateField(verbose_name=_("Start Date")) end_date = models.DateField(verbose_name=_("End Date")) department = models.ForeignKey( @@ -1099,18 +1108,20 @@ class RestrictLeave(HorillaModel): ), ) include_all = models.BooleanField( - default=True, help_text=_("Enable to select all Leave types.") + default=True, + help_text=_("Enable to select all Leave types."), + verbose_name=_("Include All"), ) spesific_leave_types = models.ManyToManyField( LeaveType, - verbose_name=_("Spesific leave types"), + verbose_name=_("Specific Leave Types"), related_name="spesific_leave_type", blank=True, help_text=_("Choose specific leave types to restrict."), ) exclued_leave_types = models.ManyToManyField( LeaveType, - verbose_name=_("Exclude leave types"), + verbose_name=_("Exclude Leave Types"), related_name="excluded_leave_type", blank=True, help_text=_("Choose leave types to exclude from restriction."), diff --git a/leave/templates/leave/leave_allocation_request/leave_allocation_request_create.html b/leave/templates/leave/leave_allocation_request/leave_allocation_request_create.html index d851ec698..795875a15 100644 --- a/leave/templates/leave/leave_allocation_request/leave_allocation_request_create.html +++ b/leave/templates/leave/leave_allocation_request/leave_allocation_request_create.html @@ -1,28 +1,24 @@ {% load i18n %} {% if form.errors %} - -
-
- {% for error in form.non_field_errors %} -
{{ error }}
- {% endfor %} -
-
+
+
+ {% for error in form.non_field_errors %} +
{{ error }}
+ {% endfor %} +
+
{% endif %}
-

- {% trans "Create Leave Allocation Request" %} -

- +

+ {% trans "Create" %} {{form.verbose_name}} +

+
-
- {% csrf_token %} {{form.as_p}} -
+
+ {% csrf_token %} {{form.as_p}} +
diff --git a/leave/templates/leave/leave_assign/available_update_form.html b/leave/templates/leave/leave_assign/available_update_form.html index f9418ef03..a1f5ada97 100644 --- a/leave/templates/leave/leave_assign/available_update_form.html +++ b/leave/templates/leave/leave_assign/available_update_form.html @@ -1,61 +1,51 @@ -{% load i18n %} {% if messages %} -
- {% for message in messages %} -
-
- {{ message }} +{% load i18n %} +{% if messages %} +
+ {% for message in messages %} +
+
+ {{ message }} +
+
+ {% endfor %} + +
+{% endif %} +{% if form.errors %} +
+
+ {% for error in form.non_field_errors %} +
{{ error }}
+ {% endfor %} +
-
- {% endfor %} - -
-{% endif %} {% if form.errors %} - -
-
- {% for error in form.non_field_errors %} -
{{ error }}
- {% endfor %} -
-
{% endif %}
- {% trans "Update Available Leave" %} - + {% trans "Update Available Leave" %} +
-
-
- - {{form.available_days}} {{form.available_days.errors}} -
-
- - {{form.carryforward_days}} {{form.carryforward_days.errors}} -
- -
+
+
+ + {{form.available_days}} {{form.available_days.errors}} +
+
+ + {{form.carryforward_days}} {{form.carryforward_days.errors}} +
+ +
diff --git a/leave/templates/leave/leave_request/leave_request_form.html b/leave/templates/leave/leave_request/leave_request_form.html index 4b4d9f947..4d215c5bc 100644 --- a/leave/templates/leave/leave_request/leave_request_form.html +++ b/leave/templates/leave/leave_request/leave_request_form.html @@ -15,28 +15,15 @@
{% endif %}
- {% trans "Leave Request" %} -
-
+ {{form.as_p}}
@@ -54,12 +41,12 @@ {% endif %}
- {% trans "Create Restricted Day" %} + {% trans "Create Restricted Day" %}
- + {{form.title}} {{form.title.errors}}
- + {{form.start_date}} {{form.start_date.errors}}
- + {{form.end_date}} {{form.end_date.errors}}
@@ -43,7 +43,7 @@
- + {{form.department}} {{form.department.errors}}
@@ -56,7 +56,7 @@
-