Рефакторинг инфраструктуры и конфигурации проекта
- Перенесена структура Django-конфига в src/core и src/settings - Унифицирована Docker-сборка и docker-compose для dev/prod - Добавлены startup-checks (DB/Redis) и обновлены env-шаблоны - Расширена OpenAPI-документация и ответы API - Удалены устаревшие deploy/requirements/служебные скрипты - Обновлены CI/CD, README и тесты
This commit is contained in:
@@ -9,6 +9,7 @@ import hashlib
|
||||
import time
|
||||
from pathlib import Path
|
||||
|
||||
from apps.core.openapi import CommonResponses, ErrorResponses, swagger_tag
|
||||
from apps.parsers.models import (
|
||||
FinancialReport,
|
||||
IndustrialCertificateRecord,
|
||||
@@ -44,11 +45,11 @@ from rest_framework.viewsets import ReadOnlyModelViewSet
|
||||
# Swagger Tags (для группировки в документации)
|
||||
# =============================================================================
|
||||
|
||||
MINPROMTORG_TAG = "Минпромторг"
|
||||
PROVERKI_TAG = "Единый реестр проверок"
|
||||
ZAKUPKI_TAG = "Государственные закупки"
|
||||
FNS_TAG = "ФНС - Бухгалтерская отчетность"
|
||||
SYSTEM_TAG = "Системные"
|
||||
MINPROMTORG_TAG = swagger_tag("Минпромторг", "minpromtorg")
|
||||
PROVERKI_TAG = swagger_tag("Единый реестр проверок", "inspections_registry")
|
||||
ZAKUPKI_TAG = swagger_tag("Государственные закупки", "public_procurements")
|
||||
FNS_TAG = swagger_tag("ФНС - Бухгалтерская отчетность", "fns_financial_reports")
|
||||
SYSTEM_TAG = swagger_tag("Системные", "system")
|
||||
|
||||
|
||||
# =============================================================================
|
||||
@@ -78,6 +79,10 @@ class IndustrialCertificateViewSet(ReadOnlyModelViewSet):
|
||||
"Поддерживает фильтрацию по: inn, ogrn, certificate_number, load_batch.\n"
|
||||
"Поддерживает поиск по: organisation_name, certificate_number, inn, ogrn."
|
||||
),
|
||||
responses={
|
||||
200: IndustrialCertificateSerializer(many=True),
|
||||
**ErrorResponses.AUTHENTICATED,
|
||||
},
|
||||
)
|
||||
def list(self, request, *args, **kwargs):
|
||||
return super().list(request, *args, **kwargs)
|
||||
@@ -86,6 +91,10 @@ class IndustrialCertificateViewSet(ReadOnlyModelViewSet):
|
||||
tags=[MINPROMTORG_TAG],
|
||||
operation_summary="Детали сертификата",
|
||||
operation_description="Возвращает информацию о конкретном сертификате.",
|
||||
responses={
|
||||
200: IndustrialCertificateSerializer,
|
||||
**ErrorResponses.AUTHENTICATED_NOT_FOUND,
|
||||
},
|
||||
)
|
||||
def retrieve(self, request, *args, **kwargs):
|
||||
return super().retrieve(request, *args, **kwargs)
|
||||
@@ -118,6 +127,10 @@ class ManufacturerViewSet(ReadOnlyModelViewSet):
|
||||
"Поддерживает фильтрацию по: inn, ogrn, load_batch.\n"
|
||||
"Поддерживает поиск по: full_legal_name, inn, ogrn, address."
|
||||
),
|
||||
responses={
|
||||
200: ManufacturerSerializer(many=True),
|
||||
**ErrorResponses.AUTHENTICATED,
|
||||
},
|
||||
)
|
||||
def list(self, request, *args, **kwargs):
|
||||
return super().list(request, *args, **kwargs)
|
||||
@@ -126,6 +139,10 @@ class ManufacturerViewSet(ReadOnlyModelViewSet):
|
||||
tags=[MINPROMTORG_TAG],
|
||||
operation_summary="Детали производителя",
|
||||
operation_description="Возвращает информацию о конкретном производителе.",
|
||||
responses={
|
||||
200: ManufacturerSerializer,
|
||||
**ErrorResponses.AUTHENTICATED_NOT_FOUND,
|
||||
},
|
||||
)
|
||||
def retrieve(self, request, *args, **kwargs):
|
||||
return super().retrieve(request, *args, **kwargs)
|
||||
@@ -175,6 +192,10 @@ class InspectionViewSet(ReadOnlyModelViewSet):
|
||||
"Поддерживает поиск по: organisation_name, registration_number, "
|
||||
"inn, ogrn, control_authority."
|
||||
),
|
||||
responses={
|
||||
200: InspectionSerializer(many=True),
|
||||
**ErrorResponses.AUTHENTICATED,
|
||||
},
|
||||
)
|
||||
def list(self, request, *args, **kwargs):
|
||||
return super().list(request, *args, **kwargs)
|
||||
@@ -183,6 +204,10 @@ class InspectionViewSet(ReadOnlyModelViewSet):
|
||||
tags=[PROVERKI_TAG],
|
||||
operation_summary="Детали проверки",
|
||||
operation_description="Возвращает информацию о конкретной проверке.",
|
||||
responses={
|
||||
200: InspectionSerializer,
|
||||
**ErrorResponses.AUTHENTICATED_NOT_FOUND,
|
||||
},
|
||||
)
|
||||
def retrieve(self, request, *args, **kwargs):
|
||||
return super().retrieve(request, *args, **kwargs)
|
||||
@@ -235,6 +260,10 @@ class ProcurementViewSet(ReadOnlyModelViewSet):
|
||||
"Поддерживает поиск по: purchase_name, purchase_number, "
|
||||
"customer_name, customer_inn, customer_ogrn."
|
||||
),
|
||||
responses={
|
||||
200: ProcurementSerializer(many=True),
|
||||
**ErrorResponses.AUTHENTICATED,
|
||||
},
|
||||
)
|
||||
def list(self, request, *args, **kwargs):
|
||||
return super().list(request, *args, **kwargs)
|
||||
@@ -243,6 +272,10 @@ class ProcurementViewSet(ReadOnlyModelViewSet):
|
||||
tags=[ZAKUPKI_TAG],
|
||||
operation_summary="Детали закупки",
|
||||
operation_description="Возвращает информацию о конкретной закупке.",
|
||||
responses={
|
||||
200: ProcurementSerializer,
|
||||
**ErrorResponses.AUTHENTICATED_NOT_FOUND,
|
||||
},
|
||||
)
|
||||
def retrieve(self, request, *args, **kwargs):
|
||||
return super().retrieve(request, *args, **kwargs)
|
||||
@@ -280,6 +313,10 @@ class FinancialReportViewSet(ReadOnlyModelViewSet):
|
||||
"source, load_batch.\n"
|
||||
"Поддерживает поиск по: ogrn, external_id, file_name."
|
||||
),
|
||||
responses={
|
||||
200: FinancialReportSerializer(many=True),
|
||||
**ErrorResponses.AUTHENTICATED,
|
||||
},
|
||||
)
|
||||
def list(self, request, *args, **kwargs):
|
||||
return super().list(request, *args, **kwargs)
|
||||
@@ -291,6 +328,10 @@ class FinancialReportViewSet(ReadOnlyModelViewSet):
|
||||
"Возвращает детальную информацию об отчете, "
|
||||
"включая все строки бухгалтерской отчетности."
|
||||
),
|
||||
responses={
|
||||
200: FinancialReportDetailSerializer,
|
||||
**ErrorResponses.AUTHENTICATED_NOT_FOUND,
|
||||
},
|
||||
)
|
||||
def retrieve(self, request, *args, **kwargs):
|
||||
return super().retrieve(request, *args, **kwargs)
|
||||
@@ -350,7 +391,8 @@ class FNSReportUploadView(APIView):
|
||||
},
|
||||
),
|
||||
),
|
||||
400: "Ошибка валидации файлов",
|
||||
400: CommonResponses.BAD_REQUEST,
|
||||
**ErrorResponses.AUTHENTICATED,
|
||||
},
|
||||
)
|
||||
def post(self, request): # noqa
|
||||
@@ -462,6 +504,10 @@ class ParserLoadLogViewSet(ReadOnlyModelViewSet):
|
||||
"Доступно только администраторам.\n"
|
||||
"Поддерживает фильтрацию по: source, status, batch_id."
|
||||
),
|
||||
responses={
|
||||
200: ParserLoadLogSerializer(many=True),
|
||||
**ErrorResponses.ADMIN,
|
||||
},
|
||||
)
|
||||
def list(self, request, *args, **kwargs):
|
||||
return super().list(request, *args, **kwargs)
|
||||
@@ -470,6 +516,10 @@ class ParserLoadLogViewSet(ReadOnlyModelViewSet):
|
||||
tags=[SYSTEM_TAG],
|
||||
operation_summary="Детали загрузки",
|
||||
operation_description="Возвращает информацию о конкретной загрузке.",
|
||||
responses={
|
||||
200: ParserLoadLogSerializer,
|
||||
**ErrorResponses.ADMIN_NOT_FOUND,
|
||||
},
|
||||
)
|
||||
def retrieve(self, request, *args, **kwargs):
|
||||
return super().retrieve(request, *args, **kwargs)
|
||||
@@ -496,6 +546,10 @@ class ProxyViewSet(ReadOnlyModelViewSet):
|
||||
"Доступно только администраторам.\n"
|
||||
"Поддерживает фильтрацию по: is_active."
|
||||
),
|
||||
responses={
|
||||
200: ProxySerializer(many=True),
|
||||
**ErrorResponses.ADMIN,
|
||||
},
|
||||
)
|
||||
def list(self, request, *args, **kwargs):
|
||||
return super().list(request, *args, **kwargs)
|
||||
@@ -504,6 +558,10 @@ class ProxyViewSet(ReadOnlyModelViewSet):
|
||||
tags=[SYSTEM_TAG],
|
||||
operation_summary="Детали прокси",
|
||||
operation_description="Возвращает информацию о конкретном прокси.",
|
||||
responses={
|
||||
200: ProxySerializer,
|
||||
**ErrorResponses.ADMIN_NOT_FOUND,
|
||||
},
|
||||
)
|
||||
def retrieve(self, request, *args, **kwargs):
|
||||
return super().retrieve(request, *args, **kwargs)
|
||||
|
||||
Reference in New Issue
Block a user