feat: use authoritative organization directory
Some checks failed
CI/CD Pipeline / Quality Gate (push) Failing after 9s
CI/CD Pipeline / Build and Push Images (push) Has been skipped
CI/CD Pipeline / Deploy Dev via Compose (push) Has been skipped
CI/CD Pipeline / Internal Notify (push) Successful in 0s

This commit is contained in:
2026-06-07 16:04:43 +02:00
parent 79f0f8ebf7
commit 6ba8fa8d88
41 changed files with 2781 additions and 1058 deletions

View File

@@ -2,6 +2,7 @@
from __future__ import annotations
import hashlib
from pathlib import Path
from tempfile import TemporaryDirectory
@@ -9,17 +10,16 @@ from apps.core.models import BackgroundJob, JobStatus
from apps.parsers.models import ParserLoadLog
from apps.parsers.source_cards import SourceCardService
from django.test import override_settings
from django.urls import reverse
from django.urls import NoReverseMatch, reverse
from organizations.models import Organization
from organizations.source_ingestion import (
OrganizationSourceIngestionService,
SourceRecordInput,
)
from registers.models import Register
from rest_framework import status
from rest_framework.test import APITestCase
from tests.apps.parsers.factories import ParserLoadLogFactory
from tests.apps.registers.factories import RegistryMembershipPeriodFactory
from tests.apps.user.factories import UserFactory
from tests.utils.fixtures import fake
@@ -37,6 +37,27 @@ def _save_source_record(
organization_name: str = "",
title: str = "",
) -> None:
payload: dict = {}
if inn or ogrn:
query = {}
if inn:
query["inn"] = inn
if ogrn:
query["ogrn"] = ogrn
if not Organization.objects.filter(**query).exists():
Organization.objects.create(
name=organization_name or title or external_id,
inn=inn,
ogrn=ogrn,
)
else:
rn_key = organization_name or title or external_id
rn = str(int(hashlib.sha256(rn_key.encode()).hexdigest()[:12], 16) % 10**12)
payload["rn"] = rn
Organization.objects.get_or_create(
rn=rn,
defaults={"name": organization_name or title or external_id},
)
OrganizationSourceIngestionService.save_records(
source=source,
load_batch=1,
@@ -47,6 +68,7 @@ def _save_source_record(
organization_name=organization_name or title or external_id,
inn=inn,
ogrn=ogrn,
payload=payload,
)
],
)
@@ -109,38 +131,11 @@ class SourceCardsApiTestCase(APITestCase):
self.assertEqual(inspections_card["status"], "in_progress")
self.assertEqual(inspections_card["progress"], 63)
def test_main_dashboard_returns_cached_source_cards_and_registry_stats(self):
registry, _created = Register.objects.get_or_create(
name="Реестр предприятий ОПК",
)
RegistryMembershipPeriodFactory(
registry=registry,
)
ParserLoadLogFactory(
source=ParserLoadLog.Source.FNS_REPORTS,
status="success",
records_count=1,
)
SourceCardService.clear_cache()
def test_main_dashboard_route_is_removed_with_registers_api(self):
with self.assertRaises(NoReverseMatch):
reverse("api_v1:stat:main-dashboard")
response = self.client.get(reverse("api_v1:stat:main-dashboard"))
self.assertEqual(response.status_code, status.HTTP_200_OK)
self.assertTrue(response.data["success"])
self.assertEqual(response["X-Cache"], "MISS")
data = response.data["data"]
self.assertIn("source_cards", data)
self.assertIn("organization_stats", data)
self.assertGreaterEqual(len(data["source_cards"]), 1)
self.assertEqual(data["organization_stats"]["counts"]["opk"], 1)
self.assertEqual(data["cache_ttl_seconds"], 604800)
cached_response = self.client.get(reverse("api_v1:stat:main-dashboard"))
self.assertEqual(cached_response.status_code, status.HTTP_200_OK)
self.assertEqual(cached_response["X-Cache"], "HIT")
def test_main_dashboard_cache_is_warmed_after_successful_parser_load(self):
def test_successful_parser_load_does_not_restore_removed_stat_route(self):
with self.captureOnCommitCallbacks(execute=True):
ParserLoadLogFactory(
source=ParserLoadLog.Source.FNS_REPORTS,
@@ -148,10 +143,8 @@ class SourceCardsApiTestCase(APITestCase):
records_count=1,
)
response = self.client.get(reverse("api_v1:stat:main-dashboard"))
self.assertEqual(response.status_code, status.HTTP_200_OK)
self.assertEqual(response["X-Cache"], "HIT")
with self.assertRaises(NoReverseMatch):
reverse("api_v1:stat:main-dashboard")
def test_source_card_detail_returns_combined_minprom_stats(self):
shared_inn = _digits(10)