"""API формы Ф-6.""" import logging from apps.core.viewsets import ReadOnlyViewSet from apps.form_6.models import FormF6Record from apps.form_6.serializers import ( FormF6ParseResultSerializer, FormF6RecordListSerializer, FormF6RecordSerializer, FormF6UploadSerializer, ) from apps.form_6.services import parse_form_f6_file from apps.form_6.tasks import process_form_f6_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 FormF6UploadView(APIView): parser_classes = [MultiPartParser] def post(self, request): serializer = FormF6UploadSerializer(data=request.data) serializer.is_valid(raise_exception=True) file = serializer.validated_data["file"] report_year = serializer.validated_data["report_year"] report_quarter = serializer.validated_data.get("report_quarter") if file.size > BACKGROUND_THRESHOLD: task = process_form_f6_file.delay( file.read(), file.name, report_year, report_quarter, ) return Response( { "success": True, "message": "Файл поставлен в очередь", "task_id": task.id, }, status=status.HTTP_202_ACCEPTED, ) try: result = parse_form_f6_file( file, report_year=report_year, report_quarter=report_quarter, ) return Response( {"success": True, "data": FormF6ParseResultSerializer(result).data} ) except Exception as e: logger.exception("Ошибка обработки файла Ф-6") return Response( {"success": False, "error": str(e)}, status=status.HTTP_400_BAD_REQUEST ) class FormF6RecordViewSet(ReadOnlyViewSet[FormF6Record]): queryset = FormF6Record.objects.select_related("organization").filter( is_active_version=True ) serializer_class = FormF6RecordSerializer permission_classes = [IsAuthenticated] def get_serializer_class(self): return ( FormF6RecordListSerializer if self.action == "list" else FormF6RecordSerializer ) 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