feat: add trusted ticket intake backend
This commit is contained in:
@@ -1,5 +1,13 @@
|
||||
import uuid
|
||||
from datetime import timedelta
|
||||
|
||||
from django.conf import settings
|
||||
from django.db import models
|
||||
from django.utils import timezone
|
||||
|
||||
|
||||
def default_ticket_draft_expiry():
|
||||
return timezone.now() + timedelta(hours=24)
|
||||
|
||||
|
||||
class TicketStatus(models.TextChoices):
|
||||
@@ -132,6 +140,91 @@ class TicketAttachment(models.Model):
|
||||
created_at = models.DateTimeField(auto_now_add=True)
|
||||
|
||||
|
||||
class TicketDraft(models.Model):
|
||||
public_id = models.UUIDField(default=uuid.uuid4, unique=True, editable=False)
|
||||
created_by = models.ForeignKey(
|
||||
settings.AUTH_USER_MODEL,
|
||||
on_delete=models.CASCADE,
|
||||
related_name="ticket_drafts",
|
||||
)
|
||||
status = models.CharField(max_length=24, default="editing")
|
||||
revision = models.PositiveIntegerField(default=1)
|
||||
source_text = models.TextField(blank=True)
|
||||
current_fields = models.JSONField(default=dict)
|
||||
last_ai_fields = models.JSONField(default=dict)
|
||||
missing_fields = models.JSONField(default=list)
|
||||
questions = models.JSONField(default=list)
|
||||
guided_rounds = models.PositiveSmallIntegerField(default=0)
|
||||
latest_agent_run = models.ForeignKey(
|
||||
"agents.AgentRun",
|
||||
null=True,
|
||||
blank=True,
|
||||
on_delete=models.SET_NULL,
|
||||
related_name="ticket_drafts",
|
||||
)
|
||||
latest_artifact = models.ForeignKey(
|
||||
"agents.AgentArtifact",
|
||||
null=True,
|
||||
blank=True,
|
||||
on_delete=models.SET_NULL,
|
||||
related_name="ticket_drafts",
|
||||
)
|
||||
confirmed_ticket = models.OneToOneField(
|
||||
Ticket,
|
||||
null=True,
|
||||
blank=True,
|
||||
on_delete=models.PROTECT,
|
||||
related_name="source_draft",
|
||||
)
|
||||
decision = models.CharField(max_length=24, blank=True)
|
||||
error_code = models.CharField(max_length=80, blank=True)
|
||||
error_message = models.TextField(blank=True)
|
||||
expires_at = models.DateTimeField(default=default_ticket_draft_expiry)
|
||||
created_at = models.DateTimeField(auto_now_add=True)
|
||||
updated_at = models.DateTimeField(auto_now=True)
|
||||
confirmed_at = models.DateTimeField(null=True, blank=True)
|
||||
|
||||
class Meta:
|
||||
ordering = ["-updated_at"]
|
||||
indexes = [
|
||||
models.Index(fields=["created_by", "status", "updated_at"]),
|
||||
models.Index(fields=["status", "expires_at"]),
|
||||
]
|
||||
|
||||
|
||||
class TicketDraftMessage(models.Model):
|
||||
draft = models.ForeignKey(TicketDraft, on_delete=models.CASCADE, related_name="messages")
|
||||
role = models.CharField(max_length=24)
|
||||
content = models.TextField()
|
||||
round_number = models.PositiveSmallIntegerField(default=0)
|
||||
created_at = models.DateTimeField(auto_now_add=True)
|
||||
|
||||
class Meta:
|
||||
ordering = ["created_at"]
|
||||
|
||||
|
||||
class TicketDraftImage(models.Model):
|
||||
public_id = models.UUIDField(default=uuid.uuid4, unique=True, editable=False)
|
||||
draft = models.ForeignKey(TicketDraft, on_delete=models.CASCADE, related_name="images")
|
||||
file_name = models.CharField(max_length=255)
|
||||
mime_type = models.CharField(max_length=120)
|
||||
file_size = models.PositiveBigIntegerField()
|
||||
sha256 = models.CharField(max_length=64)
|
||||
storage_path = models.CharField(max_length=500)
|
||||
status = models.CharField(max_length=24, default="temporary")
|
||||
confirmed_attachment = models.OneToOneField(
|
||||
TicketAttachment,
|
||||
null=True,
|
||||
blank=True,
|
||||
on_delete=models.SET_NULL,
|
||||
related_name="source_draft_image",
|
||||
)
|
||||
created_at = models.DateTimeField(auto_now_add=True)
|
||||
|
||||
class Meta:
|
||||
ordering = ["created_at"]
|
||||
|
||||
|
||||
class TicketEvent(models.Model):
|
||||
ticket = models.ForeignKey(Ticket, on_delete=models.CASCADE, related_name="events")
|
||||
event_type = models.CharField(max_length=80)
|
||||
|
||||
Reference in New Issue
Block a user