From ad2afcb9169360ebabee3b72fed94b1cc9fca1a2 Mon Sep 17 00:00:00 2001 From: Horilla Date: Thu, 26 Sep 2024 15:07:54 +0530 Subject: [PATCH] [UPDT] LEAVE : Leave clash updation by excluding the cancelled or rejected leaves --- leave/models.py | 35 +++++++++------ .../leave/leave_request/leave_clashes.html | 14 ++++++ leave/views.py | 43 ++++++++++++------- 3 files changed, 65 insertions(+), 27 deletions(-) diff --git a/leave/models.py b/leave/models.py index d26ee540d..746b5a634 100644 --- a/leave/models.py +++ b/leave/models.py @@ -680,10 +680,14 @@ class LeaveRequest(HorillaModel): else: self.exclude_leaves() - self.leave_clashes_count = self.count_leave_clashes() + if self.status in ["cancelled", "rejected"]: + self.leave_clashes_count = 0 + else: + self.leave_clashes_count = self.count_leave_clashes() + + super().save(*args, **kwargs) self.update_leave_clashes_count() - super().save(*args, **kwargs) work_info = EmployeeWorkInformation.objects.filter(employee_id=self.employee_id) department_id = None conditions = None @@ -898,7 +902,9 @@ class LeaveRequest(HorillaModel): """ Update the leave clashes count for all leave requests. """ - leave_requests_to_update = LeaveRequest.objects.all().exclude(id=self.id) + leave_requests_to_update = LeaveRequest.objects.exclude( + Q(id=self.id) | Q(status="cancelled") | Q(status="rejected") + ) for leave_request in leave_requests_to_update: leave_request.leave_clashes_count = leave_request.count_leave_clashes() @@ -914,17 +920,22 @@ class LeaveRequest(HorillaModel): with other employees' requested dates. """ work_info = EmployeeWorkInformation.objects.filter(employee_id=self.employee_id) - if work_info.exists(): - overlapping_requests = LeaveRequest.objects.exclude(id=self.id).filter( - Q( - employee_id__employee_work_info__department_id=self.employee_id.employee_work_info.department_id + if work_info.exists() and self.status not in ["cancelled", "rejected"]: + overlapping_requests = ( + LeaveRequest.objects.exclude(id=self.id) + .filter( + Q( + employee_id__employee_work_info__department_id=self.employee_id.employee_work_info.department_id + ) + | Q( + employee_id__employee_work_info__job_position_id=self.employee_id.employee_work_info.job_position_id + ), + start_date__lte=self.end_date, + end_date__gte=self.start_date, ) - | Q( - employee_id__employee_work_info__job_position_id=self.employee_id.employee_work_info.job_position_id - ), - start_date__lte=self.end_date, - end_date__gte=self.start_date, + .exclude(Q(status="cancelled") | Q(status="rejected")) ) + return overlapping_requests.count() return 0 diff --git a/leave/templates/leave/leave_request/leave_clashes.html b/leave/templates/leave/leave_request/leave_clashes.html index 24ff17403..251841aab 100644 --- a/leave/templates/leave/leave_request/leave_clashes.html +++ b/leave/templates/leave/leave_request/leave_clashes.html @@ -97,6 +97,20 @@ {% endfor %} +{% elif leave_request.status == 'rejected' or leave_request.status == 'cancelled' %} +
+
+ Page not found. 404. +
+ {% trans "No clashed requestes available for cancelled or rejected leaves." %} +
+
+
{% else %}
diff --git a/leave/views.py b/leave/views.py index aa3216d0e..ffe4ce642 100644 --- a/leave/views.py +++ b/leave/views.py @@ -1029,6 +1029,8 @@ def leave_request_cancel(request, id, emp_id=None): leave_request.approved_available_days = 0 leave_request.approved_carryforward_days = 0 leave_request.status = "rejected" + leave_request.leave_clashes_count = 0 + if leave_request.multiple_approvals() and not request.user.is_superuser: conditional_requests = leave_request.multiple_approvals() approver = [ @@ -4141,24 +4143,34 @@ def view_clashes(request, leave_request_id): This method is used to filter or view the leave clashes """ record = get_object_or_404(LeaveRequest, id=leave_request_id) - overlapping_requests = LeaveRequest.objects.filter( - Q( + + if record.status == "rejected" or record.status == "cancelled": + overlapping_requests = LeaveRequest.objects.none() + clashed_due_to_department = LeaveRequest.objects.none() + clashed_due_to_job_position = LeaveRequest.objects.none() + else: + overlapping_requests = ( + LeaveRequest.objects.filter( + Q( + employee_id__employee_work_info__department_id=record.employee_id.employee_work_info.department_id + ) + | Q( + employee_id__employee_work_info__job_position_id=record.employee_id.employee_work_info.job_position_id + ), + start_date__lte=record.end_date, + end_date__gte=record.start_date, + ) + .exclude(id=leave_request_id) + .exclude(Q(status="cancelled") | Q(status="rejected")) + ) + + clashed_due_to_department = overlapping_requests.filter( employee_id__employee_work_info__department_id=record.employee_id.employee_work_info.department_id ) - | Q( + + clashed_due_to_job_position = overlapping_requests.filter( employee_id__employee_work_info__job_position_id=record.employee_id.employee_work_info.job_position_id - ), - start_date__lte=record.end_date, - end_date__gte=record.start_date, - ).exclude(id=leave_request_id) - - clashed_due_to_department = overlapping_requests.filter( - employee_id__employee_work_info__department_id=record.employee_id.employee_work_info.department_id - ) - - clashed_due_to_job_position = overlapping_requests.filter( - employee_id__employee_work_info__job_position_id=record.employee_id.employee_work_info.job_position_id - ) + ) leave_request_filter = LeaveRequestFilter(request.GET, overlapping_requests).qs leave_request_filter = paginator_qry(leave_request_filter, request.GET.get("page")) @@ -4171,6 +4183,7 @@ def view_clashes(request, leave_request_id): request, "leave/leave_request/leave_clashes.html", { + "leave_request": record, "records": overlapping_requests, "current_date": date.today(), "requests_ids": requests_ids,