969 lines
36 KiB
Python
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",
|
|
},
|
|
),
|
|
]
|