feat: expand platform APIs, sources, and test coverage
Some checks failed
CI/CD Pipeline / Run Tests (pull_request) Successful in 1m53s
CI/CD Pipeline / Telegram Notify Success (push) Has been cancelled
CI/CD Pipeline / Run Tests (push) Has been cancelled
CI/CD Pipeline / Code Quality Checks (push) Has been cancelled
CI/CD Pipeline / Code Quality Checks (pull_request) Failing after 2m54s
CI/CD Pipeline / Telegram Notify Success (pull_request) Has been skipped

This commit is contained in:
2026-03-17 12:56:48 +01:00
parent b505c67968
commit 3d298ce352
101 changed files with 8387 additions and 292 deletions

View File

@@ -8,6 +8,7 @@ from apps.parsers.models import (
FinancialReport,
FinancialReportLine,
IndustrialCertificateRecord,
IndustrialProductRecord,
InspectionRecord,
ManufacturerRecord,
ParserLoadLog,
@@ -77,6 +78,34 @@ class ManufacturerSerializer(serializers.ModelSerializer):
read_only_fields = fields
class IndustrialProductSerializer(serializers.ModelSerializer):
"""
Промышленная продукция из реестра Минпромторга.
Данные загружаются из Минпромторга.
"""
class Meta:
model = IndustrialProductRecord
fields = [
"id",
"load_batch",
"full_organisation_name",
"ogrn",
"inn",
"registry_number",
"product_name",
"product_model",
"okpd2_code",
"tnved_code",
"regulatory_document",
"registry_organization",
"created_at",
"updated_at",
]
read_only_fields = fields
# =============================================================================
# Единый реестр проверок (proverki.gov.ru)
# =============================================================================
@@ -304,3 +333,124 @@ class ProxySerializer(serializers.ModelSerializer):
"updated_at",
]
read_only_fields = fields
class SourceCardRefreshParamSerializer(serializers.Serializer):
"""Описание параметра ручного обновления карточки источника."""
name = serializers.CharField(read_only=True)
label = serializers.CharField(read_only=True)
description = serializers.CharField(read_only=True)
required = serializers.BooleanField(read_only=True)
type = serializers.CharField(read_only=True)
default = serializers.JSONField(read_only=True)
class SourceCardLoadSerializer(serializers.Serializer):
"""Сводка по последней загрузке источника."""
batch_id = serializers.IntegerField(read_only=True)
source = serializers.CharField(read_only=True)
source_display = serializers.CharField(read_only=True)
records_count = serializers.IntegerField(read_only=True)
status = serializers.CharField(read_only=True)
error_message = serializers.CharField(read_only=True)
created_at = serializers.DateTimeField(read_only=True)
updated_at = serializers.DateTimeField(read_only=True)
class SourceCardTaskSerializer(serializers.Serializer):
"""Краткая информация по фоновой задаче карточки."""
task_id = serializers.CharField(read_only=True)
task_name = serializers.CharField(read_only=True)
status = serializers.CharField(read_only=True)
progress = serializers.IntegerField(read_only=True)
progress_message = serializers.CharField(read_only=True)
started_at = serializers.DateTimeField(read_only=True)
created_at = serializers.DateTimeField(read_only=True)
meta = serializers.JSONField(read_only=True)
class SourceCardItemSerializer(serializers.Serializer):
"""Подисточник внутри агрегированной карточки."""
code = serializers.CharField(read_only=True)
title = serializers.CharField(read_only=True)
description = serializers.CharField(read_only=True)
parser_source = serializers.CharField(read_only=True, allow_null=True)
parser_source_display = serializers.CharField(read_only=True, allow_null=True)
records_count = serializers.IntegerField(read_only=True)
organizations_count = serializers.IntegerField(read_only=True)
last_updated_at = serializers.DateTimeField(read_only=True, allow_null=True)
latest_load = SourceCardLoadSerializer(read_only=True, allow_null=True)
latest_success_load = SourceCardLoadSerializer(read_only=True, allow_null=True)
class SourceCardSerializer(serializers.Serializer):
"""Serializer for frontend source cards list."""
slug = serializers.CharField(read_only=True)
title = serializers.CharField(read_only=True)
description = serializers.CharField(read_only=True)
order = serializers.IntegerField(read_only=True)
is_available = serializers.BooleanField(read_only=True)
status = serializers.CharField(read_only=True)
status_label = serializers.CharField(read_only=True)
progress = serializers.IntegerField(read_only=True)
records_count = serializers.IntegerField(read_only=True)
organizations_count = serializers.IntegerField(read_only=True)
last_updated_at = serializers.DateTimeField(read_only=True, allow_null=True)
next_update_at = serializers.DateTimeField(read_only=True, allow_null=True)
error_message = serializers.CharField(read_only=True)
task_names = serializers.ListField(child=serializers.CharField(), read_only=True)
refresh_requires_params = serializers.BooleanField(read_only=True)
refresh_params = SourceCardRefreshParamSerializer(many=True, read_only=True)
class SourceTaskStatusSerializer(serializers.Serializer):
"""Табличная строка статуса источника для экрана задач парсинга."""
row_number = serializers.IntegerField(read_only=True)
slug = serializers.CharField(read_only=True)
source = serializers.CharField(read_only=True)
status = serializers.CharField(read_only=True)
status_label = serializers.CharField(read_only=True)
actualized_at = serializers.DateTimeField(read_only=True, allow_null=True)
next_update_at = serializers.DateTimeField(read_only=True, allow_null=True)
records_count = serializers.IntegerField(read_only=True)
organizations_count = serializers.IntegerField(read_only=True)
progress = serializers.IntegerField(read_only=True)
error_message = serializers.CharField(read_only=True)
active_tasks = SourceCardTaskSerializer(many=True, read_only=True)
class SourceCardDetailSerializer(SourceCardSerializer):
"""Detailed serializer for a single frontend source card."""
active_tasks = SourceCardTaskSerializer(many=True, read_only=True)
source_items = SourceCardItemSerializer(many=True, read_only=True)
latest_load = SourceCardLoadSerializer(read_only=True, allow_null=True)
latest_success_load = SourceCardLoadSerializer(read_only=True, allow_null=True)
class SourceCardRefreshRequestSerializer(serializers.Serializer):
"""Request body for manual card refresh."""
params = serializers.DictField(required=False)
class SourceCardRefreshTaskSerializer(serializers.Serializer):
"""Queued task info after refresh start."""
task_id = serializers.CharField(read_only=True)
task_name = serializers.CharField(read_only=True)
class SourceCardRefreshResponseSerializer(serializers.Serializer):
"""Response serializer for manual card refresh."""
source_card = serializers.CharField(read_only=True)
status = serializers.CharField(read_only=True)
requested_at = serializers.DateTimeField(read_only=True)
tasks = SourceCardRefreshTaskSerializer(many=True, read_only=True)