All checks were successful
Build and Push Docker Image / build (push) Successful in 1m5s
222 lines
15 KiB
Python
222 lines
15 KiB
Python
# Generated by Django 6.0.1 on 2026-05-11 20:32
|
|
|
|
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 = [
|
|
('contenttypes', '0002_remove_content_type_name'),
|
|
('organizations', '0001_initial'),
|
|
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
|
|
]
|
|
|
|
operations = [
|
|
migrations.CreateModel(
|
|
name='RootCauseAnalysis',
|
|
fields=[
|
|
('created_at', models.DateTimeField(auto_now_add=True, db_index=True)),
|
|
('updated_at', models.DateTimeField(auto_now=True)),
|
|
('id', models.UUIDField(default=uuid.uuid4, editable=False, primary_key=True, serialize=False)),
|
|
('object_id', models.UUIDField(blank=True, db_index=True, help_text='ID of the related item', null=True)),
|
|
('title', models.CharField(max_length=500)),
|
|
('description', models.TextField(help_text='Description of the incident/issue')),
|
|
('background', models.TextField(blank=True, help_text='Background information and context')),
|
|
('status', models.CharField(choices=[('draft', 'Draft'), ('in_progress', 'In Progress'), ('review', 'Under Review'), ('approved', 'Approved'), ('closed', 'Closed')], db_index=True, default='draft', max_length=20)),
|
|
('severity', models.CharField(choices=[('low', 'Low'), ('medium', 'Medium'), ('high', 'High'), ('critical', 'Critical')], db_index=True, default='medium', max_length=20)),
|
|
('priority', models.CharField(choices=[('low', 'Low'), ('medium', 'Medium'), ('high', 'High'), ('critical', 'Critical')], db_index=True, default='medium', max_length=20)),
|
|
('root_cause_summary', models.TextField(blank=True, help_text='Summary of root cause analysis findings')),
|
|
('assigned_at', models.DateTimeField(blank=True, null=True)),
|
|
('approved_at', models.DateTimeField(blank=True, null=True)),
|
|
('approval_notes', models.TextField(blank=True)),
|
|
('closed_at', models.DateTimeField(blank=True, null=True)),
|
|
('closure_notes', models.TextField(blank=True)),
|
|
('target_completion_date', models.DateField(blank=True, help_text='Target date for RCA completion', null=True)),
|
|
('actual_completion_date', models.DateField(blank=True, null=True)),
|
|
('metadata', models.JSONField(blank=True, default=dict)),
|
|
('is_deleted', models.BooleanField(db_index=True, default=False)),
|
|
('deleted_at', models.DateTimeField(blank=True, null=True)),
|
|
('approved_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='rca_approved_items', to=settings.AUTH_USER_MODEL)),
|
|
('assigned_to', models.ForeignKey(blank=True, help_text='Person responsible for RCA', null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='assigned_rcas', to=settings.AUTH_USER_MODEL)),
|
|
('closed_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='closed_rcas', to=settings.AUTH_USER_MODEL)),
|
|
('content_type', models.ForeignKey(blank=True, help_text='Type of the related item', null=True, on_delete=django.db.models.deletion.PROTECT, related_name='related_rcas', to='contenttypes.contenttype')),
|
|
('created_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='created_rcas', to=settings.AUTH_USER_MODEL)),
|
|
('deleted_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='deleted_rcas', to=settings.AUTH_USER_MODEL)),
|
|
('department', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='rcas', to='organizations.department')),
|
|
('hospital', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='rcas', to='organizations.hospital')),
|
|
],
|
|
options={
|
|
'verbose_name': 'Root Cause Analysis',
|
|
'verbose_name_plural': 'Root Cause Analyses',
|
|
'ordering': ['-created_at'],
|
|
},
|
|
),
|
|
migrations.CreateModel(
|
|
name='RCAStatusLog',
|
|
fields=[
|
|
('created_at', models.DateTimeField(auto_now_add=True, db_index=True)),
|
|
('updated_at', models.DateTimeField(auto_now=True)),
|
|
('id', models.UUIDField(default=uuid.uuid4, editable=False, primary_key=True, serialize=False)),
|
|
('old_status', models.CharField(blank=True, max_length=20)),
|
|
('new_status', models.CharField(db_index=True, max_length=20)),
|
|
('notes', models.TextField(blank=True)),
|
|
('metadata', models.JSONField(blank=True, default=dict)),
|
|
('changed_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='rca_status_changes', to=settings.AUTH_USER_MODEL)),
|
|
('rca', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='status_logs', to='rca.rootcauseanalysis')),
|
|
],
|
|
options={
|
|
'verbose_name': 'RCA Status Log',
|
|
'verbose_name_plural': 'RCA Status Logs',
|
|
'ordering': ['-created_at'],
|
|
},
|
|
),
|
|
migrations.CreateModel(
|
|
name='RCARootCause',
|
|
fields=[
|
|
('created_at', models.DateTimeField(auto_now_add=True, db_index=True)),
|
|
('updated_at', models.DateTimeField(auto_now=True)),
|
|
('id', models.UUIDField(default=uuid.uuid4, editable=False, primary_key=True, serialize=False)),
|
|
('description', models.TextField(help_text='Description of root cause')),
|
|
('category', models.CharField(choices=[('process', 'Process/Procedure'), ('people', 'People/Training'), ('equipment', 'Equipment/Resources'), ('communication', 'Communication'), ('policy', 'Policy/Regulation'), ('environment', 'Environment'), ('technology', 'Technology/Systems'), ('other', 'Other')], db_index=True, max_length=50)),
|
|
('contributing_factors', models.TextField(blank=True, help_text='Factors that contributed to this root cause')),
|
|
('likelihood', models.IntegerField(blank=True, help_text='Likelihood score (1-5)', null=True)),
|
|
('impact', models.IntegerField(blank=True, help_text='Impact score (1-5)', null=True)),
|
|
('risk_score', models.IntegerField(blank=True, help_text='Risk score (likelihood * impact)', null=True)),
|
|
('evidence', models.TextField(blank=True, help_text='Evidence supporting this root cause')),
|
|
('is_verified', models.BooleanField(default=False)),
|
|
('verified_at', models.DateTimeField(blank=True, null=True)),
|
|
('verified_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='verified_root_causes', to=settings.AUTH_USER_MODEL)),
|
|
('rca', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='root_causes', to='rca.rootcauseanalysis')),
|
|
],
|
|
options={
|
|
'verbose_name': 'Root Cause',
|
|
'verbose_name_plural': 'Root Causes',
|
|
'ordering': ['-created_at'],
|
|
},
|
|
),
|
|
migrations.CreateModel(
|
|
name='RCANote',
|
|
fields=[
|
|
('created_at', models.DateTimeField(auto_now_add=True, db_index=True)),
|
|
('updated_at', models.DateTimeField(auto_now=True)),
|
|
('id', models.UUIDField(default=uuid.uuid4, editable=False, primary_key=True, serialize=False)),
|
|
('note', models.TextField()),
|
|
('is_internal', models.BooleanField(default=True, help_text='Internal note (not visible in reports)')),
|
|
('created_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='rca_notes', to=settings.AUTH_USER_MODEL)),
|
|
('rca', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='notes', to='rca.rootcauseanalysis')),
|
|
],
|
|
options={
|
|
'verbose_name': 'RCA Note',
|
|
'verbose_name_plural': 'RCA Notes',
|
|
'ordering': ['-created_at'],
|
|
},
|
|
),
|
|
migrations.CreateModel(
|
|
name='RCACorrectiveAction',
|
|
fields=[
|
|
('created_at', models.DateTimeField(auto_now_add=True, db_index=True)),
|
|
('updated_at', models.DateTimeField(auto_now=True)),
|
|
('id', models.UUIDField(default=uuid.uuid4, editable=False, primary_key=True, serialize=False)),
|
|
('description', models.TextField(help_text='Description of corrective action')),
|
|
('action_type', models.CharField(choices=[('preventive', 'Preventive'), ('corrective', 'Corrective'), ('immediate', 'Immediate Action'), ('long_term', 'Long-term Solution')], db_index=True, default='corrective', max_length=20)),
|
|
('target_date', models.DateField(blank=True, help_text='Target date for completion', null=True)),
|
|
('completion_date', models.DateField(blank=True, help_text='Actual completion date', null=True)),
|
|
('status', models.CharField(choices=[('not_started', 'Not Started'), ('in_progress', 'In Progress'), ('completed', 'Completed'), ('cancelled', 'Cancelled')], db_index=True, default='not_started', max_length=20)),
|
|
('effectiveness_measure', models.TextField(blank=True, help_text='How effectiveness will be measured')),
|
|
('effectiveness_assessment', models.TextField(blank=True, help_text='Assessment of action effectiveness')),
|
|
('effectiveness_score', models.IntegerField(blank=True, help_text='Effectiveness score (1-5)', null=True)),
|
|
('obstacles', models.TextField(blank=True, help_text='Obstacles encountered during implementation')),
|
|
('metadata', models.JSONField(blank=True, default=dict)),
|
|
('responsible_person', models.ForeignKey(blank=True, help_text='Person responsible for implementing the action', null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='corrective_actions', to='organizations.staff')),
|
|
('root_cause', models.ForeignKey(blank=True, help_text='Root cause this action addresses', null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='corrective_actions', to='rca.rcarootcause')),
|
|
('rca', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='corrective_actions', to='rca.rootcauseanalysis')),
|
|
],
|
|
options={
|
|
'verbose_name': 'Corrective Action',
|
|
'verbose_name_plural': 'Corrective Actions',
|
|
'ordering': ['target_date', '-created_at'],
|
|
},
|
|
),
|
|
migrations.CreateModel(
|
|
name='RCAAttachment',
|
|
fields=[
|
|
('created_at', models.DateTimeField(auto_now_add=True, db_index=True)),
|
|
('updated_at', models.DateTimeField(auto_now=True)),
|
|
('id', models.UUIDField(default=uuid.uuid4, editable=False, primary_key=True, serialize=False)),
|
|
('file', models.FileField(upload_to='rca/%Y/%m/%d/')),
|
|
('filename', models.CharField(max_length=500)),
|
|
('file_type', models.CharField(blank=True, max_length=100)),
|
|
('file_size', models.IntegerField(help_text='File size in bytes')),
|
|
('description', models.TextField(blank=True)),
|
|
('uploaded_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='rca_attachments', to=settings.AUTH_USER_MODEL)),
|
|
('rca', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='attachments', to='rca.rootcauseanalysis')),
|
|
],
|
|
options={
|
|
'verbose_name': 'RCA Attachment',
|
|
'verbose_name_plural': 'RCA Attachments',
|
|
'ordering': ['-created_at'],
|
|
},
|
|
),
|
|
migrations.AddIndex(
|
|
model_name='rootcauseanalysis',
|
|
index=models.Index(fields=['status', '-created_at'], name='rca_rootcau_status_de172e_idx'),
|
|
),
|
|
migrations.AddIndex(
|
|
model_name='rootcauseanalysis',
|
|
index=models.Index(fields=['hospital', 'status', '-created_at'], name='rca_rootcau_hospita_105ba2_idx'),
|
|
),
|
|
migrations.AddIndex(
|
|
model_name='rootcauseanalysis',
|
|
index=models.Index(fields=['department', 'status', '-created_at'], name='rca_rootcau_departm_ca310d_idx'),
|
|
),
|
|
migrations.AddIndex(
|
|
model_name='rootcauseanalysis',
|
|
index=models.Index(fields=['assigned_to', 'status', '-created_at'], name='rca_rootcau_assigne_71e4cf_idx'),
|
|
),
|
|
migrations.AddIndex(
|
|
model_name='rootcauseanalysis',
|
|
index=models.Index(fields=['is_deleted', '-created_at'], name='rca_rootcau_is_dele_1b8ad5_idx'),
|
|
),
|
|
migrations.AddIndex(
|
|
model_name='rootcauseanalysis',
|
|
index=models.Index(fields=['content_type', 'object_id'], name='rca_rootcau_content_08b595_idx'),
|
|
),
|
|
migrations.AddIndex(
|
|
model_name='rcastatuslog',
|
|
index=models.Index(fields=['rca', '-created_at'], name='rca_rcastat_rca_id_26e67b_idx'),
|
|
),
|
|
migrations.AddIndex(
|
|
model_name='rcastatuslog',
|
|
index=models.Index(fields=['new_status', '-created_at'], name='rca_rcastat_new_sta_09a9ea_idx'),
|
|
),
|
|
migrations.AddIndex(
|
|
model_name='rcarootcause',
|
|
index=models.Index(fields=['rca', '-created_at'], name='rca_rcaroot_rca_id_4c7113_idx'),
|
|
),
|
|
migrations.AddIndex(
|
|
model_name='rcarootcause',
|
|
index=models.Index(fields=['category', '-created_at'], name='rca_rcaroot_categor_9eb3ca_idx'),
|
|
),
|
|
migrations.AddIndex(
|
|
model_name='rcanote',
|
|
index=models.Index(fields=['rca', '-created_at'], name='rca_rcanote_rca_id_ade9da_idx'),
|
|
),
|
|
migrations.AddIndex(
|
|
model_name='rcacorrectiveaction',
|
|
index=models.Index(fields=['rca', '-created_at'], name='rca_rcacorr_rca_id_49e717_idx'),
|
|
),
|
|
migrations.AddIndex(
|
|
model_name='rcacorrectiveaction',
|
|
index=models.Index(fields=['status', 'target_date'], name='rca_rcacorr_status_96ba71_idx'),
|
|
),
|
|
migrations.AddIndex(
|
|
model_name='rcacorrectiveaction',
|
|
index=models.Index(fields=['action_type', '-created_at'], name='rca_rcacorr_action__39700e_idx'),
|
|
),
|
|
]
|