feat: export registry memberships to state corp
This commit is contained in:
@@ -96,6 +96,10 @@ class StateCorpExchangeService:
|
|||||||
}
|
}
|
||||||
data = {
|
data = {
|
||||||
"organizations": cls._serialize_organizations(organizations),
|
"organizations": cls._serialize_organizations(organizations),
|
||||||
|
"registry_memberships": cls._serialize_registry_memberships(
|
||||||
|
organizations=organizations,
|
||||||
|
actual_date=snapshot_date,
|
||||||
|
),
|
||||||
"industrial_certificates": cls._serialize_industrial_certificates(
|
"industrial_certificates": cls._serialize_industrial_certificates(
|
||||||
allowed_inns
|
allowed_inns
|
||||||
),
|
),
|
||||||
@@ -123,6 +127,7 @@ class StateCorpExchangeService:
|
|||||||
"package_id": package_id,
|
"package_id": package_id,
|
||||||
"source_system": source_system,
|
"source_system": source_system,
|
||||||
"produced_at": produced_at.isoformat(),
|
"produced_at": produced_at.isoformat(),
|
||||||
|
"actual_date": snapshot_date.isoformat(),
|
||||||
"schema_version": cls.SCHEMA_VERSION,
|
"schema_version": cls.SCHEMA_VERSION,
|
||||||
"sections": [key for key, items in data.items() if items],
|
"sections": [key for key, items in data.items() if items],
|
||||||
},
|
},
|
||||||
@@ -323,6 +328,47 @@ class StateCorpExchangeService:
|
|||||||
for item in organizations
|
for item in organizations
|
||||||
]
|
]
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def _serialize_registry_memberships(
|
||||||
|
cls,
|
||||||
|
*,
|
||||||
|
organizations: list[Organization],
|
||||||
|
actual_date: date,
|
||||||
|
) -> list[dict[str, str | None]]:
|
||||||
|
organization_ids = [organization.id for organization in organizations]
|
||||||
|
if not organization_ids:
|
||||||
|
return []
|
||||||
|
|
||||||
|
memberships = (
|
||||||
|
RegistryMembershipPeriod.objects.select_related("registry", "organization")
|
||||||
|
.filter(
|
||||||
|
organization_id__in=organization_ids,
|
||||||
|
registry__name__in=cls.ROSATOM_ROSCOSMOS_REGISTRY_NAMES,
|
||||||
|
started_at__lte=actual_date,
|
||||||
|
)
|
||||||
|
.filter(Q(ended_at__isnull=True) | Q(ended_at__gt=actual_date))
|
||||||
|
.order_by(
|
||||||
|
"registry__name",
|
||||||
|
"organization__mn_inn",
|
||||||
|
"started_at",
|
||||||
|
"id",
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
|
return [
|
||||||
|
{
|
||||||
|
"organization_inn": str(membership.organization.mn_inn),
|
||||||
|
"registry_name": membership.registry.name,
|
||||||
|
"started_at": membership.started_at.isoformat(),
|
||||||
|
"ended_at": (
|
||||||
|
membership.ended_at.isoformat()
|
||||||
|
if membership.ended_at and membership.ended_at <= actual_date
|
||||||
|
else None
|
||||||
|
),
|
||||||
|
}
|
||||||
|
for membership in memberships
|
||||||
|
]
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def _serialize_industrial_certificates(
|
def _serialize_industrial_certificates(
|
||||||
cls,
|
cls,
|
||||||
|
|||||||
@@ -260,6 +260,7 @@ class StateCorpExchangeServiceTest(TestCase):
|
|||||||
|
|
||||||
package = StateCorpExchangeService.build_package(actual_date="2026-03-15")
|
package = StateCorpExchangeService.build_package(actual_date="2026-03-15")
|
||||||
self.assertEqual(package.payload_counts["organizations"], 1)
|
self.assertEqual(package.payload_counts["organizations"], 1)
|
||||||
|
self.assertEqual(package.payload_counts["registry_memberships"], 1)
|
||||||
self.assertEqual(package.payload_counts["industrial_certificates"], 1)
|
self.assertEqual(package.payload_counts["industrial_certificates"], 1)
|
||||||
self.assertEqual(package.payload_counts["manufacturers"], 1)
|
self.assertEqual(package.payload_counts["manufacturers"], 1)
|
||||||
self.assertEqual(package.payload_counts["industrial_products"], 1)
|
self.assertEqual(package.payload_counts["industrial_products"], 1)
|
||||||
@@ -277,6 +278,15 @@ class StateCorpExchangeServiceTest(TestCase):
|
|||||||
self.assertEqual(payload["format"], StateCorpExchangeService.PAYLOAD_FORMAT)
|
self.assertEqual(payload["format"], StateCorpExchangeService.PAYLOAD_FORMAT)
|
||||||
self.assertEqual(payload["manifest"]["source_system"], "mostovik")
|
self.assertEqual(payload["manifest"]["source_system"], "mostovik")
|
||||||
self.assertEqual(payload["data"]["organizations"][0]["inn"], "7707083893")
|
self.assertEqual(payload["data"]["organizations"][0]["inn"], "7707083893")
|
||||||
|
self.assertEqual(
|
||||||
|
payload["data"]["registry_memberships"][0],
|
||||||
|
{
|
||||||
|
"organization_inn": "7707083893",
|
||||||
|
"registry_name": "Реестр госкорпорации Росатом",
|
||||||
|
"started_at": "2026-01-01",
|
||||||
|
"ended_at": None,
|
||||||
|
},
|
||||||
|
)
|
||||||
self.assertEqual(
|
self.assertEqual(
|
||||||
payload["data"]["industrial_certificates"][0]["certificate_number"],
|
payload["data"]["industrial_certificates"][0]["certificate_number"],
|
||||||
"cert-001",
|
"cert-001",
|
||||||
@@ -395,6 +405,13 @@ class StateCorpExchangeServiceTest(TestCase):
|
|||||||
[item["inn"] for item in payload["data"]["organizations"]],
|
[item["inn"] for item in payload["data"]["organizations"]],
|
||||||
[str(target.mn_inn)],
|
[str(target.mn_inn)],
|
||||||
)
|
)
|
||||||
|
self.assertEqual(
|
||||||
|
[
|
||||||
|
(item["organization_inn"], item["registry_name"])
|
||||||
|
for item in payload["data"]["registry_memberships"]
|
||||||
|
],
|
||||||
|
[(str(target.mn_inn), "Реестр госкорпорации Роскосмос")],
|
||||||
|
)
|
||||||
self.assertEqual(
|
self.assertEqual(
|
||||||
[
|
[
|
||||||
item["registry_number"]
|
item["registry_number"]
|
||||||
|
|||||||
Reference in New Issue
Block a user