Files
state-corp-backend/src/apps/form_4/api.py

112 lines
3.7 KiB
Python

"""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