from django.db import migrations from django.utils import timezone KNOWLEDGE_FIELDS = ( "knowledge_base_id", "title", "problem", "applicable_scope", "category_code", "related_system", "environment_scope", "error_code", "root_cause", "troubleshooting_steps", "solution", "risk_note", "source_type", "source_ticket_id", ) PLAN_FIELDS = ( "knowledge_base_id", "title", "problem_pattern", "applicable_scope", "category_code", "related_system", "environment_scope", "decision_rules", "troubleshooting_steps", "risk_note", "source_ticket_id", ) SOLUTION_FIELDS = ( "title", "problem_signature", "related_system", "environment_scope", "category_id", "root_cause", "solution", "risk_note", "allow_auto_resolve", "requires_human_action", "requires_external_confirmation", "requires_production_change", ) def backfill_governed_assets(apps, schema_editor): GovernedAsset = apps.get_model("knowledge", "GovernedAsset") GovernedAssetVersion = apps.get_model("knowledge", "GovernedAssetVersion") KnowledgeItem = apps.get_model("knowledge", "KnowledgeItem") TroubleshootingPlan = apps.get_model("knowledge", "TroubleshootingPlan") Solution = apps.get_model("solutions", "Solution") now = timezone.now() definitions = ( ("knowledge_item", KnowledgeItem, KNOWLEDGE_FIELDS), ("troubleshooting_plan", TroubleshootingPlan, PLAN_FIELDS), ("solution", Solution, SOLUTION_FIELDS), ) for asset_type, model, fields in definitions: for instance in model.objects.all().iterator(): asset, _ = GovernedAsset.objects.get_or_create( asset_type=asset_type, object_id=instance.id, defaults={"created_by_id": instance.created_by_id}, ) if asset.versions.exists(): continue original_status = instance.status if original_status == "published": version_status = "published" elif original_status in {"offline", "disabled"}: version_status = "offline" if original_status == "disabled": instance.status = "offline" instance.save(update_fields=["status"]) else: version_status = "draft" version = GovernedAssetVersion.objects.create( asset=asset, version=1, status=version_status, content={field: getattr(instance, field) for field in fields}, created_by_id=instance.created_by_id, published_at=now if version_status == "published" else None, offline_at=now if version_status == "offline" else None, ) if version_status == "published": asset.current_published_version = version asset.save(update_fields=["current_published_version"]) class Migration(migrations.Migration): dependencies = [ ("knowledge", "0005_alter_knowledgechunk_options_governedasset_and_more"), ("solutions", "0003_solution_allow_auto_resolve_and_more"), ] operations = [ migrations.RunPython(backfill_governed_assets, migrations.RunPython.noop), ]