From cca694766ba84c4eb82d2fe8cef807ee054ac335 Mon Sep 17 00:00:00 2001 From: Koncept Kit <63216427+konceptkit@users.noreply.github.com> Date: Mon, 5 Jan 2026 17:29:41 +0700 Subject: [PATCH] Alembic fix for PROD --- .../versions/012_fix_remaining_differences.py | 113 ++++++++++-------- 1 file changed, 65 insertions(+), 48 deletions(-) diff --git a/alembic/versions/012_fix_remaining_differences.py b/alembic/versions/012_fix_remaining_differences.py index ab9a5ed..62245ab 100644 --- a/alembic/versions/012_fix_remaining_differences.py +++ b/alembic/versions/012_fix_remaining_differences.py @@ -85,61 +85,78 @@ def upgrade() -> None: print("\n[3/3] Fixing UserStatus enum values...") try: - # First, check if any users have deprecated status values - deprecated_count = conn.execute(sa.text(""" - SELECT COUNT(*) FROM users - WHERE status IN ('pending_approval', 'pre_approved') - """)).scalar() + # First, check if the enum has deprecated values + enum_values = conn.execute(sa.text(""" + SELECT enumlabel + FROM pg_enum + WHERE enumtypid = ( + SELECT oid FROM pg_type WHERE typname = 'userstatus' + ) + """)).fetchall() - if deprecated_count > 0: - print(f" ⏳ Migrating {deprecated_count} users with deprecated status values...") + enum_values_list = [row[0] for row in enum_values] + has_deprecated = 'pending_approval' in enum_values_list or 'pre_approved' in enum_values_list - # Migrate deprecated values to new equivalents - conn.execute(sa.text(""" - UPDATE users - SET status = 'pre_validated' - WHERE status = 'pre_approved' - """)) - - conn.execute(sa.text(""" - UPDATE users - SET status = 'payment_pending' - WHERE status = 'pending_approval' - """)) - - print(" ✓ Migrated deprecated status values") + if not has_deprecated: + print(" ✓ UserStatus enum already correct (no deprecated values)") else: - print(" ✓ No users with deprecated status values") + print(" ⏳ Found deprecated enum values, migrating...") - # Now remove deprecated enum values - # PostgreSQL doesn't support removing enum values directly, - # so we need to recreate the enum - conn.execute(sa.text(""" - -- Create new enum with correct values (matches models.py) - CREATE TYPE userstatus_new AS ENUM ( - 'pending_email', - 'pending_validation', - 'pre_validated', - 'payment_pending', - 'active', - 'inactive', - 'canceled', - 'expired', - 'rejected', - 'abandoned' - ); + # Check if any users have deprecated status values + deprecated_count = conn.execute(sa.text(""" + SELECT COUNT(*) FROM users + WHERE status IN ('pending_approval', 'pre_approved') + """)).scalar() - -- Update column to use new enum - ALTER TABLE users - ALTER COLUMN status TYPE userstatus_new - USING status::text::userstatus_new; + if deprecated_count > 0: + print(f" ⏳ Migrating {deprecated_count} users with deprecated status values...") - -- Drop old enum and rename new one - DROP TYPE userstatus; - ALTER TYPE userstatus_new RENAME TO userstatus; - """)) + # Migrate deprecated values to new equivalents + conn.execute(sa.text(""" + UPDATE users + SET status = 'pre_validated' + WHERE status = 'pre_approved' + """)) - print(" ✓ Updated UserStatus enum (removed deprecated values)") + conn.execute(sa.text(""" + UPDATE users + SET status = 'payment_pending' + WHERE status = 'pending_approval' + """)) + + print(" ✓ Migrated deprecated status values") + else: + print(" ✓ No users with deprecated status values") + + # Now remove deprecated enum values + # PostgreSQL doesn't support removing enum values directly, + # so we need to recreate the enum + conn.execute(sa.text(""" + -- Create new enum with correct values (matches models.py) + CREATE TYPE userstatus_new AS ENUM ( + 'pending_email', + 'pending_validation', + 'pre_validated', + 'payment_pending', + 'active', + 'inactive', + 'canceled', + 'expired', + 'rejected', + 'abandoned' + ); + + -- Update column to use new enum + ALTER TABLE users + ALTER COLUMN status TYPE userstatus_new + USING status::text::userstatus_new; + + -- Drop old enum and rename new one + DROP TYPE userstatus; + ALTER TYPE userstatus_new RENAME TO userstatus; + """)) + + print(" ✓ Updated UserStatus enum (removed deprecated values)") except Exception as e: print(f" ⚠️ Warning: Enum update failed (may already be correct): {e}")