Align frontend API contracts

This commit is contained in:
2026-03-22 13:21:02 +01:00
parent 0da5b4abe2
commit e639b3c792
35 changed files with 1362 additions and 205 deletions

View File

@@ -12,6 +12,7 @@ from apps.parsers.models import (
IndustrialProductRecord,
InspectionRecord,
ManufacturerRecord,
ParsingSettings,
ParserLoadLog,
ProcurementRecord,
Proxy,
@@ -262,22 +263,45 @@ class FNSFileUploadSerializer(serializers.Serializer):
Принимает список Excel файлов в формате fin_{id}_{ogrn}.xlsx
"""
file = serializers.FileField(
required=False,
help_text="Одиночный файл для загрузки (fin_*.xlsx)",
)
files = serializers.ListField(
child=serializers.FileField(),
required=False,
allow_empty=False,
help_text="Список файлов для загрузки (fin_*.xlsx)",
)
def validate_files(self, value):
def validate(self, attrs):
files = attrs.get("files")
single_file = attrs.get("file")
if single_file and files:
raise serializers.ValidationError(
{"file": "Используйте либо file, либо files."}
)
if single_file:
files = [single_file]
if not files:
raise serializers.ValidationError(
{"file": "Нужно передать file или files."}
)
attrs["files"] = self._validate_uploaded_files(files)
return attrs
def _validate_uploaded_files(self, files):
"""Валидация файлов."""
for file in value:
for file in files:
if not FNS_XLSX_FILENAME_RE.match(file.name):
raise serializers.ValidationError(
f"Неверный формат имени файла: {file.name}. "
"Ожидается: fin_{{id}}_{{ogrn}}.xlsx"
)
return value
return files
class FNSZipUploadSerializer(serializers.Serializer):
@@ -291,6 +315,22 @@ class FNSZipUploadSerializer(serializers.Serializer):
return value
class ParsingSettingsSerializer(serializers.ModelSerializer):
"""Настройки периодичности обновления источников парсинга."""
class Meta:
model = ParsingSettings
fields = [
"manufacturers_and_products",
"public_procurements",
"defense_unreliable_suppliers",
"planned_inspections",
"arbitration_cases",
"bankruptcy_procedures",
"information_security_registries",
]
# =============================================================================
# Служебные модели
# =============================================================================
@@ -374,6 +414,22 @@ class ParserLoadLogSerializer(serializers.ModelSerializer):
return 0
class ParserLoadLogListSerializer(serializers.Serializer):
"""Строка списка логов в frontend-friendly формате."""
id = serializers.IntegerField(read_only=True)
batch_id = serializers.IntegerField(read_only=True)
source = serializers.CharField(read_only=True)
source_label = serializers.CharField(read_only=True, allow_null=True)
records_count = serializers.IntegerField(read_only=True)
organizations_count = serializers.IntegerField(read_only=True)
status = serializers.CharField(read_only=True)
status_label = serializers.CharField(read_only=True)
error_message = serializers.CharField(read_only=True, allow_blank=True)
created_at = serializers.DateTimeField(read_only=True)
updated_at = serializers.DateTimeField(read_only=True)
class ProxySerializer(serializers.ModelSerializer):
"""
Прокси-сервер для парсеров.