health-apps-cms/migrations/versions/0ce7107c1910_fix_enum_clini...

128 lines
5.1 KiB
Python

"""fix enum clinic doctor
Revision ID: 0ce7107c1910
Revises: a3a9b7d17bdd
Create Date: 2025-05-13 12:20:49.384154
"""
from typing import Sequence, Union
from alembic import op
import sqlalchemy as sa
from sqlalchemy.dialects import postgresql
from sqlalchemy import text
# revision identifiers, used by Alembic.
revision: str = '0ce7107c1910'
down_revision: Union[str, None] = 'a3a9b7d17bdd'
branch_labels: Union[str, Sequence[str], None] = None
depends_on: Union[str, Sequence[str], None] = None
def upgrade() -> None:
"""Upgrade schema."""
# ### commands auto generated by Alembic - please adjust! ###
# Check if the enum type exists before creating it
conn = op.get_bind()
result = conn.execute(text("SELECT EXISTS(SELECT 1 FROM pg_type WHERE typname = 'clinicdoctortype')"))
enum_exists = result.scalar()
if not enum_exists:
# Create the new enum type if it doesn't exist
op.execute(text("CREATE TYPE clinicdoctortype AS ENUM ('DOCTOR', 'NURSE')"))
# Check if the new_role column already exists
inspector = sa.inspect(conn)
columns = inspector.get_columns('clinic_doctors')
column_names = [column['name'] for column in columns]
if 'new_role' not in column_names:
# Add a temporary column with the new type
op.add_column('clinic_doctors', sa.Column('new_role', postgresql.ENUM('DOCTOR', 'NURSE', name='clinicdoctortype'), nullable=True))
# Update the temporary column with values based on the old column
op.execute(text("UPDATE clinic_doctors SET new_role = 'DOCTOR' WHERE role = 'DIRECTOR'"))
op.execute(text("UPDATE clinic_doctors SET new_role = 'NURSE' WHERE role = 'PRACTICE_MANAGER'"))
# Drop the old column and rename the new one
op.drop_column('clinic_doctors', 'role')
op.alter_column('clinic_doctors', 'new_role', new_column_name='role')
# We need to handle the users table that depends on the clinicuserroles enum
# First check if the users table has a clinicRole column that uses the enum
has_clinic_role = False
try:
user_columns = inspector.get_columns('users')
for column in user_columns:
if column['name'] == 'clinicRole':
has_clinic_role = True
break
except:
# Table might not exist
pass
if has_clinic_role:
# We need to update the users table to not use the enum before dropping it
# First, create a temporary column with a string type
op.add_column('users', sa.Column('temp_clinic_role', sa.String(), nullable=True))
# Copy the values - use double quotes to preserve case sensitivity in PostgreSQL
op.execute(text('UPDATE users SET temp_clinic_role = "clinicRole"::text'))
# Drop the old column and rename the new one
op.drop_column('users', 'clinicRole')
op.alter_column('users', 'temp_clinic_role', new_column_name='clinicRole')
# Now we can safely drop the old enum type
op.execute(text("DROP TYPE IF EXISTS clinicuserroles"))
# ### end Alembic commands ###
def downgrade() -> None:
"""Downgrade schema."""
# ### commands auto generated by Alembic - please adjust! ###
# Create the old enum type
op.execute(text("CREATE TYPE clinicuserroles AS ENUM ('DIRECTOR', 'PRACTICE_MANAGER')"))
# Add a temporary column with the old type
op.add_column('clinic_doctors', sa.Column('old_role', postgresql.ENUM('DIRECTOR', 'PRACTICE_MANAGER', name='clinicuserroles'), nullable=True))
# Update the temporary column with values based on the new column
op.execute(text("UPDATE clinic_doctors SET old_role = 'DIRECTOR' WHERE role = 'DOCTOR'"))
op.execute(text("UPDATE clinic_doctors SET old_role = 'PRACTICE_MANAGER' WHERE role = 'NURSE'"))
# Drop the new column and rename the old one
op.drop_column('clinic_doctors', 'role')
op.alter_column('clinic_doctors', 'old_role', new_column_name='role')
# If we modified the users table in the upgrade, we need to restore it
conn = op.get_bind()
inspector = sa.inspect(conn)
has_clinic_role = False
try:
user_columns = inspector.get_columns('users')
for column in user_columns:
if column['name'] == 'clinicRole':
has_clinic_role = True
break
except:
pass
if has_clinic_role:
# Create a temporary column with the enum type
op.add_column('users', sa.Column('temp_clinic_role', postgresql.ENUM('DIRECTOR', 'PRACTICE_MANAGER', name='clinicuserroles'), nullable=True))
# Copy the values (with appropriate conversion) - use double quotes to preserve case sensitivity
op.execute(text('UPDATE users SET temp_clinic_role = "clinicRole"::clinicuserroles'))
# Drop the old column and rename the new one
op.drop_column('users', 'clinicRole')
op.alter_column('users', 'temp_clinic_role', new_column_name='clinicRole')
# Drop the new enum type
op.execute(text("DROP TYPE IF EXISTS clinicdoctortype"))
# ### end Alembic commands ###
# ### end Alembic commands ###