Alembic fix for PROD #19

Merged
andika merged 1 commits from dev into loaf-prod 2026-01-05 10:31:38 +00:00
Showing only changes of commit cca694766b - Show all commits

View File

@@ -85,61 +85,78 @@ def upgrade() -> None:
print("\n[3/3] Fixing UserStatus enum values...") print("\n[3/3] Fixing UserStatus enum values...")
try: try:
# First, check if any users have deprecated status values # First, check if the enum has deprecated values
deprecated_count = conn.execute(sa.text(""" enum_values = conn.execute(sa.text("""
SELECT COUNT(*) FROM users SELECT enumlabel
WHERE status IN ('pending_approval', 'pre_approved') FROM pg_enum
""")).scalar() WHERE enumtypid = (
SELECT oid FROM pg_type WHERE typname = 'userstatus'
)
""")).fetchall()
if deprecated_count > 0: enum_values_list = [row[0] for row in enum_values]
print(f" ⏳ Migrating {deprecated_count} users with deprecated status values...") has_deprecated = 'pending_approval' in enum_values_list or 'pre_approved' in enum_values_list
# Migrate deprecated values to new equivalents if not has_deprecated:
conn.execute(sa.text(""" print(" ✓ UserStatus enum already correct (no deprecated values)")
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")
else: else:
print(" ✓ No users with deprecated status values") print(" ⏳ Found deprecated enum values, migrating...")
# Now remove deprecated enum values # Check if any users have deprecated status values
# PostgreSQL doesn't support removing enum values directly, deprecated_count = conn.execute(sa.text("""
# so we need to recreate the enum SELECT COUNT(*) FROM users
conn.execute(sa.text(""" WHERE status IN ('pending_approval', 'pre_approved')
-- Create new enum with correct values (matches models.py) """)).scalar()
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 if deprecated_count > 0:
ALTER TABLE users print(f" ⏳ Migrating {deprecated_count} users with deprecated status values...")
ALTER COLUMN status TYPE userstatus_new
USING status::text::userstatus_new;
-- Drop old enum and rename new one # Migrate deprecated values to new equivalents
DROP TYPE userstatus; conn.execute(sa.text("""
ALTER TYPE userstatus_new RENAME TO userstatus; 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: except Exception as e:
print(f" ⚠️ Warning: Enum update failed (may already be correct): {e}") print(f" ⚠️ Warning: Enum update failed (may already be correct): {e}")