Files
ai-ticket-platform/backend/apps/knowledge/migrations/0006_backfill_governed_assets.py
2026-07-27 19:01:19 +08:00

106 lines
3.3 KiB
Python

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),
]