| 1 | """Add case template tables |
| 2 | |
| 3 | Revision ID: 6ba5c2887ec5 |
| 4 | Revises: 51e33a247851 |
| 5 | Create Date: 2026-04-26 19:01:10.218459 |
| 6 | |
| 7 | """ |
| 8 | from typing import Sequence |
| 9 | from typing import Union |
| 10 | |
| 11 | import sqlalchemy as sa |
| 12 | |
| 13 | from alembic import op |
| 14 | |
| 15 | # revision identifiers, used by Alembic. |
| 16 | revision: str = "6ba5c2887ec5" |
| 17 | down_revision: Union[str, None] = "51e33a247851" |
| 18 | branch_labels: Union[str, Sequence[str], None] = None |
| 19 | depends_on: Union[str, Sequence[str], None] = None |
| 20 | |
| 21 | |
| 22 | def upgrade() -> None: |
| 23 | # ### commands auto generated by Alembic - please adjust! ### |
| 24 | op.create_table( |
| 25 | "incident_management_case_template", |
| 26 | sa.Column("id", sa.Integer(), nullable=False), |
| 27 | sa.Column("name", sa.String(length=255), nullable=False), |
| 28 | sa.Column("description", sa.String(length=255), nullable=True), |
| 29 | sa.Column("customer_code", sa.String(length=50), nullable=True), |
| 30 | sa.Column("source", sa.String(length=50), nullable=True), |
| 31 | sa.Column("is_default", sa.Boolean(), nullable=False), |
| 32 | sa.Column("created_by", sa.String(length=100), nullable=False), |
| 33 | sa.Column("created_at", sa.DateTime(), nullable=False), |
| 34 | sa.Column("updated_at", sa.DateTime(), nullable=False), |
| 35 | sa.PrimaryKeyConstraint("id"), |
| 36 | ) |
| 37 | op.create_table( |
| 38 | "incident_management_case_event", |
| 39 | sa.Column("payload", sa.JSON(), nullable=True), |
| 40 | sa.Column("id", sa.Integer(), nullable=False), |
| 41 | sa.Column("case_id", sa.Integer(), nullable=False), |
| 42 | sa.Column("event_type", sa.String(length=64), nullable=False), |
| 43 | sa.Column("actor", sa.String(length=100), nullable=False), |
| 44 | sa.Column("timestamp", sa.DateTime(), nullable=False), |
| 45 | sa.ForeignKeyConstraint( |
| 46 | ["case_id"], |
| 47 | ["incident_management_case.id"], |
| 48 | ), |
| 49 | sa.PrimaryKeyConstraint("id"), |
| 50 | ) |
| 51 | op.create_index(op.f("ix_incident_management_case_event_case_id"), "incident_management_case_event", ["case_id"], unique=False) |
| 52 | op.create_index(op.f("ix_incident_management_case_event_event_type"), "incident_management_case_event", ["event_type"], unique=False) |
| 53 | op.create_index(op.f("ix_incident_management_case_event_timestamp"), "incident_management_case_event", ["timestamp"], unique=False) |
| 54 | op.create_table( |
| 55 | "incident_management_case_template_task", |
| 56 | sa.Column("id", sa.Integer(), nullable=False), |
| 57 | sa.Column("template_id", sa.Integer(), nullable=False), |
| 58 | sa.Column("title", sa.String(length=500), nullable=False), |
| 59 | sa.Column("description", sa.String(length=255), nullable=True), |
| 60 | sa.Column("guidelines", sa.String(length=255), nullable=True), |
| 61 | sa.Column("mandatory", sa.Boolean(), nullable=False), |
| 62 | sa.Column("order_index", sa.Integer(), nullable=False), |
| 63 | sa.ForeignKeyConstraint( |
| 64 | ["template_id"], |
| 65 | ["incident_management_case_template.id"], |
| 66 | ), |
| 67 | sa.PrimaryKeyConstraint("id"), |
| 68 | ) |
| 69 | op.create_table( |
| 70 | "incident_management_case_task", |
| 71 | sa.Column("id", sa.Integer(), nullable=False), |
| 72 | sa.Column("case_id", sa.Integer(), nullable=False), |
| 73 | sa.Column("template_task_id", sa.Integer(), nullable=True), |
| 74 | sa.Column("title", sa.String(length=500), nullable=False), |
| 75 | sa.Column("description", sa.String(length=255), nullable=True), |
| 76 | sa.Column("guidelines", sa.String(length=255), nullable=True), |
| 77 | sa.Column("mandatory", sa.Boolean(), nullable=False), |
| 78 | sa.Column("order_index", sa.Integer(), nullable=False), |
| 79 | sa.Column("status", sa.String(length=50), nullable=False), |
| 80 | sa.Column("evidence_comment", sa.String(length=255), nullable=True), |
| 81 | sa.Column("completed_by", sa.String(length=100), nullable=True), |
| 82 | sa.Column("completed_at", sa.DateTime(), nullable=True), |
| 83 | sa.Column("created_by", sa.String(length=100), nullable=False), |
| 84 | sa.Column("created_at", sa.DateTime(), nullable=False), |
| 85 | sa.Column("updated_at", sa.DateTime(), nullable=False), |
| 86 | sa.ForeignKeyConstraint( |
| 87 | ["case_id"], |
| 88 | ["incident_management_case.id"], |
| 89 | ), |
| 90 | sa.ForeignKeyConstraint( |
| 91 | ["template_task_id"], |
| 92 | ["incident_management_case_template_task.id"], |
| 93 | ), |
| 94 | sa.PrimaryKeyConstraint("id"), |
| 95 | ) |
| 96 | # ### end Alembic commands ### |
| 97 | |
| 98 | |
| 99 | def downgrade() -> None: |
| 100 | # ### commands auto generated by Alembic - please adjust! ### |
| 101 | op.drop_table("incident_management_case_task") |
| 102 | op.drop_table("incident_management_case_template_task") |
| 103 | op.drop_index(op.f("ix_incident_management_case_event_timestamp"), table_name="incident_management_case_event") |
| 104 | op.drop_index(op.f("ix_incident_management_case_event_event_type"), table_name="incident_management_case_event") |
| 105 | op.drop_index(op.f("ix_incident_management_case_event_case_id"), table_name="incident_management_case_event") |
| 106 | op.drop_table("incident_management_case_event") |
| 107 | op.drop_table("incident_management_case_template") |
| 108 | # ### end Alembic commands ### |