feat(admin): add excel upload flows for FNS reports and register lists
Some checks failed
CI/CD Pipeline / Code Quality Checks (push) Failing after 6m24s
CI/CD Pipeline / Run Tests (push) Successful in 20m30s
CI/CD Pipeline / Telegram Notify Success (push) Has been skipped

This commit is contained in:
2026-03-20 12:31:22 +01:00
parent c4b5b7f2c2
commit e470189f44
8 changed files with 485 additions and 5 deletions

View File

@@ -244,3 +244,7 @@ class ParsersAdminTest(TestCase):
)
self.assertEqual(admin.lines_count(report), 1)
self.assertIn("span", str(admin.status_badge(report)))
self.assertIn("registry_organization", admin.list_display)
self.assertIn("registry_organization__pn_name", admin.search_fields)
route_names = [route.name for route in admin.get_urls()]
self.assertIn("parsers_financialreport_upload_excel", route_names)

View File

@@ -0,0 +1,102 @@
"""Tests for registers admin configuration."""
import io
from apps.registers.admin import RegisterUploadAdmin
from apps.registers.models import Organization, RegisterUpload, RegistryMembershipPeriod
from django.contrib.admin.sites import AdminSite
from django.contrib.messages.storage.fallback import FallbackStorage
from django.core.files.uploadedfile import SimpleUploadedFile
from django.test import RequestFactory, TestCase
from openpyxl import Workbook
from tests.apps.registers.factories import RegisterFactory
from tests.apps.user.factories import UserFactory
def _build_register_excel_upload(filename: str = "registry.xlsx") -> SimpleUploadedFile:
workbook = Workbook()
worksheet = workbook.active
worksheet.append(["pn_name", "mn_ogrn", "mn_inn", "in_kpp", "mn_okpo"])
worksheet.append(
[
'АО "Тестовая организация"',
1027600980990,
7601000086,
760401001,
"07506197",
]
)
buffer = io.BytesIO()
workbook.save(buffer)
workbook.close()
return SimpleUploadedFile(
filename,
buffer.getvalue(),
content_type="application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",
)
class RegistersAdminTest(TestCase):
def setUp(self):
self.site = AdminSite()
self.factory = RequestFactory()
self.user = UserFactory.create_superuser()
def _post_request(self, data):
request = self.factory.post(
"/admin/registers/registerupload/upload-excel/",
data=data,
)
request.user = self.user
request.session = {}
request._messages = FallbackStorage(request)
return request
def test_register_upload_admin_has_custom_upload_route(self):
admin = RegisterUploadAdmin(RegisterUpload, self.site)
route_names = [route.name for route in admin.get_urls()]
self.assertIn("registers_registerupload_upload_excel", route_names)
def test_register_upload_admin_upload_excel_success(self):
admin = RegisterUploadAdmin(RegisterUpload, self.site)
registry = RegisterFactory()
uploaded_file = _build_register_excel_upload()
request = self._post_request(
{
"registry": str(registry.id),
"actual_date": "2026-03-20",
"file": uploaded_file,
}
)
response = admin.upload_excel_view(request)
self.assertEqual(response.status_code, 302)
self.assertEqual(RegisterUpload.objects.count(), 1)
self.assertEqual(Organization.objects.count(), 1)
self.assertEqual(RegistryMembershipPeriod.objects.count(), 1)
upload = RegisterUpload.objects.first()
self.assertEqual(upload.registry, registry)
self.assertEqual(upload.actual_date.isoformat(), "2026-03-20")
def test_register_upload_admin_upload_excel_invalid_extension(self):
admin = RegisterUploadAdmin(RegisterUpload, self.site)
registry = RegisterFactory()
invalid_file = SimpleUploadedFile("registry.txt", b"text/plain")
request = self._post_request(
{
"registry": str(registry.id),
"actual_date": "2026-03-20",
"file": invalid_file,
}
)
response = admin.upload_excel_view(request)
self.assertEqual(response.status_code, 302)
self.assertEqual(RegisterUpload.objects.count(), 0)