import logging from django.shortcuts import get_object_or_404 from rest_framework.exceptions import PermissionDenied from rest_framework.permissions import IsAuthenticated from rest_framework.response import Response from rest_framework.views import APIView from attendance.models import ( EmployeeWorkSchedule, StandardWorkSchedule, ) from employees.models import Employee from ..serializers import ( EmployeeWorkScheduleSerializer, StandardWorkScheduleSerializer, default_standard_work_schedule_response, default_work_schedule_response, ) from ..support import _check_employee_access, _check_staff_access logger = logging.getLogger(__name__) class EmployeeWorkScheduleAPIView(APIView): serializer_class = EmployeeWorkScheduleSerializer permission_classes = [IsAuthenticated] def get_employee(self, employee_id): _check_employee_access(self.request.user, employee_id) return get_object_or_404(Employee, pk=employee_id) def get(self, request, employee_id): employee = self.get_employee(employee_id) try: schedule = employee.work_schedule except EmployeeWorkSchedule.DoesNotExist: schedule = None if schedule is None: return Response(default_work_schedule_response(employee.id)) return Response(EmployeeWorkScheduleSerializer(schedule).data) def patch(self, request, employee_id): if not (request.user.is_staff or request.user.is_superuser): raise PermissionDenied("You don't have permission to edit schedules") employee = get_object_or_404(Employee, pk=employee_id) try: schedule = employee.work_schedule except EmployeeWorkSchedule.DoesNotExist: schedule = None serializer = EmployeeWorkScheduleSerializer( schedule, data=request.data, partial=True, ) serializer.is_valid(raise_exception=True) instance = serializer.save(employee=employee, updated_by=request.user) return Response(EmployeeWorkScheduleSerializer(instance).data) class StandardWorkScheduleAPIView(APIView): serializer_class = StandardWorkScheduleSerializer permission_classes = [IsAuthenticated] def get(self, request): _check_staff_access(request.user) schedule = StandardWorkSchedule.objects.order_by("id").first() if schedule is None: return Response(default_standard_work_schedule_response()) return Response(StandardWorkScheduleSerializer(schedule).data) def patch(self, request): _check_staff_access(request.user) schedule = StandardWorkSchedule.objects.order_by("id").first() serializer = StandardWorkScheduleSerializer( schedule, data=request.data, partial=True, ) serializer.is_valid(raise_exception=True) instance = serializer.save(updated_by=request.user) return Response(StandardWorkScheduleSerializer(instance).data)