diff --git a/horilla_api/api_serializers/base/serializers.py b/horilla_api/api_serializers/base/serializers.py index 6e82ead07..54ce1939a 100644 --- a/horilla_api/api_serializers/base/serializers.py +++ b/horilla_api/api_serializers/base/serializers.py @@ -1,4 +1,5 @@ -from datetime import timezone +import datetime +from datetime import date, timezone import django from django.core.exceptions import ValidationError as DjangoValidationError @@ -23,6 +24,7 @@ from base.models import ( WorkTypeRequest, ) from employee.models import Actiontype, Employee +from horilla import horilla_middlewares class CompanySerializer(serializers.ModelSerializer): @@ -339,15 +341,40 @@ class WorkTypeRequestSerializer(serializers.ModelSerializer): fields = "__all__" def validate(self, attrs): - # Create an instance of the model with the provided data - instance = WorkTypeRequest(**attrs) + request = getattr(horilla_middlewares._thread_locals, "request", None) + # Check if the user is not a superuser + requested_date = attrs.get("requested_date", None) - # Call the model's clean method for validation - try: - instance.clean() - except DjangoValidationError as e: - # Raise DRF's ValidationError with the same message - raise serializers.ValidationError(e) + if request and not request.user.is_superuser: + + if requested_date and requested_date < datetime.datetime.today().date(): + raise serializers.ValidationError( + {"requested_date": "Date must be greater than or equal to today."} + ) + + # Validate requested_till is not earlier than requested_date + requested_till = attrs.get("requested_till", None) + if requested_till and requested_till < requested_date: + raise serializers.ValidationError( + { + "requested_till": ( + "End date must be greater than or equal to start date." + ) + } + ) + + # Check if any work type request already exists + if self.instance and self.instance.is_any_work_type_request_exists(): + raise serializers.ValidationError( + {"error": "A work type request already exists during this time period."} + ) + + # Validate if `is_permanent_work_type` is False, `requested_till` must be provided + if not attrs.get("is_permanent_work_type", False): + if not requested_till: + raise serializers.ValidationError( + {"requested_till": ("Requested till field is required.")} + ) return attrs diff --git a/horilla_api/api_views/attendance/views.py b/horilla_api/api_views/attendance/views.py index 5fbfa09db..97e434a34 100644 --- a/horilla_api/api_views/attendance/views.py +++ b/horilla_api/api_views/attendance/views.py @@ -229,10 +229,20 @@ class AttendanceView(APIView): def post(self, request): serializer = AttendanceSerializer(data=request.data) if serializer.is_valid(): - validated_data = serializer.validated_data - instance = Attendance(**validated_data) - instance.save() + serializer.save() return Response(serializer.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." + ] + } + ) return Response(serializer.errors, status=400) @method_decorator(permission_required("attendance.change_attendance")) diff --git a/horilla_api/api_views/base/views.py b/horilla_api/api_views/base/views.py index 1e4f575c1..5506c95f7 100644 --- a/horilla_api/api_views/base/views.py +++ b/horilla_api/api_views/base/views.py @@ -378,7 +378,9 @@ class WorkTypeRequestView(APIView): def post(self, request): serializer = self.serializer_class(data=request.data) + print("------------------reached") if serializer.is_valid(): + print("------------------valid") instance = serializer.save() try: notify.send( @@ -402,7 +404,9 @@ class WorkTypeRequestView(APIView): ) return Response(serializer.data, status=201) except Exception as E: + print("------------exception", E) return Response(serializer.errors, status=400) + print("-----------error", serializer.errors) return Response(serializer.errors, status=400) @check_approval_status(WorkTypeRequest, "base.change_worktyperequest")