4.4 KiB
Polymorphic Organization Sources Implementation Plan
For agentic workers: REQUIRED SUB-SKILL: Use superpowers:subagent-driven-development (recommended) or superpowers:executing-plans to implement this plan task-by-task. Steps use checkbox (
- [ ]) syntax for tracking.
Goal: Replace source-centric parser output access with organization-centric polymorphic source extensions.
Architecture: Keep Organization as the root entity. Add polymorphic source extensions per product source group and a shared subordinate source-record table. Backfill legacy parser tables idempotently, then switch API v2 to the new extension data.
Tech Stack: Django 3.2, Django REST Framework, django-filter, django-polymorphic, PostgreSQL, pytest.
Task 1: Dependency And Schema
Files:
-
Modify:
pyproject.toml -
Modify:
uv.lock -
Modify:
src/settings/base.py -
Modify:
src/organizations/models.py -
Create:
src/organizations/migrations/0006_polymorphic_source_extensions.py -
Test:
tests/apps/organizations/test_source_extensions_models.py -
Add
django-polymorphicto project dependencies. -
Add
"polymorphic"toINSTALLED_APPSbefore local apps. -
Add source-group and identity-status choices.
-
Add
identity_statusandprimary_identitytoOrganization. -
Add
OrganizationSourceExtensionasPolymorphicModel. -
Add source extension subclasses.
-
Add
OrganizationSourceRecord. -
Add
OrganizationSourceFinancialLine. -
Write tests proving:
- one extension per
(organization, source_group); - polymorphic queries return subclass instances;
- source records are unique by legacy model/pk;
- financial lines attach to a source record.
- one extension per
Task 2: Backfill Service
Files:
-
Create:
src/organizations/source_groups.py -
Create:
src/organizations/source_backfill.py -
Create:
src/organizations/management/commands/backfill_organization_sources.py -
Test:
tests/apps/organizations/test_source_backfill.py -
Define source group mapping for all legacy parser sources.
-
Implement organization resolution by
inn + kpp,ogrn,ogrip, uniqueinn, then normalized name. -
Implement idempotent extension creation/update.
-
Implement idempotent source record creation/update.
-
Preserve legacy row payload and
(legacy_model, legacy_pk). -
Backfill financial report lines into
OrganizationSourceFinancialLine. -
Report scanned, created organizations, created extensions, updated extensions, created records, updated records, unresolved rows.
Task 3: API v2 Switch
Files:
-
Modify:
src/organizations/serializers.py -
Modify:
src/organizations/filters.py -
Modify:
src/organizations/views.py -
Delete or stop using:
src/organizations/api_enrichment.py -
Delete or stop using:
src/organizations/services.pysnapshot refresh paths -
Test:
tests/apps/organizations/test_api_v2.py -
Replace embedded
dataJSON with compactsources. -
Add source extension list/detail serializers.
-
Add source records endpoint.
-
Rework source filters to use
OrganizationSourceExtension. -
Remove snapshot dependency from list/retrieve behavior.
-
Keep old snapshot management command only as deprecated/no-op until cleanup.
Task 4: Parser Write Path
Files:
-
Modify:
src/apps/parsers/tasks.py -
Modify:
src/organizations/tasks.py -
Test:
tests/apps/parsers/test_tasks.py -
Test:
tests/apps/organizations/test_tasks.py -
Replace snapshot refresh queueing with source backfill queueing for affected parser batches.
-
For each parser completion, backfill only the completed source/batch.
-
Keep full backfill command for initial migration and repair.
Task 5: Frontend Contract Repair
Files:
-
Modify frontend generated API clients after backend OpenAPI changes.
-
Modify source detail table composables to consume
sourcesand source records endpoints. -
Regenerate API client.
-
Update source pages to request extension records instead of embedded
organization.data[source]. -
Verify planned inspections page loads from source records.
Task 6: Cleanup Phase
Files:
-
Modify migrations only after successful backfill validation.
-
Remove
OrganizationDataSnapshot. -
Remove snapshot refresh schedules.
-
Decide which legacy parser tables remain as ingestion staging and which can be dropped.
-
Run full backend and frontend validation.