feat: add trusted ticket intake backend

This commit is contained in:
hailin
2026-07-16 19:37:32 +08:00
parent b592dc219d
commit bcd6de4609
28 changed files with 1966 additions and 42 deletions

View File

@@ -0,0 +1,169 @@
# Generated by Django 5.2.15 on 2026-07-16 11:13
import uuid
import django.db.models.deletion
from django.conf import settings
from django.db import migrations, models
import apps.tickets.models
class Migration(migrations.Migration):
dependencies = [
("agents", "0002_agentartifact"),
("tickets", "0003_repair_closed_resolved_flags"),
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
]
operations = [
migrations.CreateModel(
name="TicketDraft",
fields=[
(
"id",
models.BigAutoField(
auto_created=True, primary_key=True, serialize=False, verbose_name="ID"
),
),
("public_id", models.UUIDField(default=uuid.uuid4, editable=False, unique=True)),
("status", models.CharField(default="editing", max_length=24)),
("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)),
("decision", models.CharField(blank=True, max_length=24)),
("error_code", models.CharField(blank=True, max_length=80)),
("error_message", models.TextField(blank=True)),
(
"expires_at",
models.DateTimeField(default=apps.tickets.models.default_ticket_draft_expiry),
),
("created_at", models.DateTimeField(auto_now_add=True)),
("updated_at", models.DateTimeField(auto_now=True)),
("confirmed_at", models.DateTimeField(blank=True, null=True)),
(
"confirmed_ticket",
models.OneToOneField(
blank=True,
null=True,
on_delete=django.db.models.deletion.PROTECT,
related_name="source_draft",
to="tickets.ticket",
),
),
(
"created_by",
models.ForeignKey(
on_delete=django.db.models.deletion.CASCADE,
related_name="ticket_drafts",
to=settings.AUTH_USER_MODEL,
),
),
(
"latest_agent_run",
models.ForeignKey(
blank=True,
null=True,
on_delete=django.db.models.deletion.SET_NULL,
related_name="ticket_drafts",
to="agents.agentrun",
),
),
(
"latest_artifact",
models.ForeignKey(
blank=True,
null=True,
on_delete=django.db.models.deletion.SET_NULL,
related_name="ticket_drafts",
to="agents.agentartifact",
),
),
],
options={
"ordering": ["-updated_at"],
},
),
migrations.CreateModel(
name="TicketDraftImage",
fields=[
(
"id",
models.BigAutoField(
auto_created=True, primary_key=True, serialize=False, verbose_name="ID"
),
),
("public_id", models.UUIDField(default=uuid.uuid4, editable=False, unique=True)),
("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(default="temporary", max_length=24)),
("created_at", models.DateTimeField(auto_now_add=True)),
(
"confirmed_attachment",
models.OneToOneField(
blank=True,
null=True,
on_delete=django.db.models.deletion.SET_NULL,
related_name="source_draft_image",
to="tickets.ticketattachment",
),
),
(
"draft",
models.ForeignKey(
on_delete=django.db.models.deletion.CASCADE,
related_name="images",
to="tickets.ticketdraft",
),
),
],
options={
"ordering": ["created_at"],
},
),
migrations.CreateModel(
name="TicketDraftMessage",
fields=[
(
"id",
models.BigAutoField(
auto_created=True, primary_key=True, serialize=False, verbose_name="ID"
),
),
("role", models.CharField(max_length=24)),
("content", models.TextField()),
("round_number", models.PositiveSmallIntegerField(default=0)),
("created_at", models.DateTimeField(auto_now_add=True)),
(
"draft",
models.ForeignKey(
on_delete=django.db.models.deletion.CASCADE,
related_name="messages",
to="tickets.ticketdraft",
),
),
],
options={
"ordering": ["created_at"],
},
),
migrations.AddIndex(
model_name="ticketdraft",
index=models.Index(
fields=["created_by", "status", "updated_at"], name="tickets_tic_created_424ee8_idx"
),
),
migrations.AddIndex(
model_name="ticketdraft",
index=models.Index(
fields=["status", "expires_at"], name="tickets_tic_status_3e6dd8_idx"
),
),
]