Some checks failed
CI/CD Pipeline / Run Tests (push) Failing after 45s
CI/CD Pipeline / Code Quality Checks (push) Failing after 48s
CI/CD Pipeline / Build Docker Images (push) Has been skipped
CI/CD Pipeline / Push to Gitea Registry (push) Has been skipped
CI/CD Pipeline / Deploy to Server (push) Has been skipped
93 lines
3.0 KiB
Python
93 lines
3.0 KiB
Python
"""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
|