from django.conf import settings from django.db import models class KnowledgeBase(models.Model): name = models.CharField(max_length=160) description = models.TextField(blank=True) scope = models.CharField(max_length=120, blank=True) enabled = models.BooleanField(default=True) created_by = models.ForeignKey( settings.AUTH_USER_MODEL, null=True, blank=True, on_delete=models.SET_NULL, ) created_at = models.DateTimeField(auto_now_add=True) updated_at = models.DateTimeField(auto_now=True) class Meta: ordering = ["-updated_at"] def __str__(self) -> str: return self.name class KnowledgeDocument(models.Model): knowledge_base = models.ForeignKey( KnowledgeBase, on_delete=models.CASCADE, related_name="documents", ) file_name = models.CharField(max_length=255) file_type = models.CharField(max_length=80, blank=True) storage_path = models.CharField(max_length=500, blank=True) content_text = models.TextField(blank=True) parse_status = models.CharField(max_length=40, default="pending") parse_error = models.TextField(blank=True) created_by = models.ForeignKey( settings.AUTH_USER_MODEL, null=True, blank=True, on_delete=models.SET_NULL, ) created_at = models.DateTimeField(auto_now_add=True) updated_at = models.DateTimeField(auto_now=True) class Meta: ordering = ["-created_at"] class KnowledgeItem(models.Model): knowledge_base = models.ForeignKey( KnowledgeBase, on_delete=models.CASCADE, related_name="items", ) title = models.CharField(max_length=200) problem = models.TextField() applicable_scope = models.TextField(blank=True) error_code = models.CharField(max_length=120, blank=True) root_cause = models.TextField(blank=True) troubleshooting_steps = models.TextField(blank=True) solution = models.TextField() risk_note = models.TextField(blank=True) status = models.CharField(max_length=40, default="draft") source_type = models.CharField(max_length=40, default="manual") source_ticket_id = models.BigIntegerField(null=True, blank=True) created_by = models.ForeignKey( settings.AUTH_USER_MODEL, null=True, blank=True, on_delete=models.SET_NULL, related_name="created_knowledge_items", ) reviewed_by = models.ForeignKey( settings.AUTH_USER_MODEL, null=True, blank=True, on_delete=models.SET_NULL, related_name="reviewed_knowledge_items", ) created_at = models.DateTimeField(auto_now_add=True) updated_at = models.DateTimeField(auto_now=True) class Meta: ordering = ["-updated_at"] class KnowledgeChunk(models.Model): knowledge_base = models.ForeignKey( KnowledgeBase, on_delete=models.CASCADE, related_name="chunks", ) document = models.ForeignKey( KnowledgeDocument, null=True, blank=True, on_delete=models.CASCADE, related_name="chunks", ) item = models.ForeignKey( KnowledgeItem, null=True, blank=True, on_delete=models.CASCADE, related_name="chunks", ) chunk_index = models.PositiveIntegerField(default=0) content = models.TextField() embedding = models.JSONField(default=list, blank=True) embedding_model = models.CharField(max_length=120, default="local-hash-v1") metadata = models.JSONField(default=dict, blank=True) created_at = models.DateTimeField(auto_now_add=True) class Meta: ordering = ["knowledge_base_id", "document_id", "item_id", "chunk_index"] indexes = [ models.Index(fields=["knowledge_base", "chunk_index"]), ]