102 lines
3.4 KiB
Python
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)
|