102 lines
3.4 KiB
Python

import logging
from rest_framework import status
from rest_framework.permissions import IsAuthenticated
from rest_framework.response import Response
from rest_framework.views import APIView
from attendance.services import (
get_employee_work_schedule_payload,
get_standard_work_schedule_payload,
save_logstorm_attendance_result,
)
from common.logstorm_attendance import (
analyze_employee_attendance,
build_logstorm_attendance_payload,
)
from common.logstorm_client import LogStormClientError
from employees.models import Employee
from ..serializers import (
LogStormAttendanceAnalyzeSerializer,
)
from ..support import _check_employee_access
logger = logging.getLogger(__name__)
class LogStormAttendanceAnalyzeAPIView(APIView):
serializer_class = LogStormAttendanceAnalyzeSerializer
permission_classes = [IsAuthenticated]
def post(self, request):
serializer = LogStormAttendanceAnalyzeSerializer(data=request.data)
serializer.is_valid(raise_exception=True)
data = serializer.validated_data
_check_employee_access(request.user, data["employee_id"])
try:
employee = Employee.objects.get(pk=data["employee_id"])
except Employee.DoesNotExist:
return Response(
{"detail": "Employee not found"},
status=status.HTTP_404_NOT_FOUND,
)
schedule_payload = data.get("schedule")
if schedule_payload is None:
schedule_payload = (
get_employee_work_schedule_payload(employee)
or get_standard_work_schedule_payload()
)
aliases = (
data["aliases"]
if "aliases" in data
else list(getattr(employee, "attendance_aliases", None) or [])
)
try:
result = analyze_employee_attendance(
employee=employee,
period_start=data["period_start"],
period_end=data["period_end"],
schedule=schedule_payload,
aliases=aliases,
client=None,
)
except LogStormClientError as exc:
logger.warning(
"LogStorm attendance analysis failed",
extra={
"event": "attendance.logstorm.analysis_failed",
"employee_id": employee.id,
"period_start": data["period_start"],
"period_end": data["period_end"],
"upstream_status_code": exc.status_code,
"error_type": type(exc).__name__,
},
)
return Response(
{"detail": str(exc), "error": "logstorm_unavailable"},
status=status.HTTP_502_BAD_GATEWAY,
)
request_payload = build_logstorm_attendance_payload(
employee=employee,
period_start=data["period_start"],
period_end=data["period_end"],
schedule=schedule_payload,
aliases=aliases,
)
save_logstorm_attendance_result(
employee=employee,
period_start=data["period_start"],
period_end=data["period_end"],
schedule_payload=request_payload.get("schedule"),
request_payload=request_payload,
response_payload=result,
triggered_by=request.user,
)
return Response(result)