202 lines
7.7 KiB
Python
202 lines
7.7 KiB
Python
import uuid
|
|
|
|
import django.db.models.deletion
|
|
from django.conf import settings
|
|
from django.db import migrations, models
|
|
|
|
|
|
class Migration(migrations.Migration):
|
|
dependencies = [
|
|
("agents", "0006_step_model_deployments"),
|
|
("tickets", "0015_support_evaluation"),
|
|
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
|
|
]
|
|
|
|
operations = [
|
|
migrations.AddField(
|
|
model_name="ticketdraft",
|
|
name="blocking_missing_fields",
|
|
field=models.JSONField(default=list),
|
|
),
|
|
migrations.AddField(
|
|
model_name="ticketdraft",
|
|
name="blocking_questions",
|
|
field=models.JSONField(default=list),
|
|
),
|
|
migrations.AddField(
|
|
model_name="ticketsupportanalysis",
|
|
name="result_mode",
|
|
field=models.CharField(default="trusted", max_length=24),
|
|
),
|
|
migrations.CreateModel(
|
|
name="TicketAutomationRun",
|
|
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(
|
|
choices=[
|
|
("queued", "Queued"),
|
|
("running", "Running"),
|
|
("waiting_input", "Waiting input"),
|
|
("waiting_approval", "Waiting approval"),
|
|
("waiting_delivery", "Waiting delivery"),
|
|
("waiting_customer", "Waiting customer"),
|
|
("completed", "Completed"),
|
|
("failed", "Failed"),
|
|
("cancelled", "Cancelled"),
|
|
],
|
|
default="queued",
|
|
max_length=32,
|
|
),
|
|
),
|
|
("current_step", models.CharField(default="intake", max_length=48)),
|
|
("policy_snapshot", models.JSONField(blank=True, default=dict)),
|
|
("blocking_missing_fields", models.JSONField(blank=True, default=list)),
|
|
("blocking_questions", models.JSONField(blank=True, default=list)),
|
|
("retry_count", models.PositiveSmallIntegerField(default=0)),
|
|
("last_error_code", models.CharField(blank=True, max_length=80)),
|
|
("last_error_message", models.TextField(blank=True)),
|
|
("next_action_at", models.DateTimeField(blank=True, null=True)),
|
|
("approved_at", models.DateTimeField(blank=True, null=True)),
|
|
("started_at", models.DateTimeField(blank=True, null=True)),
|
|
("finished_at", models.DateTimeField(blank=True, null=True)),
|
|
("created_at", models.DateTimeField(auto_now_add=True)),
|
|
("updated_at", models.DateTimeField(auto_now=True)),
|
|
(
|
|
"approved_by",
|
|
models.ForeignKey(
|
|
blank=True,
|
|
null=True,
|
|
on_delete=django.db.models.deletion.SET_NULL,
|
|
related_name="approved_ticket_automation_runs",
|
|
to=settings.AUTH_USER_MODEL,
|
|
),
|
|
),
|
|
(
|
|
"initiated_by",
|
|
models.ForeignKey(
|
|
blank=True,
|
|
null=True,
|
|
on_delete=django.db.models.deletion.SET_NULL,
|
|
related_name="initiated_ticket_automation_runs",
|
|
to=settings.AUTH_USER_MODEL,
|
|
),
|
|
),
|
|
(
|
|
"reply_task",
|
|
models.ForeignKey(
|
|
blank=True,
|
|
null=True,
|
|
on_delete=django.db.models.deletion.SET_NULL,
|
|
related_name="automation_runs",
|
|
to="tickets.customerreplytask",
|
|
),
|
|
),
|
|
(
|
|
"support_analysis",
|
|
models.ForeignKey(
|
|
blank=True,
|
|
null=True,
|
|
on_delete=django.db.models.deletion.SET_NULL,
|
|
related_name="automation_runs",
|
|
to="tickets.ticketsupportanalysis",
|
|
),
|
|
),
|
|
(
|
|
"ticket",
|
|
models.ForeignKey(
|
|
on_delete=django.db.models.deletion.CASCADE,
|
|
related_name="automation_runs",
|
|
to="tickets.ticket",
|
|
),
|
|
),
|
|
],
|
|
options={"ordering": ["-created_at"]},
|
|
),
|
|
migrations.CreateModel(
|
|
name="TicketAutomationEvent",
|
|
fields=[
|
|
(
|
|
"id",
|
|
models.BigAutoField(
|
|
auto_created=True,
|
|
primary_key=True,
|
|
serialize=False,
|
|
verbose_name="ID",
|
|
),
|
|
),
|
|
("sequence", models.PositiveIntegerField()),
|
|
("event_type", models.CharField(max_length=80)),
|
|
("payload", models.JSONField(blank=True, default=dict)),
|
|
("created_at", models.DateTimeField(auto_now_add=True)),
|
|
(
|
|
"run",
|
|
models.ForeignKey(
|
|
on_delete=django.db.models.deletion.CASCADE,
|
|
related_name="events",
|
|
to="tickets.ticketautomationrun",
|
|
),
|
|
),
|
|
],
|
|
options={"ordering": ["sequence"]},
|
|
),
|
|
migrations.AddIndex(
|
|
model_name="ticketautomationrun",
|
|
index=models.Index(
|
|
fields=["ticket", "status", "created_at"],
|
|
name="tickets_tic_ticket__f9dbaf_idx",
|
|
),
|
|
),
|
|
migrations.AddIndex(
|
|
model_name="ticketautomationrun",
|
|
index=models.Index(
|
|
fields=["status", "next_action_at"],
|
|
name="tickets_tic_status_9ef355_idx",
|
|
),
|
|
),
|
|
migrations.AddConstraint(
|
|
model_name="ticketautomationrun",
|
|
constraint=models.UniqueConstraint(
|
|
condition=models.Q(
|
|
status__in=[
|
|
"queued",
|
|
"running",
|
|
"waiting_input",
|
|
"waiting_approval",
|
|
"waiting_delivery",
|
|
"waiting_customer",
|
|
]
|
|
),
|
|
fields=("ticket",),
|
|
name="unique_active_ticket_automation_run",
|
|
),
|
|
),
|
|
migrations.AddIndex(
|
|
model_name="ticketautomationevent",
|
|
index=models.Index(
|
|
fields=["run", "sequence"],
|
|
name="tickets_tic_run_id_d6464b_idx",
|
|
),
|
|
),
|
|
migrations.AddConstraint(
|
|
model_name="ticketautomationevent",
|
|
constraint=models.UniqueConstraint(
|
|
fields=("run", "sequence"),
|
|
name="unique_ticket_automation_event_sequence",
|
|
),
|
|
),
|
|
]
|