from datetime import datetime from typing import Any from uuid import UUID from ninja import Schema class KnowledgeBaseIn(Schema): name: str description: str = "" scope: str = "" enabled: bool = True class KnowledgeBaseOut(Schema): id: int name: str description: str scope: str enabled: bool created_at: datetime updated_at: datetime class KnowledgeDocumentIn(Schema): knowledge_base_id: int file_name: str file_type: str = "" content: str class KnowledgeDocumentOut(Schema): id: int public_id: UUID knowledge_base_id: int file_name: str file_type: str extension: str mime_type: str file_size: int sha256: str scan_status: str scan_result: dict[str, Any] parse_status: str parse_error: str processing_attempts: int task_id: str has_original: bool indexed_at: datetime | None created_at: datetime updated_at: datetime class KnowledgeItemIn(Schema): knowledge_base_id: int title: str problem: str applicable_scope: str = "" category_code: str = "" related_system: str = "" environment_scope: str = "" error_code: str = "" root_cause: str = "" troubleshooting_steps: str = "" solution: str risk_note: str = "" status: str = "draft" class KnowledgeItemOut(Schema): id: int knowledge_base_id: int title: str problem: str applicable_scope: str category_code: str related_system: str environment_scope: str error_code: str root_cause: str troubleshooting_steps: str solution: str risk_note: str status: str source_type: str created_at: datetime updated_at: datetime class KnowledgeSearchIn(Schema): query: str knowledge_base_id: int | None = None limit: int = 5 class KnowledgeSearchResultOut(Schema): id: int knowledge_base_id: int title: str source_type: str content: str score: float metadata: dict class TroubleshootingPlanIn(Schema): knowledge_base_id: int title: str problem_pattern: str applicable_scope: str = "" category_code: str = "" related_system: str = "" environment_scope: str = "" decision_rules: str = "" troubleshooting_steps: str risk_note: str = "" source_ticket_id: int | None = None class TroubleshootingPlanOut(Schema): id: int knowledge_base_id: int title: str problem_pattern: str applicable_scope: str category_code: str related_system: str environment_scope: str decision_rules: str troubleshooting_steps: str risk_note: str status: str source_ticket_id: int | None created_at: datetime updated_at: datetime class AssetVersionUpdateIn(Schema): content: dict[str, Any] change_summary: str | None = None class AssetRevisionIn(Schema): change_summary: str = "" class AssetReviewIn(Schema): comment: str = "" class AssetRollbackIn(Schema): source_version: int change_summary: str = "" class GovernedAssetVersionOut(Schema): id: int version: int status: str content: dict[str, Any] change_summary: str source_version: int | None created_by_id: int | None submitted_by_id: int | None reviewed_by_id: int | None review_comment: str created_at: datetime updated_at: datetime submitted_at: datetime | None reviewed_at: datetime | None published_at: datetime | None offline_at: datetime | None class GovernedAssetOut(Schema): public_id: UUID asset_type: str object_id: int current_published_version: int | None versions: list[GovernedAssetVersionOut] created_at: datetime updated_at: datetime class AssetVersionComparisonOut(Schema): left_version: int right_version: int changes: list[dict[str, Any]] class AssetImpactOut(Schema): ticket_reference_count: int ticket_adoption_count: int support_analysis_count: int agent_run_ids: list[str]