# 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", }, ), ]