import logging from django.utils import timezone from rest_framework.permissions import IsAuthenticated from rest_framework.response import Response from rest_framework.views import APIView from attendance.services import ( get_attendance_auto_sync_settings, run_attendance_auto_sync, ) from ..serializers import ( AttendanceAutoSyncSettingsSerializer, ) from ..support import _check_staff_access logger = logging.getLogger(__name__) class AttendanceAutoSyncSettingsAPIView(APIView): serializer_class = AttendanceAutoSyncSettingsSerializer permission_classes = [IsAuthenticated] def get(self, request): _check_staff_access(request.user) return Response( AttendanceAutoSyncSettingsSerializer( get_attendance_auto_sync_settings() ).data ) def patch(self, request): _check_staff_access(request.user) settings = get_attendance_auto_sync_settings() was_enabled = settings.enabled old_frequency = settings.frequency_minutes serializer = AttendanceAutoSyncSettingsSerializer( settings, data=request.data, partial=True, ) serializer.is_valid(raise_exception=True) instance = serializer.save(updated_by=request.user) update_fields = ["updated_by", "updated_at"] if not instance.enabled: instance.next_run_at = None update_fields.append("next_run_at") elif not was_enabled or old_frequency != instance.frequency_minutes: instance.next_run_at = timezone.now() update_fields.append("next_run_at") if update_fields != ["updated_by", "updated_at"]: instance.save(update_fields=update_fields) return Response(AttendanceAutoSyncSettingsSerializer(instance).data) class AttendanceAutoSyncRunNowAPIView(APIView): serializer_class = AttendanceAutoSyncSettingsSerializer permission_classes = [IsAuthenticated] def post(self, request): _check_staff_access(request.user) settings = run_attendance_auto_sync(force=True) return Response(AttendanceAutoSyncSettingsSerializer(settings).data)