From 921ececd8699a5f7d9d48cad385008c8d92f22c8 Mon Sep 17 00:00:00 2001 From: Horilla Date: Mon, 6 Oct 2025 18:35:47 +0530 Subject: [PATCH] [FIX] HORILLA_API: Attendance create and update request --- horilla_api/api_methods/employee/methods.py | 54 --------------------- horilla_api/api_views/attendance/views.py | 44 ++++++++++------- 2 files changed, 27 insertions(+), 71 deletions(-) diff --git a/horilla_api/api_methods/employee/methods.py b/horilla_api/api_methods/employee/methods.py index 5c0400873..e69de29bb 100644 --- a/horilla_api/api_methods/employee/methods.py +++ b/horilla_api/api_methods/employee/methods.py @@ -1,54 +0,0 @@ -import re - -from base.methods import eval_validate -from base.models import * -from employee.models import * - - -def get_next_badge_id(): - """ - This method is used to generate badge id - """ - from base.context_processors import get_initial_prefix - from employee.methods.methods import get_ordered_badge_ids - - prefix = get_initial_prefix(None)["get_initial_prefix"] - data = get_ordered_badge_ids() - result = [] - try: - for sublist in data: - for item in sublist: - if isinstance(item, str) and item.lower().startswith(prefix.lower()): - # Find the index of the item in the sublist - index = sublist.index(item) - # Check if there is a next item in the sublist - if index + 1 < len(sublist): - result = sublist[index + 1] - result = re.findall(r"[a-zA-Z]+|\d+|[^a-zA-Z\d\s]", result) - - if result: - prefix = [] - incremented = False - for item in reversed(result): - total_letters = len(item) - total_zero_leads = 0 - for letter in item: - if letter == "0": - total_zero_leads = total_zero_leads + 1 - continue - break - - if total_zero_leads: - item = item[total_zero_leads:] - if isinstance(item, list): - item = item[-1] - if not incremented and isinstance(eval_validate(str(item)), int): - item = int(item) + 1 - incremented = True - if isinstance(item, int): - item = "{:0{}d}".format(item, total_letters) - prefix.insert(0, str(item)) - prefix = "".join(prefix) - except Exception as e: - prefix = get_initial_prefix(None)["get_initial_prefix"] - return prefix diff --git a/horilla_api/api_views/attendance/views.py b/horilla_api/api_views/attendance/views.py index c2df6d2c7..9b4164fa9 100644 --- a/horilla_api/api_views/attendance/views.py +++ b/horilla_api/api_views/attendance/views.py @@ -89,7 +89,6 @@ class ClockInAPIView(APIView): if request.__dict__.get("date"): date_today = request.date attendance_date = date_today - day = date_today.strftime("%A").lower() day = EmployeeShiftDay.objects.get(day=day) now = datetime.now().strftime("%H:%M") @@ -437,33 +436,44 @@ class AttendanceRequestView(APIView): return pagenation.get_paginated_response(serializer.data) def post(self, request): - serializer = AttendanceRequestSerializer(data=request.data) - if serializer.is_valid(): - serializer.save() - return Response(serializer.data, status=200) + from attendance.forms import NewRequestForm + + form = NewRequestForm(data=request.data) + if form.is_valid(): + work_type = form.cleaned_data.get("work_type_id") + + if not WorkType.objects.filter(pk=getattr(work_type, "pk", None)).exists(): + form.cleaned_data["work_type_id"] = None + + if form.new_instance is not None: + form.new_instance.save() + + return Response(form.data, status=200) employee_id = request.data.get("employee_id") attendance_date = request.data.get("attendance_date", date.today()) if Attendance.objects.filter( employee_id=employee_id, attendance_date=attendance_date ).exists(): return Response( - { - "error": [ - "Attendance for this employee on the current date already exists." - ] - }, + {error: list(message) for error, message in form.errors.items()}, status=400, ) - return Response(serializer.errors, status=404) + return Response(form.errors, status=404) - @manager_permission_required("attendance.update_attendance") def put(self, request, pk): + from attendance.forms import AttendanceRequestForm + attendance = Attendance.objects.get(id=pk) - serializer = AttendanceRequestSerializer(instance=attendance, data=request.data) - if serializer.is_valid(): - instance = serializer.save() + form = AttendanceRequestForm(data=request.data, instance=attendance) + if form.is_valid(): + attendance = Attendance.objects.get(id=form.instance.pk) + instance = form.save() instance.employee_id = attendance.employee_id instance.id = attendance.id + work_type = form.cleaned_data.get("work_type_id") + + if not WorkType.objects.filter(pk=getattr(work_type, "pk", None)).exists(): + form.cleaned_data["work_type_id"] = None if attendance.request_type != "create_request": attendance.requested_data = json.dumps(instance.serialize()) attendance.request_description = instance.request_description @@ -474,8 +484,8 @@ class AttendanceRequestView(APIView): instance.is_validate_request_approved = False instance.is_validate_request = True instance.save() - return Response(serializer.data, status=200) - return Response(serializer.errors, status=404) + return Response(form.data, status=200) + return Response(form.errors, status=404) class AttendanceRequestApproveView(APIView):