feat(admin): expand exchange admin and unify admin UX
Some checks failed
CI/CD Pipeline / Code Quality Checks (pull_request) Failing after 2m39s
CI/CD Pipeline / Run Tests (pull_request) Successful in 3m0s
CI/CD Pipeline / Run API Inventory E2E Tests (pull_request) Successful in 35s
CI/CD Pipeline / Telegram Notify Success (pull_request) Has been skipped

This commit is contained in:
2026-03-24 13:58:24 +01:00
parent 559b9bc5ef
commit c98ba76081
33 changed files with 2915 additions and 209 deletions

View File

@@ -4,6 +4,7 @@ from datetime import date, timedelta
from unittest.mock import patch
from apps.core.admin import BackgroundJobAdmin
from apps.core.admin_dashboard import build_admin_dashboard
from apps.core.models import BackgroundJob
from apps.parsers.models import FinancialReport, FinancialReportLine, ParserLoadLog
from django.contrib.admin.sites import AdminSite
@@ -165,13 +166,26 @@ class AdminDashboardTest(TestCase):
IndustrialCertificateRecordFactory(inn="7700000001")
ManufacturerRecordFactory(inn="7700000002")
InspectionRecordFactory(inn="7800000001")
ProcurementRecordFactory(region_code="77", customer_inn="7700000001")
ProcurementRecordFactory(region_code="77", customer_inn="7700000002")
ProcurementRecordFactory(region_code="78", customer_inn="7800000001")
ProcurementRecordFactory(
load_batch=303,
region_code="77",
customer_inn="7700000001",
)
ProcurementRecordFactory(
load_batch=303,
region_code="77",
customer_inn="7700000002",
)
ProcurementRecordFactory(
load_batch=303,
region_code="78",
customer_inn="7800000001",
)
ProxyFactory(is_active=True)
ParserLoadLogFactory(
source=ParserLoadLog.Source.PROCUREMENTS,
batch_id=303,
status="success",
records_count=3,
)
@@ -185,6 +199,7 @@ class AdminDashboardTest(TestCase):
response = self.client.get(reverse("admin:index"))
self.assertEqual(response.status_code, 200)
self.assertNotContains(response, "Mostovik")
self.assertContains(response, "Панель данных и загрузок")
self.assertContains(response, "Обзор")
self.assertContains(response, "Аналитика")
@@ -204,3 +219,65 @@ class AdminDashboardTest(TestCase):
response,
reverse("admin:parsers_financialreport_upload_excel"),
)
def test_dashboard_source_cards_use_latest_successful_source_slice(self):
InspectionRecordFactory(load_batch=101, registration_number="old-1")
InspectionRecordFactory(load_batch=101, registration_number="old-2")
InspectionRecordFactory(load_batch=202, registration_number="new-1")
ParserLoadLogFactory(
source=ParserLoadLog.Source.INSPECTIONS,
batch_id=101,
status=ParserLoadLog.Status.SUCCESS,
records_count=2,
)
ParserLoadLogFactory(
source=ParserLoadLog.Source.INSPECTIONS,
batch_id=202,
status=ParserLoadLog.Status.SUCCESS,
records_count=1,
)
dashboard = build_admin_dashboard()
cards = {item["slug"]: item for item in dashboard["source_cards"]}
self.assertEqual(cards["planned-inspections"]["records_count"], 1)
self.assertEqual(cards["planned-inspections"]["organizations_count"], 1)
self.assertEqual(
cards["planned-inspections"]["metrics_scope_label"],
"Последний успешный срез",
)
def test_dashboard_regions_use_latest_successful_procurements_batch(self):
ProcurementRecordFactory(
load_batch=11,
purchase_number="1111111111111111111",
region_code="77",
customer_inn="7700000001",
)
ProcurementRecordFactory(
load_batch=22,
purchase_number="2222222222222222222",
region_code="78",
customer_inn="7800000001",
)
ParserLoadLogFactory(
source=ParserLoadLog.Source.PROCUREMENTS,
batch_id=11,
status=ParserLoadLog.Status.SUCCESS,
records_count=1,
)
ParserLoadLogFactory(
source=ParserLoadLog.Source.PROCUREMENTS,
batch_id=22,
status=ParserLoadLog.Status.SUCCESS,
records_count=1,
)
dashboard = build_admin_dashboard()
self.assertEqual(len(dashboard["region_rows"]), 1)
self.assertEqual(dashboard["region_rows"][0]["code"], "78")
self.assertEqual(
dashboard["region_rows_note"],
"Показываем только последний успешный срез ЕИС закупок.",
)