Marwan Alwali 4d06ca4b5e update
2025-09-20 14:26:19 +03:00

969 lines
36 KiB
Python

# Generated by Django 5.2.6 on 2025-09-19 10:58
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 = [
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
]
operations = [
migrations.CreateModel(
name="CommunicationChannel",
fields=[
(
"channel_id",
models.UUIDField(
default=uuid.uuid4,
editable=False,
help_text="Unique identifier for the channel",
primary_key=True,
serialize=False,
),
),
("name", models.CharField(help_text="Channel name", max_length=255)),
(
"description",
models.TextField(
blank=True, help_text="Channel description", null=True
),
),
(
"channel_type",
models.CharField(
choices=[
("EMAIL", "Email"),
("SMS", "SMS"),
("PUSH", "Push Notification"),
("SLACK", "Slack"),
("TEAMS", "Microsoft Teams"),
("WEBHOOK", "Webhook"),
("PHONE", "Phone Call"),
("FAX", "Fax"),
("PAGER", "Pager"),
],
help_text="Type of communication channel",
max_length=20,
),
),
(
"provider_type",
models.CharField(
choices=[
("SMTP", "SMTP Email"),
("SENDGRID", "SendGrid"),
("MAILGUN", "Mailgun"),
("TWILIO", "Twilio SMS"),
("AWS_SNS", "AWS SNS"),
("FIREBASE", "Firebase"),
("SLACK_API", "Slack API"),
("TEAMS_API", "Teams API"),
("WEBHOOK", "Webhook"),
("CUSTOM", "Custom Provider"),
],
help_text="Provider type",
max_length=20,
),
),
(
"configuration",
models.JSONField(
default=dict, help_text="Channel configuration settings"
),
),
(
"authentication_config",
models.JSONField(
default=dict, help_text="Authentication configuration"
),
),
(
"rate_limits",
models.JSONField(
default=dict, help_text="Rate limiting configuration"
),
),
(
"is_active",
models.BooleanField(default=True, help_text="Channel is active"),
),
(
"is_healthy",
models.BooleanField(
default=True, help_text="Channel health status"
),
),
(
"last_health_check",
models.DateTimeField(
blank=True, help_text="Last health check timestamp", null=True
),
),
(
"health_check_interval",
models.PositiveIntegerField(
default=300, help_text="Health check interval in seconds"
),
),
(
"message_count",
models.PositiveIntegerField(
default=0, help_text="Total messages sent through channel"
),
),
(
"success_count",
models.PositiveIntegerField(
default=0, help_text="Successful message deliveries"
),
),
(
"failure_count",
models.PositiveIntegerField(
default=0, help_text="Failed message deliveries"
),
),
(
"last_used_at",
models.DateTimeField(
blank=True, help_text="Last usage timestamp", null=True
),
),
(
"created_at",
models.DateTimeField(
auto_now_add=True, help_text="Channel creation timestamp"
),
),
(
"updated_at",
models.DateTimeField(
auto_now=True, help_text="Last update timestamp"
),
),
],
options={
"db_table": "communications_communication_channel",
},
),
migrations.CreateModel(
name="DeliveryLog",
fields=[
(
"log_id",
models.UUIDField(
default=uuid.uuid4,
editable=False,
help_text="Unique identifier for the delivery log",
primary_key=True,
serialize=False,
),
),
(
"status",
models.CharField(
choices=[
("PENDING", "Pending"),
("PROCESSING", "Processing"),
("SENT", "Sent"),
("DELIVERED", "Delivered"),
("FAILED", "Failed"),
("BOUNCED", "Bounced"),
("REJECTED", "Rejected"),
("TIMEOUT", "Timeout"),
],
default="PENDING",
help_text="Delivery status",
max_length=20,
),
),
(
"attempt_number",
models.PositiveIntegerField(
default=1, help_text="Delivery attempt number"
),
),
(
"started_at",
models.DateTimeField(
auto_now_add=True, help_text="Delivery start timestamp"
),
),
(
"completed_at",
models.DateTimeField(
blank=True, help_text="Delivery completion timestamp", null=True
),
),
(
"external_id",
models.CharField(
blank=True,
help_text="External delivery ID",
max_length=255,
null=True,
),
),
(
"response_code",
models.CharField(
blank=True,
help_text="Response code from provider",
max_length=50,
null=True,
),
),
(
"response_message",
models.TextField(
blank=True,
help_text="Response message from provider",
null=True,
),
),
(
"error_details",
models.JSONField(
default=dict, help_text="Detailed error information"
),
),
(
"processing_time_ms",
models.PositiveIntegerField(
blank=True,
help_text="Processing time in milliseconds",
null=True,
),
),
(
"payload_size_bytes",
models.PositiveIntegerField(
blank=True, help_text="Payload size in bytes", null=True
),
),
(
"metadata",
models.JSONField(
default=dict, help_text="Additional delivery metadata"
),
),
],
options={
"db_table": "communications_delivery_log",
"ordering": ["-started_at"],
},
),
migrations.CreateModel(
name="Message",
fields=[
(
"message_id",
models.UUIDField(
default=uuid.uuid4,
editable=False,
help_text="Unique identifier for the message",
primary_key=True,
serialize=False,
),
),
(
"subject",
models.CharField(help_text="Message subject line", max_length=255),
),
("content", models.TextField(help_text="Message content/body")),
(
"message_type",
models.CharField(
choices=[
("INTERNAL", "Internal Message"),
("EMAIL", "Email"),
("SMS", "SMS"),
("PUSH", "Push Notification"),
("SLACK", "Slack Message"),
("TEAMS", "Microsoft Teams"),
("WEBHOOK", "Webhook"),
("SYSTEM", "System Message"),
("ALERT", "Alert Message"),
],
default="INTERNAL",
help_text="Type of message",
max_length=20,
),
),
(
"priority",
models.CharField(
choices=[
("LOW", "Low"),
("NORMAL", "Normal"),
("HIGH", "High"),
("URGENT", "Urgent"),
("CRITICAL", "Critical"),
],
default="NORMAL",
help_text="Message priority level",
max_length=20,
),
),
(
"status",
models.CharField(
choices=[
("DRAFT", "Draft"),
("PENDING", "Pending"),
("SENDING", "Sending"),
("SENT", "Sent"),
("DELIVERED", "Delivered"),
("READ", "Read"),
("FAILED", "Failed"),
("CANCELLED", "Cancelled"),
],
default="DRAFT",
help_text="Message status",
max_length=20,
),
),
(
"created_at",
models.DateTimeField(
auto_now_add=True, help_text="Message creation timestamp"
),
),
(
"scheduled_at",
models.DateTimeField(
blank=True, help_text="Scheduled send time", null=True
),
),
(
"sent_at",
models.DateTimeField(
blank=True, help_text="Actual send timestamp", null=True
),
),
(
"expires_at",
models.DateTimeField(
blank=True, help_text="Message expiration time", null=True
),
),
(
"is_urgent",
models.BooleanField(default=False, help_text="Urgent message flag"),
),
(
"requires_acknowledgment",
models.BooleanField(
default=False, help_text="Requires recipient acknowledgment"
),
),
(
"is_confidential",
models.BooleanField(
default=False, help_text="Confidential message flag"
),
),
(
"delivery_attempts",
models.PositiveIntegerField(
default=0, help_text="Number of delivery attempts"
),
),
(
"max_delivery_attempts",
models.PositiveIntegerField(
default=3, help_text="Maximum delivery attempts"
),
),
(
"message_thread_id",
models.UUIDField(
blank=True,
help_text="Thread ID for message grouping",
null=True,
),
),
(
"external_message_id",
models.CharField(
blank=True,
help_text="External system message ID",
max_length=255,
null=True,
),
),
(
"has_attachments",
models.BooleanField(
default=False, help_text="Message has attachments"
),
),
(
"content_type",
models.CharField(
default="text/plain",
help_text="Content MIME type",
max_length=50,
),
),
],
options={
"db_table": "communications_message",
"ordering": ["-created_at"],
},
),
migrations.CreateModel(
name="MessageRecipient",
fields=[
(
"recipient_id",
models.UUIDField(
default=uuid.uuid4,
editable=False,
help_text="Unique identifier for the recipient",
primary_key=True,
serialize=False,
),
),
(
"recipient_type",
models.CharField(
choices=[
("USER", "User"),
("EMAIL", "Email Address"),
("PHONE", "Phone Number"),
("ROLE", "User Role"),
("DEPARTMENT", "Department"),
("GROUP", "User Group"),
],
help_text="Type of recipient",
max_length=20,
),
),
(
"email_address",
models.EmailField(
blank=True,
help_text="Email address recipient",
max_length=254,
null=True,
),
),
(
"phone_number",
models.CharField(
blank=True,
help_text="Phone number recipient",
max_length=20,
null=True,
),
),
(
"role_name",
models.CharField(
blank=True,
help_text="Role name for role-based recipients",
max_length=100,
null=True,
),
),
(
"status",
models.CharField(
choices=[
("PENDING", "Pending"),
("SENT", "Sent"),
("DELIVERED", "Delivered"),
("READ", "Read"),
("ACKNOWLEDGED", "Acknowledged"),
("FAILED", "Failed"),
("BOUNCED", "Bounced"),
("UNSUBSCRIBED", "Unsubscribed"),
],
default="PENDING",
help_text="Delivery status",
max_length=20,
),
),
(
"sent_at",
models.DateTimeField(
blank=True, help_text="Sent timestamp", null=True
),
),
(
"delivered_at",
models.DateTimeField(
blank=True, help_text="Delivered timestamp", null=True
),
),
(
"read_at",
models.DateTimeField(
blank=True, help_text="Read timestamp", null=True
),
),
(
"acknowledged_at",
models.DateTimeField(
blank=True, help_text="Acknowledged timestamp", null=True
),
),
(
"delivery_attempts",
models.PositiveIntegerField(
default=0, help_text="Number of delivery attempts"
),
),
(
"last_attempt_at",
models.DateTimeField(
blank=True,
help_text="Last delivery attempt timestamp",
null=True,
),
),
(
"error_message",
models.TextField(
blank=True, help_text="Last delivery error message", null=True
),
),
(
"external_delivery_id",
models.CharField(
blank=True,
help_text="External delivery tracking ID",
max_length=255,
null=True,
),
),
],
options={
"db_table": "communications_message_recipient",
},
),
migrations.CreateModel(
name="NotificationTemplate",
fields=[
(
"template_id",
models.UUIDField(
default=uuid.uuid4,
editable=False,
help_text="Unique identifier for the template",
primary_key=True,
serialize=False,
),
),
("name", models.CharField(help_text="Template name", max_length=255)),
(
"description",
models.TextField(
blank=True, help_text="Template description", null=True
),
),
(
"template_type",
models.CharField(
choices=[
("EMAIL", "Email Template"),
("SMS", "SMS Template"),
("PUSH", "Push Notification Template"),
("SLACK", "Slack Template"),
("TEAMS", "Teams Template"),
("WEBHOOK", "Webhook Template"),
("SYSTEM", "System Notification Template"),
],
help_text="Type of template",
max_length=20,
),
),
(
"category",
models.CharField(
choices=[
("APPOINTMENT", "Appointment Notifications"),
("MEDICATION", "Medication Reminders"),
("LAB_RESULTS", "Lab Results"),
("BILLING", "Billing Notifications"),
("EMERGENCY", "Emergency Alerts"),
("SYSTEM", "System Notifications"),
("MARKETING", "Marketing Communications"),
("CLINICAL", "Clinical Notifications"),
("ADMINISTRATIVE", "Administrative Messages"),
("QUALITY", "Quality Alerts"),
],
help_text="Template category",
max_length=30,
),
),
(
"subject_template",
models.CharField(
blank=True,
help_text="Subject line template",
max_length=255,
null=True,
),
),
(
"content_template",
models.TextField(help_text="Message content template"),
),
(
"variables",
models.JSONField(
default=dict, help_text="Available template variables"
),
),
(
"default_values",
models.JSONField(default=dict, help_text="Default variable values"),
),
(
"formatting_rules",
models.JSONField(
default=dict, help_text="Content formatting rules"
),
),
(
"is_active",
models.BooleanField(default=True, help_text="Template is active"),
),
(
"is_system_template",
models.BooleanField(
default=False, help_text="System-defined template"
),
),
(
"requires_approval",
models.BooleanField(
default=False, help_text="Requires approval before use"
),
),
(
"usage_count",
models.PositiveIntegerField(
default=0, help_text="Number of times template has been used"
),
),
(
"last_used_at",
models.DateTimeField(
blank=True, help_text="Last usage timestamp", null=True
),
),
(
"created_at",
models.DateTimeField(
auto_now_add=True, help_text="Template creation timestamp"
),
),
(
"updated_at",
models.DateTimeField(
auto_now=True, help_text="Last update timestamp"
),
),
],
options={
"db_table": "communications_notification_template",
},
),
migrations.CreateModel(
name="AlertInstance",
fields=[
(
"alert_id",
models.UUIDField(
default=uuid.uuid4,
editable=False,
help_text="Unique identifier for the alert instance",
primary_key=True,
serialize=False,
),
),
("title", models.CharField(help_text="Alert title", max_length=255)),
("description", models.TextField(help_text="Alert description")),
(
"severity",
models.CharField(
choices=[
("INFO", "Information"),
("WARNING", "Warning"),
("ERROR", "Error"),
("CRITICAL", "Critical"),
("EMERGENCY", "Emergency"),
],
help_text="Alert severity level",
max_length=20,
),
),
(
"trigger_data",
models.JSONField(
default=dict, help_text="Data that triggered the alert"
),
),
(
"context_data",
models.JSONField(default=dict, help_text="Additional context data"),
),
(
"status",
models.CharField(
choices=[
("ACTIVE", "Active"),
("ACKNOWLEDGED", "Acknowledged"),
("RESOLVED", "Resolved"),
("SUPPRESSED", "Suppressed"),
("ESCALATED", "Escalated"),
("EXPIRED", "Expired"),
],
default="ACTIVE",
help_text="Alert status",
max_length=20,
),
),
(
"triggered_at",
models.DateTimeField(
auto_now_add=True, help_text="Alert trigger timestamp"
),
),
(
"acknowledged_at",
models.DateTimeField(
blank=True, help_text="Acknowledgment timestamp", null=True
),
),
(
"resolved_at",
models.DateTimeField(
blank=True, help_text="Resolution timestamp", null=True
),
),
(
"expires_at",
models.DateTimeField(
blank=True, help_text="Alert expiration time", null=True
),
),
(
"resolution_notes",
models.TextField(
blank=True, help_text="Resolution notes", null=True
),
),
(
"escalation_level",
models.PositiveIntegerField(
default=0, help_text="Current escalation level"
),
),
(
"escalated_at",
models.DateTimeField(
blank=True, help_text="Last escalation timestamp", null=True
),
),
(
"notifications_sent",
models.PositiveIntegerField(
default=0, help_text="Number of notifications sent"
),
),
(
"last_notification_at",
models.DateTimeField(
blank=True, help_text="Last notification timestamp", null=True
),
),
(
"acknowledged_by",
models.ForeignKey(
blank=True,
help_text="User who acknowledged the alert",
null=True,
on_delete=django.db.models.deletion.SET_NULL,
related_name="acknowledged_alerts",
to=settings.AUTH_USER_MODEL,
),
),
(
"resolved_by",
models.ForeignKey(
blank=True,
help_text="User who resolved the alert",
null=True,
on_delete=django.db.models.deletion.SET_NULL,
related_name="resolved_alerts",
to=settings.AUTH_USER_MODEL,
),
),
],
options={
"db_table": "communications_alert_instance",
"ordering": ["-triggered_at"],
},
),
migrations.CreateModel(
name="AlertRule",
fields=[
(
"rule_id",
models.UUIDField(
default=uuid.uuid4,
editable=False,
help_text="Unique identifier for the alert rule",
primary_key=True,
serialize=False,
),
),
("name", models.CharField(help_text="Alert rule name", max_length=255)),
(
"description",
models.TextField(
blank=True, help_text="Alert rule description", null=True
),
),
(
"trigger_type",
models.CharField(
choices=[
("THRESHOLD", "Threshold Alert"),
("PATTERN", "Pattern Alert"),
("SCHEDULE", "Scheduled Alert"),
("EVENT", "Event-based Alert"),
("ANOMALY", "Anomaly Detection"),
("SYSTEM", "System Alert"),
("CLINICAL", "Clinical Alert"),
("OPERATIONAL", "Operational Alert"),
],
help_text="Type of alert trigger",
max_length=20,
),
),
(
"severity",
models.CharField(
choices=[
("INFO", "Information"),
("WARNING", "Warning"),
("ERROR", "Error"),
("CRITICAL", "Critical"),
("EMERGENCY", "Emergency"),
],
default="WARNING",
help_text="Alert severity level",
max_length=20,
),
),
(
"trigger_conditions",
models.JSONField(
default=dict, help_text="Conditions that trigger the alert"
),
),
(
"evaluation_frequency",
models.PositiveIntegerField(
default=300, help_text="Evaluation frequency in seconds"
),
),
(
"cooldown_period",
models.PositiveIntegerField(
default=3600,
help_text="Cooldown period between alerts in seconds",
),
),
(
"notification_channels",
models.JSONField(
default=list, help_text="Notification channels to use"
),
),
(
"escalation_rules",
models.JSONField(
default=dict, help_text="Escalation configuration"
),
),
(
"recipient_roles",
models.JSONField(default=list, help_text="Recipient roles"),
),
(
"is_active",
models.BooleanField(default=True, help_text="Alert rule is active"),
),
(
"is_system_rule",
models.BooleanField(default=False, help_text="System-defined rule"),
),
(
"trigger_count",
models.PositiveIntegerField(
default=0, help_text="Number of times rule has triggered"
),
),
(
"last_triggered_at",
models.DateTimeField(
blank=True, help_text="Last trigger timestamp", null=True
),
),
(
"last_evaluated_at",
models.DateTimeField(
blank=True, help_text="Last evaluation timestamp", null=True
),
),
(
"created_at",
models.DateTimeField(
auto_now_add=True, help_text="Rule creation timestamp"
),
),
(
"updated_at",
models.DateTimeField(
auto_now=True, help_text="Last update timestamp"
),
),
(
"created_by",
models.ForeignKey(
blank=True,
help_text="Rule creator",
null=True,
on_delete=django.db.models.deletion.SET_NULL,
related_name="created_alert_rules",
to=settings.AUTH_USER_MODEL,
),
),
(
"default_recipients",
models.ManyToManyField(
blank=True,
help_text="Default alert recipients",
to=settings.AUTH_USER_MODEL,
),
),
],
options={
"db_table": "communications_alert_rule",
},
),
]