Add initial implementations for forms and organization apps with serializers, factories, and admin configurations
Some checks failed
CI/CD Pipeline / Code Quality Checks (push) Failing after 5m5s
CI/CD Pipeline / Run Tests (push) Failing after 5m5s
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
Some checks failed
CI/CD Pipeline / Code Quality Checks (push) Failing after 5m5s
CI/CD Pipeline / Run Tests (push) Failing after 5m5s
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
This commit is contained in:
109
src/apps/form_2/api.py
Normal file
109
src/apps/form_2/api.py
Normal file
@@ -0,0 +1,109 @@
|
||||
"""
|
||||
API формы Ф-2.
|
||||
|
||||
Содержит:
|
||||
- FormF2UploadView - загрузка файла
|
||||
- FormF2RecordViewSet - CRUD записей
|
||||
"""
|
||||
|
||||
import logging
|
||||
|
||||
from apps.core.viewsets import BaseViewSet
|
||||
from apps.form_2.models import FormF2Record
|
||||
from apps.form_2.serializers import (
|
||||
FormF2ParseResultSerializer,
|
||||
FormF2RecordListSerializer,
|
||||
FormF2RecordSerializer,
|
||||
FormF2UploadSerializer,
|
||||
)
|
||||
from apps.form_2.services import FormF2Service, parse_form_f2_file
|
||||
from apps.form_2.tasks import process_form_f2_file
|
||||
from rest_framework import status
|
||||
from rest_framework.parsers import MultiPartParser
|
||||
from rest_framework.response import Response
|
||||
from rest_framework.views import APIView
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
# Порог для фоновой обработки (байты)
|
||||
BACKGROUND_THRESHOLD = 1024 * 1024 # 1MB
|
||||
|
||||
|
||||
class FormF2UploadView(APIView):
|
||||
"""
|
||||
Загрузка файла формы Ф-2.
|
||||
|
||||
POST /api/v1/forms/f2/upload/
|
||||
"""
|
||||
|
||||
parser_classes = [MultiPartParser]
|
||||
|
||||
def post(self, request):
|
||||
"""Загрузка и обработка файла."""
|
||||
serializer = FormF2UploadSerializer(data=request.data)
|
||||
serializer.is_valid(raise_exception=True)
|
||||
|
||||
file = serializer.validated_data["file"]
|
||||
|
||||
# Для больших файлов - фоновая обработка
|
||||
if file.size > BACKGROUND_THRESHOLD:
|
||||
file_content = file.read()
|
||||
task = process_form_f2_file.delay(file_content, file.name)
|
||||
|
||||
return Response(
|
||||
{
|
||||
"success": True,
|
||||
"message": "Файл поставлен в очередь на обработку",
|
||||
"task_id": task.id,
|
||||
},
|
||||
status=status.HTTP_202_ACCEPTED,
|
||||
)
|
||||
|
||||
# Синхронная обработка
|
||||
try:
|
||||
result = parse_form_f2_file(file)
|
||||
result_serializer = FormF2ParseResultSerializer(result)
|
||||
|
||||
return Response(
|
||||
{
|
||||
"success": True,
|
||||
"data": result_serializer.data,
|
||||
},
|
||||
status=status.HTTP_200_OK,
|
||||
)
|
||||
except Exception as e:
|
||||
logger.exception("Ошибка обработки файла Ф-2")
|
||||
return Response(
|
||||
{
|
||||
"success": False,
|
||||
"error": str(e),
|
||||
},
|
||||
status=status.HTTP_400_BAD_REQUEST,
|
||||
)
|
||||
|
||||
|
||||
class FormF2RecordViewSet(BaseViewSet):
|
||||
"""
|
||||
ViewSet для записей формы Ф-2.
|
||||
|
||||
GET /api/v1/forms/f2/records/ - список записей
|
||||
GET /api/v1/forms/f2/records/{id}/ - детали записи
|
||||
"""
|
||||
|
||||
queryset = FormF2Record.objects.select_related("organization").all()
|
||||
serializer_class = FormF2RecordSerializer
|
||||
service_class = FormF2Service
|
||||
|
||||
def get_serializer_class(self):
|
||||
"""Выбор сериализатора в зависимости от действия."""
|
||||
if self.action == "list":
|
||||
return FormF2RecordListSerializer
|
||||
return FormF2RecordSerializer
|
||||
|
||||
def get_queryset(self):
|
||||
"""Фильтрация по batch_id."""
|
||||
queryset = super().get_queryset()
|
||||
batch_id = self.request.query_params.get("batch_id")
|
||||
if batch_id:
|
||||
queryset = queryset.filter(load_batch=batch_id)
|
||||
return queryset
|
||||
Reference in New Issue
Block a user