forked from andika/membership-be
Merge pull request 'Alembic fix for PROD' (#19) from dev into loaf-prod
Reviewed-on: andika/membership-be#19
This commit is contained in:
@@ -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}")
|
||||||
|
|||||||
Reference in New Issue
Block a user