# Generated by Django 5.2.6 on 2025-09-18 16:26 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 = [ ('automation_orchestration', '0002_autoremediationexecution_sla_instance_and_more'), ('incident_intelligence', '0004_incident_oncall_assignment_incident_sla_override_and_more'), ('security', '0002_user_emergency_contact_user_oncall_preferences_and_more'), ('sla_oncall', '0001_initial'), migrations.swappable_dependency(settings.AUTH_USER_MODEL), ] operations = [ migrations.CreateModel( name='ConferenceBridge', fields=[ ('id', models.UUIDField(default=uuid.uuid4, editable=False, primary_key=True, serialize=False)), ('name', models.CharField(max_length=200)), ('description', models.TextField(blank=True, null=True)), ('bridge_type', models.CharField(choices=[('ZOOM', 'Zoom'), ('TEAMS', 'Microsoft Teams'), ('WEBEX', 'Cisco Webex'), ('GOTO_MEETING', 'GoTo Meeting'), ('CUSTOM', 'Custom Bridge')], max_length=20)), ('status', models.CharField(choices=[('SCHEDULED', 'Scheduled'), ('ACTIVE', 'Active'), ('ENDED', 'Ended'), ('CANCELLED', 'Cancelled')], default='SCHEDULED', max_length=20)), ('meeting_id', models.CharField(blank=True, help_text='External meeting ID', max_length=255, null=True)), ('meeting_url', models.URLField(blank=True, help_text='Meeting URL', null=True)), ('dial_in_number', models.CharField(blank=True, help_text='Dial-in phone number', max_length=50, null=True)), ('access_code', models.CharField(blank=True, help_text='Access code for dial-in', max_length=20, null=True)), ('scheduled_start', models.DateTimeField(help_text='Scheduled start time')), ('scheduled_end', models.DateTimeField(help_text='Scheduled end time')), ('actual_start', models.DateTimeField(blank=True, null=True)), ('actual_end', models.DateTimeField(blank=True, null=True)), ('max_participants', models.PositiveIntegerField(default=50)), ('recording_enabled', models.BooleanField(default=False)), ('recording_url', models.URLField(blank=True, help_text='URL to recorded meeting', null=True)), ('transcription_enabled', models.BooleanField(default=False)), ('transcription_url', models.URLField(blank=True, help_text='URL to meeting transcription', null=True)), ('integration_config', models.JSONField(default=dict, help_text='Configuration for external bridge integration')), ('created_at', models.DateTimeField(auto_now_add=True)), ('updated_at', models.DateTimeField(auto_now=True)), ('active_participants', models.ManyToManyField(blank=True, help_text='Users currently in the conference', related_name='active_conferences', to=settings.AUTH_USER_MODEL)), ('created_by', models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='created_conferences', to=settings.AUTH_USER_MODEL)), ('incident', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='conference_bridges', to='incident_intelligence.incident')), ('invited_participants', models.ManyToManyField(blank=True, help_text='Users invited to the conference', related_name='invited_conferences', to=settings.AUTH_USER_MODEL)), ], options={ 'ordering': ['-scheduled_start'], }, ), migrations.CreateModel( name='IncidentCommandRole', fields=[ ('id', models.UUIDField(default=uuid.uuid4, editable=False, primary_key=True, serialize=False)), ('role_type', models.CharField(choices=[('INCIDENT_COMMANDER', 'Incident Commander'), ('SCRIBE', 'Scribe'), ('COMMS_LEAD', 'Communications Lead'), ('TECHNICAL_LEAD', 'Technical Lead'), ('BUSINESS_LEAD', 'Business Lead'), ('EXTERNAL_LIAISON', 'External Liaison'), ('OBSERVER', 'Observer')], max_length=30)), ('status', models.CharField(choices=[('ACTIVE', 'Active'), ('INACTIVE', 'Inactive'), ('REASSIGNED', 'Reassigned')], default='ACTIVE', max_length=20)), ('responsibilities', models.JSONField(default=list, help_text='List of responsibilities for this role')), ('decision_authority', models.JSONField(default=list, help_text='Areas where this role has decision authority')), ('assigned_at', models.DateTimeField(auto_now_add=True)), ('reassigned_at', models.DateTimeField(blank=True, null=True)), ('assignment_notes', models.TextField(blank=True, null=True)), ('decisions_made', models.PositiveIntegerField(default=0)), ('communications_sent', models.PositiveIntegerField(default=0)), ('last_activity', models.DateTimeField(blank=True, null=True)), ('created_at', models.DateTimeField(auto_now_add=True)), ('updated_at', models.DateTimeField(auto_now=True)), ('assigned_user', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='assigned_command_roles', to=settings.AUTH_USER_MODEL)), ('created_by', models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='created_command_roles', to=settings.AUTH_USER_MODEL)), ('incident', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='command_roles', to='incident_intelligence.incident')), ('reassigned_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='reassigned_command_roles', to=settings.AUTH_USER_MODEL)), ], options={ 'ordering': ['-assigned_at'], }, ), migrations.CreateModel( name='WarRoom', fields=[ ('id', models.UUIDField(default=uuid.uuid4, editable=False, primary_key=True, serialize=False)), ('name', models.CharField(max_length=200)), ('description', models.TextField(blank=True, null=True)), ('status', models.CharField(choices=[('ACTIVE', 'Active'), ('ARCHIVED', 'Archived'), ('CLOSED', 'Closed')], default='ACTIVE', max_length=20)), ('privacy_level', models.CharField(choices=[('PUBLIC', 'Public'), ('PRIVATE', 'Private'), ('RESTRICTED', 'Restricted')], default='PRIVATE', max_length=20)), ('slack_channel_id', models.CharField(blank=True, help_text='Slack channel ID', max_length=100, null=True)), ('teams_channel_id', models.CharField(blank=True, help_text='Teams channel ID', max_length=100, null=True)), ('discord_channel_id', models.CharField(blank=True, help_text='Discord channel ID', max_length=100, null=True)), ('message_count', models.PositiveIntegerField(default=0)), ('last_activity', models.DateTimeField(blank=True, null=True)), ('active_participants', models.PositiveIntegerField(default=0)), ('created_at', models.DateTimeField(auto_now_add=True)), ('updated_at', models.DateTimeField(auto_now=True)), ('archived_at', models.DateTimeField(blank=True, null=True)), ('allowed_users', models.ManyToManyField(blank=True, help_text='Users with access to this war room', related_name='accessible_war_rooms', to=settings.AUTH_USER_MODEL)), ('created_by', models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='created_war_rooms', to=settings.AUTH_USER_MODEL)), ('incident', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='war_rooms', to='incident_intelligence.incident')), ('required_clearance_level', models.ForeignKey(blank=True, help_text='Required clearance level for access', null=True, on_delete=django.db.models.deletion.SET_NULL, to='security.dataclassification')), ], options={ 'ordering': ['-created_at'], }, ), migrations.CreateModel( name='TimelineEvent', fields=[ ('id', models.UUIDField(default=uuid.uuid4, editable=False, primary_key=True, serialize=False)), ('event_type', models.CharField(choices=[('INCIDENT_CREATED', 'Incident Created'), ('INCIDENT_UPDATED', 'Incident Updated'), ('ASSIGNMENT_CHANGED', 'Assignment Changed'), ('STATUS_CHANGED', 'Status Changed'), ('SEVERITY_CHANGED', 'Severity Changed'), ('COMMENT_ADDED', 'Comment Added'), ('RUNBOOK_EXECUTED', 'Runbook Executed'), ('AUTO_REMEDIATION_ATTEMPTED', 'Auto-remediation Attempted'), ('SLA_BREACHED', 'SLA Breached'), ('ESCALATION_TRIGGERED', 'Escalation Triggered'), ('WAR_ROOM_CREATED', 'War Room Created'), ('CONFERENCE_STARTED', 'Conference Started'), ('COMMAND_ROLE_ASSIGNED', 'Command Role Assigned'), ('DECISION_MADE', 'Decision Made'), ('COMMUNICATION_SENT', 'Communication Sent'), ('EXTERNAL_INTEGRATION', 'External Integration'), ('MANUAL_EVENT', 'Manual Event')], max_length=30)), ('title', models.CharField(max_length=200)), ('description', models.TextField()), ('source_type', models.CharField(choices=[('SYSTEM', 'System Generated'), ('USER', 'User Created'), ('INTEGRATION', 'External Integration'), ('AUTOMATION', 'Automation')], default='SYSTEM', max_length=20)), ('event_time', models.DateTimeField(help_text='When the event occurred')), ('created_at', models.DateTimeField(auto_now_add=True)), ('event_data', models.JSONField(default=dict, help_text='Additional data related to the event')), ('tags', models.JSONField(default=list, help_text='Tags for categorization and filtering')), ('is_critical_event', models.BooleanField(default=False, help_text='Whether this event is critical for postmortem analysis')), ('postmortem_notes', models.TextField(blank=True, help_text='Additional notes added during postmortem', null=True)), ('created_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='created_timeline_events', to=settings.AUTH_USER_MODEL)), ('incident', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='timeline_events', to='incident_intelligence.incident')), ('related_auto_remediation', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='timeline_events', to='automation_orchestration.autoremediationexecution')), ('related_command_role', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='timeline_events', to='collaboration_war_rooms.incidentcommandrole')), ('related_conference', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='timeline_events', to='collaboration_war_rooms.conferencebridge')), ('related_escalation', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='timeline_events', to='sla_oncall.escalationinstance')), ('related_runbook_execution', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='timeline_events', to='automation_orchestration.runbookexecution')), ('related_sla_instance', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='timeline_events', to='sla_oncall.slainstance')), ('related_user', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='timeline_events', to=settings.AUTH_USER_MODEL)), ('related_war_room', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='timeline_events', to='collaboration_war_rooms.warroom')), ], options={ 'ordering': ['event_time', 'created_at'], }, ), migrations.AddField( model_name='incidentcommandrole', name='war_room', field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='command_roles', to='collaboration_war_rooms.warroom'), ), migrations.AddField( model_name='conferencebridge', name='war_room', field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='conference_bridges', to='collaboration_war_rooms.warroom'), ), migrations.CreateModel( name='WarRoomMessage', fields=[ ('id', models.UUIDField(default=uuid.uuid4, editable=False, primary_key=True, serialize=False)), ('message_type', models.CharField(choices=[('TEXT', 'Text Message'), ('SYSTEM', 'System Message'), ('COMMAND', 'Command Message'), ('ALERT', 'Alert Message'), ('UPDATE', 'Status Update')], default='TEXT', max_length=20)), ('content', models.TextField()), ('sender_name', models.CharField(help_text='Display name of sender', max_length=100)), ('is_edited', models.BooleanField(default=False)), ('edited_at', models.DateTimeField(blank=True, null=True)), ('external_message_id', models.CharField(blank=True, help_text='ID in external system (Slack, Teams, etc.)', max_length=255, null=True)), ('external_data', models.JSONField(default=dict, help_text='Additional data from external system')), ('created_at', models.DateTimeField(auto_now_add=True)), ('updated_at', models.DateTimeField(auto_now=True)), ('reply_to', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='replies', to='collaboration_war_rooms.warroommessage')), ('sender', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='war_room_messages', to=settings.AUTH_USER_MODEL)), ('war_room', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='messages', to='collaboration_war_rooms.warroom')), ], options={ 'ordering': ['created_at'], }, ), migrations.CreateModel( name='IncidentDecision', fields=[ ('id', models.UUIDField(default=uuid.uuid4, editable=False, primary_key=True, serialize=False)), ('decision_type', models.CharField(choices=[('TECHNICAL', 'Technical Decision'), ('BUSINESS', 'Business Decision'), ('COMMUNICATION', 'Communication Decision'), ('ESCALATION', 'Escalation Decision'), ('RESOURCE', 'Resource Allocation'), ('TIMELINE', 'Timeline Decision')], max_length=20)), ('title', models.CharField(max_length=200)), ('description', models.TextField()), ('rationale', models.TextField(help_text='Reasoning behind the decision')), ('status', models.CharField(choices=[('PENDING', 'Pending'), ('APPROVED', 'Approved'), ('REJECTED', 'Rejected'), ('IMPLEMENTED', 'Implemented')], default='PENDING', max_length=20)), ('requires_approval', models.BooleanField(default=False)), ('approved_at', models.DateTimeField(blank=True, null=True)), ('implementation_notes', models.TextField(blank=True, null=True)), ('implemented_at', models.DateTimeField(blank=True, null=True)), ('impact_assessment', models.TextField(blank=True, null=True)), ('success_metrics', models.JSONField(default=list, help_text='Metrics to measure decision success')), ('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_decisions', to=settings.AUTH_USER_MODEL)), ('command_role', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='decisions', to='collaboration_war_rooms.incidentcommandrole')), ('implemented_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='implemented_decisions', to=settings.AUTH_USER_MODEL)), ('incident', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='decisions', to='incident_intelligence.incident')), ], options={ 'ordering': ['-created_at'], 'indexes': [models.Index(fields=['incident', 'status'], name='collaborati_inciden_4f34eb_idx'), models.Index(fields=['command_role', 'decision_type'], name='collaborati_command_81be71_idx'), models.Index(fields=['status', 'created_at'], name='collaborati_status_3f5734_idx')], }, ), migrations.AddIndex( model_name='warroom', index=models.Index(fields=['incident', 'status'], name='collaborati_inciden_bd58db_idx'), ), migrations.AddIndex( model_name='warroom', index=models.Index(fields=['status', 'privacy_level'], name='collaborati_status_649ccc_idx'), ), migrations.AddIndex( model_name='warroom', index=models.Index(fields=['created_at'], name='collaborati_created_e3a240_idx'), ), migrations.AddIndex( model_name='timelineevent', index=models.Index(fields=['incident', 'event_time'], name='collaborati_inciden_3a611f_idx'), ), migrations.AddIndex( model_name='timelineevent', index=models.Index(fields=['event_type', 'event_time'], name='collaborati_event_t_d2100a_idx'), ), migrations.AddIndex( model_name='timelineevent', index=models.Index(fields=['source_type', 'event_time'], name='collaborati_source__0c3cc4_idx'), ), migrations.AddIndex( model_name='timelineevent', index=models.Index(fields=['is_critical_event', 'event_time'], name='collaborati_is_crit_28e610_idx'), ), migrations.AddIndex( model_name='incidentcommandrole', index=models.Index(fields=['incident', 'role_type'], name='collaborati_inciden_7c5ba6_idx'), ), migrations.AddIndex( model_name='incidentcommandrole', index=models.Index(fields=['assigned_user', 'status'], name='collaborati_assigne_e33d48_idx'), ), migrations.AddIndex( model_name='incidentcommandrole', index=models.Index(fields=['status', 'assigned_at'], name='collaborati_status_b2ec4b_idx'), ), migrations.AlterUniqueTogether( name='incidentcommandrole', unique_together={('incident', 'role_type', 'assigned_user')}, ), migrations.AddIndex( model_name='conferencebridge', index=models.Index(fields=['incident', 'status'], name='collaborati_inciden_4be2c2_idx'), ), migrations.AddIndex( model_name='conferencebridge', index=models.Index(fields=['bridge_type', 'status'], name='collaborati_bridge__44a9ea_idx'), ), migrations.AddIndex( model_name='conferencebridge', index=models.Index(fields=['scheduled_start'], name='collaborati_schedul_a93d14_idx'), ), migrations.AddIndex( model_name='warroommessage', index=models.Index(fields=['war_room', 'created_at'], name='collaborati_war_roo_6320f9_idx'), ), migrations.AddIndex( model_name='warroommessage', index=models.Index(fields=['sender', 'created_at'], name='collaborati_sender__f499b1_idx'), ), migrations.AddIndex( model_name='warroommessage', index=models.Index(fields=['message_type', 'created_at'], name='collaborati_message_a29f3d_idx'), ), ]