diff --git a/leave/filters.py b/leave/filters.py index 27b976a84..fe893968e 100644 --- a/leave/filters.py +++ b/leave/filters.py @@ -131,12 +131,12 @@ class LeaveRequestFilter(FilterSet): search = django_filters.CharFilter(method="filter_by_name") from_date = DateFilter( - field_name="start_date", + field_name="end_date", lookup_expr="gte", widget=forms.DateInput(attrs={"type": "date"}), ) to_date = DateFilter( - field_name="end_date", + field_name="start_date", lookup_expr="lte", widget=forms.DateInput(attrs={"type": "date"}), ) @@ -376,12 +376,12 @@ class UserLeaveRequestFilter(FilterSet): field_name="leave_type_id__name", lookup_expr="icontains" ) from_date = DateFilter( - field_name="start_date", + field_name="end_date", lookup_expr="gte", widget=forms.DateInput(attrs={"type": "date"}), ) to_date = DateFilter( - field_name="end_date", + field_name="start_date", lookup_expr="lte", widget=forms.DateInput(attrs={"type": "date"}), ) diff --git a/leave/forms.py b/leave/forms.py index 69e7d3d08..b32807986 100644 --- a/leave/forms.py +++ b/leave/forms.py @@ -269,7 +269,11 @@ class LeaveRequestCreationForm(ModelForm): if leave_type_id.require_attachment == "yes": if attachment is None: raise forms.ValidationError( - _("An attachment is required for this leave request") + { + "attachment": _( + "An attachment is required for this leave request" + ) + } ) if not start_date <= end_date: raise forms.ValidationError( @@ -333,7 +337,9 @@ class LeaveRequestCreationForm(ModelForm): ) self.fields["employee_id"].widget.attrs.update( { - "onchange": "employeeChange($(this))", + "hx-target": "#id_leave_type_id", + "hx-trigger": "change", + "hx-get": "/leave/get-employee-leave-types", } ) self.fields["start_date"].widget.attrs.update( @@ -359,8 +365,8 @@ class LeaveRequestCreationForm(ModelForm): "start_date_breakdown", "end_date", "end_date_breakdown", - "description", "attachment", + "description", ] @@ -439,7 +445,9 @@ class LeaveRequestUpdationForm(ModelForm): ) self.fields["employee_id"].widget.attrs.update( { - "onchange": "employeeChange($(this))", + "hx-target": "#id_leave_type_id", + "hx-trigger": "change", + "hx-get": "/leave/get-employee-leave-types", } ) self.fields["start_date"].widget.attrs.update( @@ -465,8 +473,8 @@ class LeaveRequestUpdationForm(ModelForm): "start_date_breakdown", "end_date", "end_date_breakdown", - "description", "attachment", + "description", ] @@ -643,6 +651,21 @@ class UserLeaveRequestForm(ModelForm): overlapping_requests = LeaveRequest.objects.filter( employee_id=employee_id, start_date__lte=end_date, end_date__gte=start_date ).exclude(id=self.instance.id) + assigned_leave_types = AvailableLeave.objects.filter(employee_id=employee_id) + if not assigned_leave_types: + raise forms.ValidationError( + _("You dont have enough leave days to update the request.") + ) + if leave_type_id.require_attachment == "yes": + attachment = cleaned_data.get("attachment") + if attachment is None: + raise forms.ValidationError( + { + "attachment": _( + "An attachment is required for this leave request" + ) + } + ) if start_date == end_date: if start_date_breakdown != end_date_breakdown: raise forms.ValidationError( @@ -677,9 +700,17 @@ class UserLeaveRequestForm(ModelForm): raise forms.ValidationError(_("Employee doesn't have enough leave days..")) return cleaned_data - def __init__(self, *args, employee=None, **kwargs): + def __init__(self, *args, **kwargs): leave_type = kwargs.pop("initial", None) + employee = kwargs.pop("employee", None) super(UserLeaveRequestForm, self).__init__(*args, **kwargs) + + if employee: + available_leaves = employee.available_leave.all() + assigned_leave_types = LeaveType.objects.filter( + id__in=available_leaves.values_list("leave_type_id", flat=True) + ) + self.fields["leave_type_id"].queryset = assigned_leave_types if leave_type: self.fields["leave_type_id"].queryset = LeaveType.objects.filter( id=leave_type["leave_type_id"].id @@ -708,8 +739,8 @@ class UserLeaveRequestForm(ModelForm): "start_date_breakdown", "end_date", "end_date_breakdown", - "description", "attachment", + "description", ] widgets = { "employee_id": forms.HiddenInput(), @@ -832,13 +863,20 @@ class UserLeaveRequestCreationForm(ModelForm): return table_html def __init__(self, *args, **kwargs): - + employee = kwargs.pop("employee", None) super().__init__(*args, **kwargs) + if employee: + available_leaves = employee.available_leave.all() + assigned_leave_types = LeaveType.objects.filter( + id__in=available_leaves.values_list("leave_type_id", flat=True) + ) + self.fields["leave_type_id"].queryset = assigned_leave_types self.fields["leave_type_id"].widget.attrs.update( { "onchange": "typeChange($(this))", } ) + self.fields["employee_id"].initial = employee def clean(self): cleaned_data = super().clean() @@ -855,6 +893,16 @@ class UserLeaveRequestCreationForm(ModelForm): raise forms.ValidationError( _("End date should not be less than start date.") ) + if leave_type_id.require_attachment == "yes": + attachment = cleaned_data.get("attachment") + if attachment is None: + raise forms.ValidationError( + { + "attachment": _( + "An attachment is required for this leave request" + ) + } + ) if start_date == end_date: if start_date_breakdown != end_date_breakdown: raise forms.ValidationError( @@ -899,8 +947,8 @@ class UserLeaveRequestCreationForm(ModelForm): "start_date_breakdown", "end_date", "end_date_breakdown", - "description", "attachment", + "description", "requested_days", ] widgets = { @@ -1200,4 +1248,3 @@ class RestrictLeaveForm(ModelForm): def __init__(self, *args, **kwargs): super(RestrictLeaveForm, self).__init__(*args, **kwargs) self.fields["title"].widget.attrs["autocomplete"] = "title" - diff --git a/leave/templates/leave/leave_request/group_by.html b/leave/templates/leave/leave_request/group_by.html index 60038015a..3c64830d5 100644 --- a/leave/templates/leave/leave_request/group_by.html +++ b/leave/templates/leave/leave_request/group_by.html @@ -140,8 +140,8 @@ {% endif %} + data-target="#objectUpdateModal" hx-get="{% url 'request-update' leave_request.id %}" + hx-target="#objectUpdateModalTarget"> {% endif %} {% if request.user|is_reportingmanager or perms.attendance.delete_leaverequest %} {% endif %}
- {% trans "Leave Request Create" %}{% trans "Leave Request" %}
@@ -34,7 +33,15 @@ hx-post="{% url 'request-creation' %}?{{pd}}" hx-encoding="multipart/form-data" hx-target="#objectCreateModalTarget" - > + > {{form.as_p}} + diff --git a/leave/templates/leave/leave_request/leave_type_field.html b/leave/templates/leave/leave_request/leave_type_field.html new file mode 100644 index 000000000..ec8b1dc1d --- /dev/null +++ b/leave/templates/leave/leave_request/leave_type_field.html @@ -0,0 +1,8 @@ +{% load i18n %} + +{{form.leave_type_id}} diff --git a/leave/templates/leave/leave_request/request_update_form.html b/leave/templates/leave/leave_request/request_update_form.html index 258f66dba..8cd71420d 100644 --- a/leave/templates/leave/leave_request/request_update_form.html +++ b/leave/templates/leave/leave_request/request_update_form.html @@ -1,20 +1,26 @@ {% load i18n %} -{% if form.errors %} - -
-
- - {% for error in form.non_field_errors %} -
- {{ error }} -
- {% endfor %} -
+
+

+ {% trans "Leave Request" %} +

+
-{% endif %} - - -
- {% csrf_token %} - {{form.as_p}} -
\ No newline at end of file +
+
+ {% csrf_token %} {{form.as_p}} +
+
+ diff --git a/leave/templates/leave/leave_request/request_view.html b/leave/templates/leave/leave_request/request_view.html index 40ce4db3c..59d1c5da0 100644 --- a/leave/templates/leave/leave_request/request_view.html +++ b/leave/templates/leave/leave_request/request_view.html @@ -239,28 +239,6 @@
- - - -
diff --git a/leave/urls.py b/leave/urls.py index a1b792890..8690f2a45 100644 --- a/leave/urls.py +++ b/leave/urls.py @@ -21,6 +21,7 @@ urlpatterns = [ path("type-delete/", views.leave_type_delete, name="type-delete"), path("type-filter", views.leave_type_filter, name="type-filter"), path("request-creation", views.leave_request_creation, name="request-creation"), + path("get-employee-leave-types", views.get_employee_leave_types, name="get-employee-leave-types"), path( "leave-request-creation//", views.leave_request_creation, diff --git a/leave/views.py b/leave/views.py index 486ebb928..8346fd569 100644 --- a/leave/views.py +++ b/leave/views.py @@ -266,6 +266,29 @@ def leave_type_delete(request, id): return redirect(leave_type_view) +@login_required +@hx_request_required +@manager_can_enter("leave.add_leaverequest") +def get_employee_leave_types(request): + if request.GET.get("employee_id"): + employee = Employee.objects.get(id=request.GET.get("employee_id")) + available_leaves = employee.available_leave.all() + assigned_leave_types = LeaveType.objects.filter( + id__in=available_leaves.values_list("leave_type_id", flat=True) + ) + form = LeaveRequestCreationForm() + form.fields["leave_type_id"].queryset = assigned_leave_types + leave_type_field_html = render_to_string( + "leave/leave_request/leave_type_field.html", + { + "form": form, + "field_name": "leave_type_id", + "field": form.fields["leave_type_id"], + }, + ) + return HttpResponse(f"{leave_type_field_html}") + + @login_required @hx_request_required @manager_can_enter("leave.add_leaverequest") @@ -285,6 +308,14 @@ def leave_request_creation(request, type_id=None, emp_id=None): ] previous_data = unquote(request.GET.urlencode())[len("pd=") :] form = LeaveRequestCreationForm() + if request: + employee = request.user.employee_get + if employee: + available_leaves = employee.available_leave.all() + assigned_leave_types = LeaveType.objects.filter( + id__in=available_leaves.values_list("leave_type_id", flat=True) + ) + form.fields["leave_type_id"].queryset = assigned_leave_types if type_id and emp_id: initial_data = { "leave_type_id": type_id, @@ -496,7 +527,19 @@ def leave_request_update(request, id): POST : return leave request view """ leave_request = LeaveRequest.objects.get(id=id) + leave_type_id = leave_request.leave_type_id + employee = leave_request.employee_id form = LeaveRequestUpdationForm(instance=leave_request) + if employee: + available_leaves = employee.available_leave.all() + assigned_leave_types = LeaveType.objects.filter( + id__in=available_leaves.values_list("leave_type_id", flat=True) + ) + if leave_type_id not in assigned_leave_types.values_list("id", flat=True): + assigned_leave_types = assigned_leave_types | LeaveType.objects.filter( + id=leave_type_id.id + ) + form.fields["leave_type_id"].queryset = assigned_leave_types form = choosesubordinates(request, form, "leave.add_leaverequest") if request.method == "POST": form = LeaveRequestUpdationForm( @@ -1893,10 +1936,9 @@ def user_leave_request(request, id): initial={"employee_id": employee, "leave_type_id": leave_type} ) if request.method == "POST": - form = UserLeaveRequestForm(request.POST, request.FILES) + form = UserLeaveRequestForm(request.POST, request.FILES, employee=employee) start_date = datetime.strptime(request.POST.get("start_date"), "%Y-%m-%d") end_date = datetime.strptime(request.POST.get("end_date"), "%Y-%m-%d") - attachment = request.FILES.get("attachment") start_date_breakdown = request.POST.get("start_date_breakdown") end_date_breakdown = request.POST.get("end_date_breakdown") available_leave = AvailableLeave.objects.get( @@ -1914,11 +1956,6 @@ def user_leave_request(request, id): holiday_dates = holiday_dates_list(holidays) company_leaves = CompanyLeave.objects.all() company_leave_dates = company_leave_dates_list(company_leaves, start_date) - if leave_type.require_attachment == "yes": - if attachment is None: - form.add_error( - None, _("An attachment is required for this leave request") - ) if ( leave_type.exclude_company_leave == "yes" and leave_type.exclude_holiday == "yes" @@ -2009,6 +2046,7 @@ def user_leave_request(request, id): form.add_error( None, _("You dont have enough leave days to make the request..") ) + form.fields["leave_type_id"].queryset = LeaveType.objects.filter(id=id) return render( request, "leave/user_leave/user_request_form.html", @@ -2037,10 +2075,15 @@ def user_request_update(request, id): request.user.employee_get == leave_request.employee_id and leave_request.status != "approved" ): - form = UserLeaveRequestForm(instance=leave_request) + form = UserLeaveRequestForm( + employee=leave_request.employee_id, instance=leave_request + ) if request.method == "POST": form = UserLeaveRequestForm( - request.POST, request.FILES, instance=leave_request + request.POST, + request.FILES, + instance=leave_request, + employee=leave_request.employee_id, ) if form.is_valid(): leave_request = form.save(commit=False) @@ -2110,6 +2153,11 @@ def user_request_update(request, id): return HttpResponse("") except Exception as e: messages.error(request, _("User has no leave request..")) + return render( + request, + "leave/user_leave/user_request_update.html", + {"form": form, "id": id, "pd": previous_data}, + ) @login_required @@ -2806,35 +2854,15 @@ def leave_request_create(request): POST : return leave request view """ previous_data = unquote(request.GET.urlencode())[len("pd=") :] - employee = request.user.employee_get - emp_id = employee.id - emp = Employee.objects.get(id=emp_id) - leave = emp.available_leave.all() - - leave_type = [] - for i in leave: - a = i.leave_type_id - leave_type.append(a) - - leave_ids = [leave.id for leave in leave_type] - q_object = Q(id__in=leave_ids) - queryset = LeaveType.objects.filter(q_object) - - form = UserLeaveRequestCreationForm(initial={"employee_id": emp}) - form.fields["leave_type_id"].queryset = queryset + emp = request.user.employee_get + emp_id = emp.id + form = UserLeaveRequestCreationForm(employee=emp) if request.method == "POST": - form = UserLeaveRequestCreationForm(request.POST, request.FILES) + form = UserLeaveRequestCreationForm(request.POST, request.FILES, employee=emp) if int(form.data["employee_id"]) == int(emp_id): if form.is_valid(): leave_request = form.save(commit=False) - attachment = leave_request.attachment save = True - if leave_request.leave_type_id.require_attachment == "yes": - if not attachment: - save = False - form.add_error( - None, _("An attachment is required for this leave request") - ) if leave_request.leave_type_id.require_approval == "no": employee_id = leave_request.employee_id leave_type_id = leave_request.leave_type_id @@ -2885,7 +2913,7 @@ def leave_request_create(request): request, leave_request, type="request" ) mail_thread.start() - form = UserLeaveRequestCreationForm(initial={"employee_id": emp}) + form = UserLeaveRequestCreationForm(employee=emp) if len(LeaveRequest.objects.filter(employee_id=emp_id)) == 1: return HttpResponse( ""