Align frontend API contracts
This commit is contained in:
@@ -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):
|
||||
"""
|
||||
Прокси-сервер для парсеров.
|
||||
|
||||
Reference in New Issue
Block a user