Files
ai-ticket-platform/backend/apps/channels/migrations/0001_initial.py

113 lines
6.7 KiB
Python

# Generated by Django 5.2.8 on 2026-07-27
import django.db.models.deletion
import uuid
from django.conf import settings
from django.db import migrations, models
class Migration(migrations.Migration):
initial = True
dependencies = [
("tickets", "0013_ticketsupportanalysis_applied_solution_and_more"),
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
]
operations = [
migrations.CreateModel(
name="ChannelEndpoint",
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)),
("name", models.CharField(max_length=120, unique=True)),
("adapter_type", models.CharField(default="generic_webhook", max_length=40)),
("outbound_url", models.URLField(blank=True, max_length=500)),
("webhook_secret_encrypted", models.TextField(blank=True)),
("outbound_token_encrypted", models.TextField(blank=True)),
("enabled", models.BooleanField(default=True)),
("created_at", models.DateTimeField(auto_now_add=True)),
("updated_at", models.DateTimeField(auto_now=True)),
("created_by", models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name="created_channel_endpoints", to=settings.AUTH_USER_MODEL)),
],
options={"ordering": ["name"]},
),
migrations.CreateModel(
name="ChannelConversation",
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)),
("external_conversation_id", models.CharField(max_length=200)),
("title", models.CharField(blank=True, max_length=200)),
("participants", models.JSONField(blank=True, default=list)),
("created_at", models.DateTimeField(auto_now_add=True)),
("updated_at", models.DateTimeField(auto_now=True)),
("endpoint", models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, related_name="conversations", to="channels.channelendpoint")),
("ticket", models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name="channel_conversations", to="tickets.ticket")),
],
options={"ordering": ["-updated_at"]},
),
migrations.CreateModel(
name="ChannelMessage",
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)),
("direction", models.CharField(max_length=16)),
("external_message_id", models.CharField(blank=True, max_length=200)),
("idempotency_key", models.CharField(blank=True, max_length=200)),
("sender", models.CharField(blank=True, max_length=160)),
("message_type", models.CharField(default="text", max_length=24)),
("text", models.TextField(blank=True)),
("payload", models.JSONField(blank=True, default=dict)),
("status", models.CharField(max_length=24)),
("error_message", models.TextField(blank=True)),
("occurred_at", models.DateTimeField(blank=True, null=True)),
("sent_at", models.DateTimeField(blank=True, null=True)),
("delivered_at", models.DateTimeField(blank=True, null=True)),
("created_at", models.DateTimeField(auto_now_add=True)),
("updated_at", models.DateTimeField(auto_now=True)),
("conversation", models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name="messages", to="channels.channelconversation")),
("created_by", models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name="created_channel_messages", to=settings.AUTH_USER_MODEL)),
("endpoint", models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, related_name="messages", to="channels.channelendpoint")),
("ticket", models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name="channel_messages", to="tickets.ticket")),
],
options={"ordering": ["-created_at"]},
),
migrations.CreateModel(
name="ChannelReceipt",
fields=[
("id", models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")),
("receipt_type", models.CharField(max_length=24)),
("external_receipt_id", models.CharField(max_length=200)),
("payload", models.JSONField(blank=True, default=dict)),
("received_at", models.DateTimeField(auto_now_add=True)),
("message", models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name="receipts", to="channels.channelmessage")),
],
options={"ordering": ["received_at"]},
),
migrations.AddConstraint(
model_name="channelconversation",
constraint=models.UniqueConstraint(fields=("endpoint", "external_conversation_id"), name="unique_channel_external_conversation"),
),
migrations.AddIndex(
model_name="channelmessage",
index=models.Index(fields=["endpoint", "direction", "created_at"], name="channels_ch_endpoin_30d460_idx"),
),
migrations.AddIndex(
model_name="channelmessage",
index=models.Index(fields=["status", "created_at"], name="channels_ch_status_eeefec_idx"),
),
migrations.AddConstraint(
model_name="channelmessage",
constraint=models.UniqueConstraint(condition=models.Q(("external_message_id__gt", "")), fields=("endpoint", "direction", "external_message_id"), name="unique_channel_external_message"),
),
migrations.AddConstraint(
model_name="channelmessage",
constraint=models.UniqueConstraint(condition=models.Q(("idempotency_key__gt", "")), fields=("endpoint", "direction", "idempotency_key"), name="unique_channel_message_idempotency"),
),
migrations.AddConstraint(
model_name="channelreceipt",
constraint=models.UniqueConstraint(fields=("message", "receipt_type", "external_receipt_id"), name="unique_channel_message_receipt"),
),
]