feat: add governed knowledge lifecycle
This commit is contained in:
@@ -0,0 +1,105 @@
|
||||
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),
|
||||
]
|
||||
Reference in New Issue
Block a user