from django.shortcuts import render, redirect from horilla.decorators import login_required, hx_request_required from .forms import * from .models import * from django.http import JsonResponse, HttpResponse from employee.models import Employee from .filters import * from django.contrib import messages from django.db.models import Q from datetime import datetime, timedelta, date from django.utils import timezone from base.models import * import random from django.core.paginator import Paginator from django.db.models.functions import TruncYear from horilla.decorators import permission_required from horilla.decorators import manager_can_enter from base.methods import filtersubordinates, choosesubordinates from django.utils.translation import gettext_lazy as _ from notifications.signals import notify @login_required @permission_required("leave.add_leavetype") def leave_type_creation(request): """ function used to create leave type. Parameters: request (HttpRequest): The HTTP request object. Returns: GET : return leave type creation template POST : return leave view """ form = LeaveTypeForm() if request.method == "POST": form = LeaveTypeForm(request.POST, request.FILES) if form.is_valid(): form.save() messages.success(request, _("New leave type Created..")) return redirect(leave_type_view) return render(request, "leave/leave-type-creation.html", {"form": form}) def paginator_qry(qryset, page_number): """ function used to paginate query set """ paginator = Paginator(qryset, 25) qryset = paginator.get_page(page_number) return qryset @login_required @permission_required("leave.view_leavetype") def leave_type_view(request): """ function used to view leave type. Parameters: request (HttpRequest): The HTTP request object. Returns: GET : return leave type template """ queryset = LeaveType.objects.all() page_number = request.GET.get("page") page_obj = paginator_qry(queryset, page_number) previous_data = request.environ["QUERY_STRING"] leave_type_filter = LeaveTypeFilter() return render( request, "leave/leave-type-view.html", {"leave_types": page_obj, "form": leave_type_filter.form, "pd": previous_data}, ) @login_required @hx_request_required @permission_required("leave.view_leavetype") def leave_type_filter(request): """ function used to filter view leave type. Parameters: request (HttpRequest): The HTTP request object. Returns: GET : return leave types template """ queryset = LeaveType.objects.all() page_number = request.GET.get("page") leave_type_filter = LeaveTypeFilter(request.GET, queryset).qs page_obj = paginator_qry(leave_type_filter, page_number) previous_data = request.environ["QUERY_STRING"] return render( request, "leave/leave_type/leave_types.html", {"leave_types": page_obj, "pd": previous_data}, ) @login_required @permission_required("leave.update_leavetype") def leave_type_update(request, id): """ function used to update leave type. Parameters: request (HttpRequest): The HTTP request object. id : leave type id Returns: GET : return leave type update template POST : return leave type view """ leave_type = LeaveType.objects.get(id=id) form = UpdateLeaveTypeForm(instance=leave_type) if request.method == "POST": form_data = UpdateLeaveTypeForm( request.POST, request.FILES, instance=leave_type ) if form_data.is_valid(): form_data.save() messages.info(request, _("Leave type is updated successfully..")) return redirect(leave_type_view) return render(request, "leave/leave-type-update.html", {"form": form}) @login_required @permission_required("leave.delete_leavetype") def leave_type_delete(request, id): """ function used to delete leave type. Parameters: request (HttpRequest): The HTTP request object. id : leave type id Returns: GET : return leave type view template """ LeaveType.objects.get(id=id).delete() messages.error(request, _("Leave type deleted successfully..")) return redirect(leave_type_view) @login_required @hx_request_required @manager_can_enter('leave.add_leaverequest') def leave_request_creation(request): """ function used to create leave request. Parameters: request (HttpRequest): The HTTP request object. Returns: GET : return leave request form template POST : return leave request view """ form = LeaveRequestCreationForm() form = choosesubordinates(request, form, 'leave.add_leaverequest') if request.method == 'POST': form = LeaveRequestCreationForm(request.POST, request.FILES) form = choosesubordinates(request, form, 'leave.add_leaverequest') if form.is_valid(): leave_request = form.save() if leave_request.leave_type_id.require_approval == "no": employee_id = leave_request.employee_id leave_type_id = leave_request.leave_type_id available_leave = AvailableLeave.objects.get( leave_type_id=leave_type_id, employee_id=employee_id) if leave_request.requested_days > available_leave.available_days: leave = leave_request.requested_days - available_leave.available_days leave_request.approved_available_days = available_leave.available_days available_leave.available_days = 0 available_leave.carryforward_days = available_leave.carryforward_days - leave leave_request.approved_carryforward_days = leave else: available_leave.available_days = available_leave.available_days - \ leave_request.requested_days leave_request.approved_available_days = leave_request.requested_days leave_request.status = "approved" available_leave.save() leave_request.save() messages.success(request, _( 'Leave request created successfully..')) notify.send( request.user.employee_get, recipient=leave_request.employee_id.employee_work_info.reporting_manager_id.employee_user_id, verb=f"New leave request created for {leave_request.employee_id}.", icon="people-circle", redirect="/leave/request-view", ) response = render( request, 'leave/leave-request-form.html', {'form': form}) return HttpResponse(response.content.decode('utf-8') + '') return render(request, 'leave/leave-request-form.html', {'form': form}) @login_required @manager_can_enter("leave.view_leaverequest") def leave_request_view(request): """ function used to view leave request. Parameters: request (HttpRequest): The HTTP request object. Returns: GET : return leave request view template """ queryset = LeaveRequest.objects.all() queryset = filtersubordinates(request, queryset, "leave.view_leaverequest") page_number = request.GET.get("page") page_obj = paginator_qry(queryset, page_number) leave_request_filter = LeaveRequestFilter() requests = queryset.filter(status="requested").count() approved_requests = queryset.filter(status="approved").count() rejected_requests = queryset.filter(status="cancelled").count() previous_data = request.environ["QUERY_STRING"] return render( request, "leave/request-view.html", { "leave_requests": page_obj, "pd": previous_data, "form": leave_request_filter.form, "requests": requests, "approved_requests": approved_requests, "rejected_requests": rejected_requests, }, ) @login_required @hx_request_required @manager_can_enter("leave.view_leaverequest") def leave_request_filter(request): """ function used to filter leave request. Parameters: request (HttpRequest): The HTTP request object. Returns: GET : return leave request view template """ previous_data = request.environ["QUERY_STRING"] queryset = LeaveRequest.objects.all() queryset = filtersubordinates(request, queryset, "leave.view_leaverequest") leave_request_filter = LeaveRequestFilter(request.GET, queryset).qs page_number = request.GET.get("page") page_obj = paginator_qry(leave_request_filter, page_number) return render( request, "leave/leave_request/leave-requests.html", {"leave_requests": page_obj, "pd": previous_data}, ) @login_required @hx_request_required @manager_can_enter("leave.update_leaverequest") def leave_request_update(request, id): """ function used to update leave request. Parameters: request (HttpRequest): The HTTP request object. id : leave request id Returns: GET : return leave request update template POST : return leave request view """ leave_request = LeaveRequest.objects.get(id=id) form = LeaveRequestUpdationForm(instance=leave_request) form = choosesubordinates(request, form, "leave.add_leaverequest") if request.method == "POST": form = LeaveRequestUpdationForm( request.POST, request.FILES, instance=leave_request ) form = choosesubordinates(request, form, "leave.add_leaverequest") if form.is_valid(): leave_request = form.save() messages.info(request, _( "Leave request is updated successfully..")) notify.send( request.user.employee_get, recipient=leave_request.employee_id.employee_work_info.reporting_manager_id.employee_user_id, verb=f"Leave request updated for {leave_request.employee_id}.", icon="people-circle", redirect="/leave/request-view", ) response = render( request, "leave/request-update-form.html", { "form": form, "id": id} ) return HttpResponse( response.content.decode("utf-8") + "" ) return render(request, "leave/request-update-form.html", {"form": form, "id": id}) @login_required @manager_can_enter("leave.delete_leaverequest") def leave_request_delete(request, id): """ function used to delete leave request. Parameters: request (HttpRequest): The HTTP request object. id : leave request id Returns: GET : return leave request view template """ LeaveRequest.objects.get(id=id).delete() messages.success(request, _("Leave request deleted successfully..")) return redirect(leave_request_view) @login_required @manager_can_enter("leave.update_leaverequest") def leave_request_approve(request, id): """ function used to approve a leave request. Parameters: request (HttpRequest): The HTTP request object. id : leave request id Returns: GET : return leave request view template """ leave_request = LeaveRequest.objects.get(id=id) employee_id = leave_request.employee_id leave_type_id = leave_request.leave_type_id available_leave = AvailableLeave.objects.get( leave_type_id=leave_type_id, employee_id=employee_id ) if leave_request.requested_days > available_leave.available_days: leave = leave_request.requested_days - available_leave.available_days leave_request.approved_available_days = available_leave.available_days available_leave.available_days = 0 available_leave.carryforward_days = available_leave.carryforward_days - leave leave_request.approved_carryforward_days = leave else: available_leave.available_days = ( available_leave.available_days - leave_request.requested_days ) leave_request.approved_available_days = leave_request.requested_days leave_request.status = "approved" available_leave.save() leave_request.save() messages.success(request, _("Leave request approved successfully..")) notify.send( request.user.employee_get, recipient=leave_request.employee_id.employee_user_id, verb="Your Leave request has been approved", icon="people-circle", redirect="/leave/user-request-view", ) return redirect(leave_request_view) @login_required @manager_can_enter("leave.update_leaverequest") def leave_request_cancel(request, id): """ function used to cancel leave request. Parameters: request (HttpRequest): The HTTP request object. id : leave request id Returns: GET : return leave request view template """ leave_request = LeaveRequest.objects.get(id=id) employee_id = leave_request.employee_id leave_type_id = leave_request.leave_type_id available_leave = AvailableLeave.objects.get( leave_type_id=leave_type_id, employee_id=employee_id ) available_leave.available_days += leave_request.approved_available_days available_leave.carryforward_days += leave_request.approved_carryforward_days leave_request.approved_available_days = 0 leave_request.approved_carryforward_days = 0 leave_request.status = "cancelled" leave_request.save() available_leave.save() messages.success(request, _("Leave request cancelled successfully..")) notify.send( request.user.employee_get, recipient=leave_request.employee_id.employee_user_id, verb="Your Leave request has been cancelled", icon="people-circle", redirect="/leave/user-request-view", ) return redirect(leave_request_view) @login_required @manager_can_enter("leave.view_leaverequest") def one_request_view(request, id): """ function used to view one leave request. Parameters: request (HttpRequest): The HTTP request object. Returns: GET : return one leave request view template """ leave_request = LeaveRequest.objects.get(id=id) return render( request, "leave/one-request-view.html", { "leave_request": leave_request} ) @login_required @hx_request_required @manager_can_enter("leave.add_availableleave") def leave_assign_one(request, id): """ function used to assign leave type to employees. Parameters: request (HttpRequest): The HTTP request object. id : leave type id Returns: GET : return leave type assign form template POST : return leave type assigned view """ form = LeaveOneAssignForm() form = choosesubordinates(request, form, "leave.add_availableleave") if request.method == "POST": leave_type = LeaveType.objects.get(id=id) employee_ids = request.POST.getlist("employee_id") for employee_id in employee_ids: employee = Employee.objects.get(id=employee_id) if not AvailableLeave.objects.filter( leave_type_id=leave_type, employee_id=employee ).exists(): AvailableLeave( leave_type_id=leave_type, employee_id=employee, available_days=leave_type.total_days, ).save() messages.success(request, _( "Leave type assign is successfull..")) notify.send( request.user.employee_get, recipient=employee.employee_user_id, verb="New leave type is assigned to you", icon="people-circle", redirect="/leave/user-leave", ) else: messages.info( request, _( "leave type is already assigned to the employee..") ) response = render( request, "leave/leave-assign-one-form.html", { "form": form, "id": id} ) return HttpResponse( response.content.decode("utf-8") + "" ) return render(request, "leave/leave-assign-one-form.html", {"form": form, "id": id}) @login_required @manager_can_enter("leave.view_availableleave") def leave_assign_view(request): """ function used to view assigned employee leaves. Parameters: request (HttpRequest): The HTTP request object. Returns: GET : return leave assigned view template """ queryset = AvailableLeave.objects.all() queryset = filtersubordinates( request, queryset, "leave.view_availableleave") previous_data = request.environ["QUERY_STRING"] page_number = request.GET.get("page") page_obj = paginator_qry(queryset, page_number) assigned_leave_filter = AssignedLeavefilter() return render( request, "leave/assign-view.html", { "available_leaves": page_obj, "form": assigned_leave_filter.form, "pd": previous_data, }, ) @login_required @hx_request_required @manager_can_enter("leave.view_availableleave") def leave_assign_filter(request): """ function used to filter assign leave type to employees. Parameters: request (HttpRequest): The HTTP request object. Returns: GET : return leave type assigned view template """ queryset = AvailableLeave.objects.all() queryset = filtersubordinates( request, queryset, "leave.view_availableleave") assigned_leave_filter = AssignedLeavefilter(request.GET, queryset).qs previous_data = request.environ["QUERY_STRING"] page_number = request.GET.get("page") page_obj = paginator_qry(assigned_leave_filter, page_number) return render( request, "leave/leave_assign/assigned-leave.html", {"available_leaves": page_obj, "pd": previous_data}, ) # Function to assign the created leave type to employee @login_required @hx_request_required @manager_can_enter("leave.add_availableleave") def leave_assign(request): """ function used to assign multiple leave types to employees. Parameters: request (HttpRequest): The HTTP request object. Returns: GET : return multiple leave type assign form template POST : return leave type assigned view """ form = AvailableLeaveForm() form = choosesubordinates(request, form, "leave.add_availableleave") if request.method == "POST": leave_type_ids = request.POST.getlist("leave_type_id") employee_ids = request.POST.getlist("employee_id") for employee_id in employee_ids: if employee_id != "": for leave_type_id in leave_type_ids: if leave_type_id != "": employee = Employee.objects.get(id=employee_id) leave_type = LeaveType.objects.get(id=leave_type_id) if not AvailableLeave.objects.filter( leave_type_id=leave_type, employee_id=employee ).exists(): AvailableLeave( leave_type_id=leave_type, employee_id=employee, available_days=leave_type.total_days, ).save() messages.success( request, _( "Leave type assign is successfull..") ) notify.send( request.user.employee_get, recipient=employee.employee_user_id, verb="New leave type is assigned to you", icon="people-circle", redirect="/leave/user-leave", ) else: messages.info( request, _("Leave type is already assigned to the employee.."), ) response = render( request, "leave/leave-assign-form.html", {"form": form, "id": id} ) return HttpResponse( response.content.decode("utf-8") + "" ) return render(request, "leave/leave-assign-form.html", {"form": form}) @login_required @hx_request_required @manager_can_enter("leave.update_availableleave") def available_leave_update(request, id): """ function used to update available leave of an assigned leave type of an employee. Parameters: request (HttpRequest): The HTTP request object. id : available leave id Returns: GET : return available leave update form template POST : return leave type assigned view """ leave_assign = AvailableLeave.objects.get(id=id) form = AvailableLeaveUpdateForm(instance=leave_assign) if request.method == "POST": form = AvailableLeaveUpdateForm(request.POST, instance=leave_assign) if form.is_valid(): available_leave = form.save() messages.info(request, _( "Available leaves updated successfully...")) notify.send( request.user.employee_get, recipient=available_leave.employee_id.employee_user_id, verb=f"Your {available_leave.leave_type_id} leave type updated.", icon="people-circle", redirect="/leave/user-leave", ) response = render( request, "leave/available-update-form.html", { "form": form, "id": id} ) return HttpResponse( response.content.decode("utf-8") + "" ) return render(request, "leave/available-update-form.html", {"form": form, "id": id}) @login_required @manager_can_enter("leave.delete_availableleave") def leave_assign_delete(request, id): """ function used to delete assign leave type of an employee. Parameters: request (HttpRequest): The HTTP request object. id : available leave id Returns: GET : return leave type assigned view template """ AvailableLeave.objects.get(id=id).delete() messages.error(request, _("Assigned leave is successfully deleted..")) return redirect(leave_assign_view) @login_required @hx_request_required @permission_required("leave.add_holiday") def holiday_creation(request): """ function used to create holidays. Parameters: request (HttpRequest): The HTTP request object. Returns: GET : return holiday creation form template POST : return holiday view template """ form = HolidayForm() if request.method == "POST": form = HolidayForm(request.POST) if form.is_valid(): form.save() messages.success(request, _("New holiday created successfully..")) response = render( request, "leave/holiday-form.html", {"form": form}) return HttpResponse( response.content.decode("utf-8") + "" ) return render(request, "leave/holiday-form.html", {"form": form}) @login_required @permission_required("leave.view_holiday") def holiday_view(request): """ function used to view holidays. Parameters: request (HttpRequest): The HTTP request object. Returns: GET : return holiday view template """ queryset = Holiday.objects.all() previous_data = request.environ["QUERY_STRING"] page_number = request.GET.get("page") page_obj = paginator_qry(queryset, page_number) holiday_filter = HolidayFilter() return render( request, "leave/holiday-view.html", {"holidays": page_obj, "form": holiday_filter.form, "pd": previous_data}, ) @login_required @hx_request_required @permission_required("leave.view_holiday") def holiday_filter(request): """ function used to filter holidays. Parameters: request (HttpRequest): The HTTP request object. Returns: GET : return holiday view template """ queryset = Holiday.objects.all() previous_data = request.environ["QUERY_STRING"] holiday_filter = HolidayFilter(request.GET, queryset).qs page_number = request.GET.get("page") page_obj = paginator_qry(holiday_filter, page_number) return render( request, "leave/holiday/holiday.html", {"holidays": page_obj, "pd": previous_data}, ) @login_required @hx_request_required @permission_required("leave.update_holiday") def holiday_update(request, id): """ function used to update holiday. Parameters: request (HttpRequest): The HTTP request object. id : holiday id Returns: GET : return holiday update form template POST : return holiday view template """ holiday = Holiday.objects.get(id=id) form = HolidayForm(instance=holiday) if request.method == "POST": form = HolidayForm(request.POST, instance=holiday) if form.is_valid(): form.save() messages.info(request, _("Holiday updated successfully..")) response = render( request, "leave/holiday-update-form.html", { "form": form, "id": id} ) return HttpResponse( response.content.decode("utf-8") + "" ) return render(request, "leave/holiday-update-form.html", {"form": form, "id": id}) @login_required @permission_required("leave.delete_holiday") def holiday_delete(request, id): """ function used to delete holiday. Parameters: request (HttpRequest): The HTTP request object. id : holiday id Returns: GET : return holiday view template """ Holiday.objects.get(id=id).delete() messages.success(request, _("Holiday deleted successfully..")) return redirect(holiday_view) @login_required @hx_request_required @permission_required("leave.add_companyleave") def company_leave_creation(request): """ function used to create company leave. Parameters: request (HttpRequest): The HTTP request object. Returns: GET : return company leave creation form template POST : return company leave view template """ form = CompanyLeaveForm() if request.method == "POST": form = CompanyLeaveForm(request.POST) if form.is_valid(): form.save() messages.success(request, _( "New company leave created successfully..")) response = render( request, "leave/company-leave-creation-form.html", { "form": form} ) return HttpResponse( response.content.decode("utf-8") + "" ) return render(request, "leave/company-leave-creation-form.html", {"form": form}) @login_required @permission_required("leave.view_companyleave") def company_leave_view(request): """ function used to view company leave. Parameters: request (HttpRequest): The HTTP request object. Returns: GET : return company leave view template """ queryset = CompanyLeave.objects.all() previous_data = request.environ["QUERY_STRING"] page_number = request.GET.get("page") page_obj = paginator_qry(queryset, page_number) company_leave_filter = CompanyLeavefilter() return render( request, "leave/company-leave-view.html", { "company_leaves": page_obj, "weeks": WEEKS, "week_days": WEEK_DAYS, "form": company_leave_filter.form, "pd": previous_data, }, ) @login_required @hx_request_required @permission_required("leave.view_companyleave") def company_leave_filter(request): """ function used to filter company leave. Parameters: request (HttpRequest): The HTTP request object. Returns: GET : return company leave view template """ print(request.GET) queryset = CompanyLeave.objects.all() previous_data = request.environ["QUERY_STRING"] page_number = request.GET.get("page") print('queryset', queryset) company_leave_filter = CompanyLeavefilter(request.GET, queryset).qs print('company_leave_filter', company_leave_filter) page_obj = paginator_qry(company_leave_filter, page_number) return render( request, "leave/company_leave/company-leave.html", { "company_leaves": page_obj, "weeks": WEEKS, "week_days": WEEK_DAYS, "pd": previous_data, }, ) @login_required @hx_request_required @permission_required("leave.update_companyleave") def company_leave_update(request, id): """ function used to update company leave. Parameters: request (HttpRequest): The HTTP request object. id : company leave id Returns: GET : return company leave update form template POST : return company leave view template """ company_leave = CompanyLeave.objects.get(id=id) form = CompanyLeaveForm(instance=company_leave) if request.method == "POST": form = CompanyLeaveForm(request.POST, instance=company_leave) if form.is_valid(): form.save() messages.info(request, _("Company leave updated successfully..")) response = render( request, "leave/company-leave-update-form.html", {"form": form, "id": id}, ) return HttpResponse( response.content.decode("utf-8") + "" ) return render( request, "leave/company-leave-update-form.html", { "form": form, "id": id} ) @login_required @permission_required("leave.delete_companyleave") def company_leave_delete(request, id): """ function used to create company leave. Parameters: request (HttpRequest): The HTTP request object. Returns: GET : return company leave creation form template POST : return company leave view template """ CompanyLeave.objects.get(id=id).delete() messages.success(request, _("Company leave deleted successfully..")) return redirect(company_leave_view) @login_required @hx_request_required def user_leave_request(request, id): """ function used to create user leave request. Parameters: request (HttpRequest): The HTTP request object. id : leave type id Returns: GET : return user leave request creation form template POST : user my leave view template """ employee = request.user.employee_get form = UserLeaveRequestForm(employee=employee) if request.method == 'POST': form = UserLeaveRequestForm(request.POST, request.FILES) start_date = datetime.strptime( request.POST.get('start_date'), "%Y-%m-%d") end_date = datetime.strptime(request.POST.get('end_date'), "%Y-%m-%d") requested_days = (end_date - start_date).days + 1 leave_type = LeaveType.objects.get(id=id) available_leave = AvailableLeave.objects.get( employee_id=employee, leave_type_id=leave_type) available_total_leave = available_leave.available_days + \ available_leave.carryforward_days overlapping_requests = LeaveRequest.objects.filter(employee_id=employee, start_date__lte=end_date, end_date__gte=start_date ) if overlapping_requests.exists(): form.add_error( None, _("There is already a leave request for this date range..")) elif requested_days <= available_total_leave: if form.is_valid(): leave_request = form.save(commit=False) leave_request.leave_type_id = leave_type leave_request.employee_id = employee leave_request.save() if leave_request.leave_type_id.require_approval == "no": employee_id = leave_request.employee_id leave_type_id = leave_request.leave_type_id available_leave = AvailableLeave.objects.get( leave_type_id=leave_type_id, employee_id=employee_id) if leave_request.requested_days > available_leave.available_days: leave = leave_request.requested_days - available_leave.available_days leave_request.approved_available_days = available_leave.available_days available_leave.available_days = 0 available_leave.carryforward_days = available_leave.carryforward_days - leave leave_request.approved_carryforward_days = leave else: available_leave.available_days = available_leave.available_days - \ leave_request.requested_days leave_request.approved_available_days = leave_request.requested_days leave_request.status = "approved" available_leave.save() leave_request.save() messages.success(request, _( 'Leave request created successfully..')) notify.send( request.user.employee_get, recipient=leave_request.employee_id.employee_work_info.reporting_manager_id.employee_user_id, verb="You have a new leave request to validate.", icon="people-circle", redirect="/leave/user-request-view", ) response = render( request, 'leave/user-request-form.html', {'form': form, 'id': id}) return HttpResponse(response.content.decode('utf-8') + '') else: form.add_error( None, _('You dont have enough leave days to make the request..')) return render(request, 'leave/user-request-form.html', {'form': form, 'id': id}) @login_required @hx_request_required def user_request_update(request, id): """ function used to update user leave request. Parameters: request (HttpRequest): The HTTP request object. id : leave request id Returns: GET : return user leave request update form template POST : return user leave request view template """ leave_request = LeaveRequest.objects.get(id=id) form = UserLeaveRequestForm(instance=leave_request) if request.method == "POST": form = UserLeaveRequestForm( request.POST, request.FILES, instance=leave_request) if form.is_valid(): form.save() messages.info(request, _("Leave request updated successfully..")) response = render( request, "leave/user-request-update.html", { "form": form, "id": id} ) return HttpResponse( response.content.decode("utf-8") + "" ) return render(request, "leave/user-request-update.html", {"form": form, "id": id}) @login_required def user_request_delete(request, id): """ function used to delete user leave request. Parameters: request (HttpRequest): The HTTP request object. id : leave request id Returns: GET : return user leave request view template """ LeaveRequest.objects.get(id=id).delete() messages.success(request, _("Leave request deleted successfully..")) return redirect(user_request_view) @login_required def user_leave_view(request): """ function used to view user assigned leave types. Parameters: request (HttpRequest): The HTTP request object. Returns: GET : return user assigned leave types view template """ try: employee = request.user.employee_get queryset = employee.available_leave.all() previous_data = request.environ["QUERY_STRING"] page_number = request.GET.get("page") page_obj = paginator_qry(queryset, page_number) assigned_leave_filter = AssignedLeavefilter() return render( request, "leave/user-leave-view.html", { "user_leaves": page_obj, "form": assigned_leave_filter.form, "pd": previous_data, }, ) except Exception: return HttpResponse("User is not an employee") @login_required @hx_request_required def user_leave_filter(request): """ function used to filter user assigned leave types. Parameters: request (HttpRequest): The HTTP request object. Returns: GET : return user assigned leave types view template """ employee = request.user.employee_get queryset = employee.available_leave.all() previous_data = request.environ["QUERY_STRING"] page_number = request.GET.get("page") assigned_leave_filter = AssignedLeavefilter(request.GET, queryset).qs page_obj = paginator_qry(assigned_leave_filter, page_number) return render( request, "leave/user_leave/user-leave.html", {"user_leaves": page_obj, "pd": previous_data}, ) @login_required def user_request_view(request): """ function used to view user leave request. Parameters: request (HttpRequest): The HTTP request object. Returns: GET : return user leave request view template """ user = request.user.employee_get queryset = user.leaverequest_set.all() previous_data = request.environ["QUERY_STRING"] page_number = request.GET.get("page") page_obj = paginator_qry(queryset, page_number) user_request_filter = userLeaveRequestFilter() return render( request, "leave/user-request-view.html", { "leave_requests": page_obj, "form": user_request_filter.form, "pd": previous_data, }, ) @login_required @hx_request_required def user_request_filter(request): """ function used to filter user leave request. Parameters: request (HttpRequest): The HTTP request object. Returns: GET : return user leave request view template """ user = request.user.employee_get queryset = user.leaverequest_set.all() previous_data = request.environ["QUERY_STRING"] page_number = request.GET.get("page") user_request_filter = userLeaveRequestFilter(request.GET, queryset).qs page_obj = paginator_qry(user_request_filter, page_number) return render( request, "leave/user-requests.html", {"leave_requests": page_obj, "pd": previous_data}, ) @login_required def user_request_one(request, id): """ function used to view one user leave request. Parameters: request (HttpRequest): The HTTP request object. Returns: GET : return one user leave request view template """ leave_request = LeaveRequest.objects.get(id=id) return render( request, "leave/user-request-one.html", { "leave_request": leave_request} ) @login_required def employee_leave(request): """ function used to view employees are leave today. Parameters: request (HttpRequest): The HTTP request object. Returns: GET : return Json response of employee """ today = date.today() employees = [] leave_requests = LeaveRequest.objects.filter( Q(start_date__lte=today) & Q(end_date__gte=today) & Q(status="approved") ) for leave_request in leave_requests: if leave_request.employee_id.__str__() not in employees: employees.append(leave_request.employee_id.__str__()) return JsonResponse({"employees": employees}) @login_required def overall_leave(request): """ function used to view overall leave in the company. Parameters: request (HttpRequest): The HTTP request object. Returns: GET : return Json response of labels, data """ selected = request.GET.get("selected") labels = [] data = [] departments = Department.objects.all() today = date.today() today_leave_requests = LeaveRequest.objects.filter( Q(start_date__lte=today) & Q(end_date__gte=today) & Q(status="approved") ) start_of_week = today - timedelta(days=today.weekday()) end_of_week = start_of_week + timedelta(days=6) weekly_leave_requests = LeaveRequest.objects.filter( status="approved", start_date__lte=end_of_week, end_date__gte=start_of_week ) start_of_month = today.replace(day=1) end_of_month = start_of_month.replace(day=28) + timedelta(days=4) if end_of_month.month != today.month: end_of_month = end_of_month - timedelta(days=end_of_month.day) monthly_leave_requests = LeaveRequest.objects.filter( status="approved", start_date__lte=end_of_month, end_date__gte=start_of_month ) start_of_year = today.replace(month=1, day=1) end_of_year = today.replace(month=12, day=31) yearly_leave_requests = ( LeaveRequest.objects.filter( status="approved", start_date__lte=end_of_year, end_date__gte=start_of_year ) .annotate(year=TruncYear("start_date")) .filter(year=start_of_year) ) if selected == "month": leave_requests = monthly_leave_requests elif selected == "week": leave_requests = weekly_leave_requests elif selected == "year": leave_requests = yearly_leave_requests else: leave_requests = today_leave_requests employees = [leave_request.employee_id for leave_request in leave_requests] for department in departments: labels.append(department.department) count = sum( employee.employee_work_info.department_id == department for employee in employees ) data.append(count) return JsonResponse({"labels": labels, "data": data})