"""API формы Ф-4.""" import logging from apps.core.upload_contracts import ( build_upload_error_response, build_upload_success_payload, build_upload_validation_response, ) from apps.core.viewsets import ReadOnlyViewSet from apps.form_4.models import FormF4Record from apps.form_4.serializers import ( FormF4ParseResultSerializer, FormF4RecordListSerializer, FormF4RecordSerializer, FormF4UploadSerializer, ) from apps.form_4.services import parse_form_f4_file from apps.form_4.tasks import process_form_f4_file from rest_framework import status from rest_framework.parsers import MultiPartParser from rest_framework.permissions import IsAuthenticated from rest_framework.response import Response from rest_framework.views import APIView logger = logging.getLogger(__name__) BACKGROUND_THRESHOLD = 1024 * 1024 class FormF4UploadView(APIView): parser_classes = [MultiPartParser] def post(self, request): serializer = FormF4UploadSerializer(data=request.data) if not serializer.is_valid(): return build_upload_validation_response(serializer.errors) file = serializer.validated_data["file"] report_year = serializer.validated_data["report_year"] report_half_year = serializer.validated_data.get("report_half_year") report_quarter = report_half_year if file.size > BACKGROUND_THRESHOLD: task = process_form_f4_file.delay( file.read(), file.name, report_year, report_quarter, ) return Response( build_upload_success_payload( form="f4", report_year=report_year, report_half_year=report_half_year, status="queued", job_id=task.id, ), status=status.HTTP_202_ACCEPTED, ) try: result = parse_form_f4_file( file, report_year=report_year, report_quarter=report_quarter, ) return Response( build_upload_success_payload( form="f4", report_year=report_year, report_half_year=report_half_year, status="done", result=FormF4ParseResultSerializer(result).data, ), status=status.HTTP_200_OK, ) except Exception as e: logger.exception("Ошибка обработки файла Ф-4") return build_upload_error_response( error_code="processing_error", error_message=str(e), status_code=status.HTTP_400_BAD_REQUEST, ) class FormF4RecordViewSet(ReadOnlyViewSet[FormF4Record]): queryset = FormF4Record.objects.select_related("organization").filter( is_active_version=True ) serializer_class = FormF4RecordSerializer permission_classes = [IsAuthenticated] def get_serializer_class(self): return ( FormF4RecordListSerializer if self.action == "list" else FormF4RecordSerializer ) def get_queryset(self): qs = super().get_queryset() batch_id = self.request.query_params.get("batch_id") report_year = self.request.query_params.get("report_year") report_quarter = self.request.query_params.get("report_quarter") if batch_id: qs = qs.filter(load_batch=batch_id) if report_year: qs = qs.filter(report_year=report_year) if report_quarter: qs = qs.filter(report_quarter=report_quarter) return qs