From 4c5ceb74f6e5d74bdd9bbd82710e63b374421a0a Mon Sep 17 00:00:00 2001 From: Aleksandr Meshchriakov Date: Tue, 14 Apr 2026 11:30:27 +0200 Subject: [PATCH] chore(quality): fix CI lint/format violations --- src/apps/core/upload_contracts.py | 4 ++- src/apps/external_data/api.py | 8 +++-- src/apps/external_data/models.py | 4 ++- src/apps/external_data/serializers.py | 2 +- src/apps/external_data/urls.py | 2 +- src/apps/form_2/serializers.py | 4 +-- src/apps/form_3/serializers.py | 2 +- src/apps/form_4/serializers.py | 2 +- src/apps/form_5/serializers.py | 2 +- src/apps/form_6/serializers.py | 2 +- src/apps/organization/scope_utils.py | 4 +-- src/apps/organization/serializers.py | 1 - src/apps/user/views.py | 21 ++++++----- tests/apps/external_data/factories.py | 6 ++-- tests/apps/external_data/test_api.py | 2 +- tests/apps/forms/test_upload_contracts_api.py | 29 ++++++++------- tests/apps/organization/test_analytics_api.py | 35 ++++++++++++++----- 17 files changed, 76 insertions(+), 54 deletions(-) diff --git a/src/apps/core/upload_contracts.py b/src/apps/core/upload_contracts.py index eb0e669..933d783 100644 --- a/src/apps/core/upload_contracts.py +++ b/src/apps/core/upload_contracts.py @@ -82,7 +82,9 @@ def build_upload_success_payload( report_quarter=report_quarter, ) else: - payload["report_period_display"] = report_annual_display(report_year=report_year) + payload["report_period_display"] = report_annual_display( + report_year=report_year + ) if result is not None: payload["result"] = result diff --git a/src/apps/external_data/api.py b/src/apps/external_data/api.py index 421c46b..c73c346 100644 --- a/src/apps/external_data/api.py +++ b/src/apps/external_data/api.py @@ -4,16 +4,16 @@ from apps.core.viewsets import ClassicReadOnlyViewSet from apps.external_data.models import ( ArbitrationCase, IndustrialProduct, + InformationSecurityRegistryEntry, ProsecutorCheck, PublicProcurement, - InformationSecurityRegistryEntry, ) from apps.external_data.serializers import ( ArbitrationCaseSerializer, + CorporationMembershipSerializer, IndustrialProductSerializer, ProsecutorCheckSerializer, PublicProcurementSerializer, - CorporationMembershipSerializer, ) from django_filters import rest_framework as filters from rest_framework.permissions import IsAuthenticated @@ -122,7 +122,9 @@ class ArbitrationCaseViewSet(ClassicReadOnlyViewSet[ArbitrationCase]): class CorporationMembershipViewSet( ClassicReadOnlyViewSet[InformationSecurityRegistryEntry] ): - queryset = InformationSecurityRegistryEntry.objects.select_related("organization").all() + queryset = InformationSecurityRegistryEntry.objects.select_related( + "organization" + ).all() serializer_class = CorporationMembershipSerializer permission_classes = [IsAuthenticated] filterset_class = CorporationMembershipFilter diff --git a/src/apps/external_data/models.py b/src/apps/external_data/models.py index fc28e4f..7a34c0a 100644 --- a/src/apps/external_data/models.py +++ b/src/apps/external_data/models.py @@ -112,7 +112,9 @@ class ArbitrationCase(UUIDPrimaryKeyMixin, TimestampMixin, models.Model): return f"{self.case_number} ({self.organization_id})" -class InformationSecurityRegistryEntry(UUIDPrimaryKeyMixin, TimestampMixin, models.Model): +class InformationSecurityRegistryEntry( + UUIDPrimaryKeyMixin, TimestampMixin, models.Model +): class PresenceStatus(models.TextChoices): PRESENT = "present", _("В реестре") ABSENT = "absent", _("Не в реестре") diff --git a/src/apps/external_data/serializers.py b/src/apps/external_data/serializers.py index c9cbb44..d240795 100644 --- a/src/apps/external_data/serializers.py +++ b/src/apps/external_data/serializers.py @@ -3,9 +3,9 @@ from apps.external_data.models import ( ArbitrationCase, IndustrialProduct, + InformationSecurityRegistryEntry, ProsecutorCheck, PublicProcurement, - InformationSecurityRegistryEntry, ) from rest_framework import serializers diff --git a/src/apps/external_data/urls.py b/src/apps/external_data/urls.py index 2920190..5059532 100644 --- a/src/apps/external_data/urls.py +++ b/src/apps/external_data/urls.py @@ -2,10 +2,10 @@ from apps.external_data.api import ( ArbitrationCaseViewSet, + CorporationMembershipViewSet, IndustrialProductViewSet, ProsecutorCheckViewSet, PublicProcurementViewSet, - CorporationMembershipViewSet, ) from django.urls import include, path from rest_framework.routers import DefaultRouter diff --git a/src/apps/form_2/serializers.py b/src/apps/form_2/serializers.py index 3da59c3..a218b67 100644 --- a/src/apps/form_2/serializers.py +++ b/src/apps/form_2/serializers.py @@ -7,11 +7,11 @@ - FormF2ParseResultSerializer - результат парсинга """ -from apps.form_2.models import FormF2Record from apps.core.upload_contracts import ( - UploadQuarterSerializer, UploadParseResultSerializer, + UploadQuarterSerializer, ) +from apps.form_2.models import FormF2Record from apps.organization.serializers import OrganizationSerializer from rest_framework import serializers diff --git a/src/apps/form_3/serializers.py b/src/apps/form_3/serializers.py index 1d2fd05..3a27cd8 100644 --- a/src/apps/form_3/serializers.py +++ b/src/apps/form_3/serializers.py @@ -7,11 +7,11 @@ - FormF3ParseResultSerializer - результат парсинга """ -from apps.form_3.models import FormF3Record from apps.core.upload_contracts import ( UploadAnnualSerializer, UploadParseResultSerializer, ) +from apps.form_3.models import FormF3Record from apps.organization.serializers import OrganizationSerializer from rest_framework import serializers diff --git a/src/apps/form_4/serializers.py b/src/apps/form_4/serializers.py index 4c22e08..22db8c5 100644 --- a/src/apps/form_4/serializers.py +++ b/src/apps/form_4/serializers.py @@ -1,10 +1,10 @@ """Сериализаторы формы Ф-4.""" -from apps.form_4.models import FormF4Record from apps.core.upload_contracts import ( UploadHalfYearSerializer, UploadParseResultSerializer, ) +from apps.form_4.models import FormF4Record from apps.organization.serializers import OrganizationSerializer from rest_framework import serializers diff --git a/src/apps/form_5/serializers.py b/src/apps/form_5/serializers.py index 5bcd954..6d1cfca 100644 --- a/src/apps/form_5/serializers.py +++ b/src/apps/form_5/serializers.py @@ -1,10 +1,10 @@ """Сериализаторы формы Ф-5.""" -from apps.form_5.models import FormF5Record from apps.core.upload_contracts import ( UploadAnnualSerializer, UploadParseResultSerializer, ) +from apps.form_5.models import FormF5Record from apps.organization.serializers import OrganizationSerializer from rest_framework import serializers diff --git a/src/apps/form_6/serializers.py b/src/apps/form_6/serializers.py index 8a647ab..464a9c7 100644 --- a/src/apps/form_6/serializers.py +++ b/src/apps/form_6/serializers.py @@ -1,10 +1,10 @@ """Сериализаторы формы Ф-6.""" -from apps.form_6.models import FormF6Record from apps.core.upload_contracts import ( UploadAnnualSerializer, UploadParseResultSerializer, ) +from apps.form_6.models import FormF6Record from apps.organization.serializers import OrganizationSerializer from rest_framework import serializers diff --git a/src/apps/organization/scope_utils.py b/src/apps/organization/scope_utils.py index a52e7f0..815cbdc 100644 --- a/src/apps/organization/scope_utils.py +++ b/src/apps/organization/scope_utils.py @@ -56,9 +56,7 @@ def scope_labels(scope_codes: Iterable[str]) -> list[str]: def get_corporation_scope_dictionary() -> list[dict[str, str | int]]: """Возвращает справочник корпусов для API-словаря.""" items: list[dict[str, str | int]] = [] - for code, sort_order in sorted( - SCOPE_SORT_ORDER.items(), key=lambda item: item[1] - ): + for code, sort_order in sorted(SCOPE_SORT_ORDER.items(), key=lambda item: item[1]): label = SCOPE_LABELS.get(code) short_name = SCOPE_SHORT_NAMES.get(code) if not label or not short_name: diff --git a/src/apps/organization/serializers.py b/src/apps/organization/serializers.py index 90d3b17..849a428 100644 --- a/src/apps/organization/serializers.py +++ b/src/apps/organization/serializers.py @@ -129,7 +129,6 @@ class OrganizationCatalogBaseSerializer(serializers.ModelSerializer): return SCOPE_LABELS.get(scope_code, "") - class OrganizationCatalogListSerializer(OrganizationCatalogBaseSerializer): """Сериализатор списка организаций для `/api/v1/organizations/`.""" diff --git a/src/apps/user/views.py b/src/apps/user/views.py index b078c76..b613835 100644 --- a/src/apps/user/views.py +++ b/src/apps/user/views.py @@ -249,16 +249,19 @@ class AdminUsersManagementView(APIView): return latest_jobs: dict[int, BackgroundJob] = {} - jobs = BackgroundJobService.get_queryset().filter( - user_id__in=user_ids - ).annotate( - _effective_job_ts=Coalesce( - F("completed_at"), - F("started_at"), - F("updated_at"), - F("created_at"), + jobs = ( + BackgroundJobService.get_queryset() + .filter(user_id__in=user_ids) + .annotate( + _effective_job_ts=Coalesce( + F("completed_at"), + F("started_at"), + F("updated_at"), + F("created_at"), + ) ) - ).order_by("user_id", "-_effective_job_ts") + .order_by("user_id", "-_effective_job_ts") + ) for job in jobs: if job.user_id not in latest_jobs: diff --git a/tests/apps/external_data/factories.py b/tests/apps/external_data/factories.py index fc2e9f0..f8acd1d 100644 --- a/tests/apps/external_data/factories.py +++ b/tests/apps/external_data/factories.py @@ -4,9 +4,9 @@ import factory from apps.external_data.models import ( ArbitrationCase, IndustrialProduct, + InformationSecurityRegistryEntry, ProsecutorCheck, PublicProcurement, - InformationSecurityRegistryEntry, ) from faker import Faker @@ -71,9 +71,7 @@ class ArbitrationCaseFactory(factory.django.DjangoModelFactory): decision_date = factory.LazyAttribute(lambda _: fake.date_this_year()) -class InformationSecurityRegistryEntryFactory( - factory.django.DjangoModelFactory -): +class InformationSecurityRegistryEntryFactory(factory.django.DjangoModelFactory): class Meta: model = InformationSecurityRegistryEntry diff --git a/tests/apps/external_data/test_api.py b/tests/apps/external_data/test_api.py index b950023..4147ffd 100644 --- a/tests/apps/external_data/test_api.py +++ b/tests/apps/external_data/test_api.py @@ -11,9 +11,9 @@ from rest_framework.test import APITestCase from tests.apps.external_data.factories import ( ArbitrationCaseFactory, IndustrialProductFactory, + InformationSecurityRegistryEntryFactory, ProsecutorCheckFactory, PublicProcurementFactory, - InformationSecurityRegistryEntryFactory, ) from tests.apps.organization.factories import OrganizationFactory from tests.apps.user.factories import UserFactory diff --git a/tests/apps/forms/test_upload_contracts_api.py b/tests/apps/forms/test_upload_contracts_api.py index cbb4d27..1a36541 100644 --- a/tests/apps/forms/test_upload_contracts_api.py +++ b/tests/apps/forms/test_upload_contracts_api.py @@ -193,19 +193,18 @@ class FormUploadContractsApiTest(APITestCase): def test_upload_processing_error_contract(self): for _, case in self.CASES.items(): - with self.subTest(form=case["form"]): - with patch( - case["parse_target"], - side_effect=RuntimeError("parse failed"), - ) as parse_mock: - response = self.client.post( - case["url"], - self._build_payload(case["payload"], file_size=256), - format="multipart", - ) + with self.subTest(form=case["form"]), patch( + case["parse_target"], + side_effect=RuntimeError("parse failed"), + ) as parse_mock: + response = self.client.post( + case["url"], + self._build_payload(case["payload"], file_size=256), + format="multipart", + ) - self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST) - self.assertEqual(response.data["error_code"], "processing_error") - self.assertEqual(response.data["error_message"], "parse failed") - self.assertEqual(response.data["details"], []) - parse_mock.assert_called_once() + self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST) + self.assertEqual(response.data["error_code"], "processing_error") + self.assertEqual(response.data["error_message"], "parse failed") + self.assertEqual(response.data["details"], []) + parse_mock.assert_called_once() diff --git a/tests/apps/organization/test_analytics_api.py b/tests/apps/organization/test_analytics_api.py index d0b8fa7..3a95900 100644 --- a/tests/apps/organization/test_analytics_api.py +++ b/tests/apps/organization/test_analytics_api.py @@ -183,9 +183,18 @@ class OrganizationAnalyticsApiTest(APITestCase): self.assertEqual(response.data["insurance_contributions"]["amount"], 302000) self.assertEqual(response.data["organization_id"], str(self.organization.id)) self.assertEqual(response.data["report_period"], {"year": 2026, "quarter": 1}) - self.assertEqual(set(response.data["revenue"]), {"amount", "previous_amount", "delta_percent"}) - self.assertEqual(set(response.data["net_profit"]), {"amount", "previous_amount", "delta_percent"}) - self.assertEqual(set(response.data["taxes_paid"]), {"amount", "previous_amount", "delta_percent"}) + self.assertEqual( + set(response.data["revenue"]), + {"amount", "previous_amount", "delta_percent"}, + ) + self.assertEqual( + set(response.data["net_profit"]), + {"amount", "previous_amount", "delta_percent"}, + ) + self.assertEqual( + set(response.data["taxes_paid"]), + {"amount", "previous_amount", "delta_percent"}, + ) self.assertEqual( set(response.data["insurance_contributions"]), {"amount", "previous_amount", "delta_percent"}, @@ -225,7 +234,9 @@ class OrganizationAnalyticsApiTest(APITestCase): "?report_year=2026&history_years=2" ) self.assertEqual(personnel_response.status_code, status.HTTP_200_OK) - self.assertEqual(personnel_response.data["organization_id"], str(self.organization.id)) + self.assertEqual( + personnel_response.data["organization_id"], str(self.organization.id) + ) self.assertEqual(personnel_response.data["report_year"], 2026) self.assertEqual( personnel_response.data["headcount"]["average_employees"], @@ -285,13 +296,21 @@ class OrganizationAnalyticsApiTest(APITestCase): "?frequency=quarterly&price_mode=actual&report_year=2026" ) self.assertEqual(products_response.status_code, status.HTTP_200_OK) - self.assertEqual(products_response.data["organization_id"], str(self.organization.id)) + self.assertEqual( + products_response.data["organization_id"], str(self.organization.id) + ) self.assertEqual(products_response.data["report_year"], 2026) self.assertEqual(products_response.data["frequency"], "quarterly") self.assertEqual(products_response.data["price_mode"], "actual") - self.assertEqual(products_response.data["summary"]["military_output_amount"], 11000000) - self.assertEqual(products_response.data["summary"]["civilian_output_amount"], 7000000) - self.assertEqual(products_response.data["summary"]["hightech_output_amount"], 1500000) + self.assertEqual( + products_response.data["summary"]["military_output_amount"], 11000000 + ) + self.assertEqual( + products_response.data["summary"]["civilian_output_amount"], 7000000 + ) + self.assertEqual( + products_response.data["summary"]["hightech_output_amount"], 1500000 + ) self.assertEqual(products_response.data["summary"]["rd_volume_amount"], 900000) self.assertEqual(len(products_response.data["production_series"]), 1) self.assertEqual(len(products_response.data["sales_series"]), 1)