84 lines
3.0 KiB
Python

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)