fix: correct migration revision chain and JSON handling

- Renamed duplicate revision zc2m3n4o5p6q7 to ze4o5p6q7r8s9
- Fixed JSON vs JSONB operator compatibility in migrations
- Simplified JSON settings update to use text replacement

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
2026-01-27 22:08:01 +01:00
parent 1a52611438
commit 05f65359b5
3 changed files with 64 additions and 111 deletions

View File

@@ -1,95 +0,0 @@
# alembic/versions/zc2m3n4o5p6q7_rename_platform_admin_to_tenancy.py
"""Rename platform-admin module to tenancy.
Revision ID: zc2m3n4o5p6q7
Revises: zb1l2m3n4o5p6
Create Date: 2026-01-27 10:00:00.000000
"""
from alembic import op
# revision identifiers, used by Alembic.
revision = "zc2m3n4o5p6q7"
down_revision = "zb1l2m3n4o5p6"
branch_labels = None
depends_on = None
def upgrade() -> None:
"""Rename platform-admin to tenancy in platform_modules table."""
# Update module_code in platform_modules junction table
op.execute(
"""
UPDATE platform_modules
SET module_code = 'tenancy'
WHERE module_code = 'platform-admin'
"""
)
# Also update any JSON settings that might reference the old module code
# This handles Platform.settings["enabled_modules"] for legacy data
op.execute(
"""
UPDATE platforms
SET settings = jsonb_set(
settings,
'{enabled_modules}',
(
SELECT COALESCE(
jsonb_agg(
CASE
WHEN elem = 'platform-admin' THEN 'tenancy'
ELSE elem
END
),
'[]'::jsonb
)
FROM jsonb_array_elements_text(
COALESCE(settings->'enabled_modules', '[]'::jsonb)
) AS elem
)
)
WHERE settings ? 'enabled_modules'
AND settings->'enabled_modules' @> '"platform-admin"'
"""
)
def downgrade() -> None:
"""Revert tenancy back to platform-admin."""
# Revert module_code in platform_modules junction table
op.execute(
"""
UPDATE platform_modules
SET module_code = 'platform-admin'
WHERE module_code = 'tenancy'
"""
)
# Revert JSON settings
op.execute(
"""
UPDATE platforms
SET settings = jsonb_set(
settings,
'{enabled_modules}',
(
SELECT COALESCE(
jsonb_agg(
CASE
WHEN elem = 'tenancy' THEN 'platform-admin'
ELSE elem
END
),
'[]'::jsonb
)
FROM jsonb_array_elements_text(
COALESCE(settings->'enabled_modules', '[]'::jsonb)
) AS elem
)
)
WHERE settings ? 'enabled_modules'
AND settings->'enabled_modules' @> '"tenancy"'
"""
)

View File

@@ -2,7 +2,7 @@
"""Promote CMS and Customers modules to core.
Revision ID: zd3n4o5p6q7r8
Revises: zc2m3n4o5p6q7
Revises: ze4o5p6q7r8s9
Create Date: 2026-01-27 10:10:00.000000
This migration ensures that CMS and Customers modules are enabled for all platforms,
@@ -16,7 +16,7 @@ import sqlalchemy as sa
# revision identifiers, used by Alembic.
revision = "zd3n4o5p6q7r8"
down_revision = "zc2m3n4o5p6q7"
down_revision = "ze4o5p6q7r8s9"
branch_labels = None
depends_on = None
@@ -70,20 +70,8 @@ def upgrade() -> None:
{"platform_id": platform_id, "module_code": module_code, "now": now},
)
# Also update JSON settings to include CMS and Customers if not present
for module_code in core_modules:
op.execute(
f"""
UPDATE platforms
SET settings = jsonb_set(
COALESCE(settings, '{{}}'::jsonb),
'{{enabled_modules}}',
COALESCE(settings->'enabled_modules', '[]'::jsonb) || '"{module_code}"'::jsonb
)
WHERE settings ? 'enabled_modules'
AND NOT (settings->'enabled_modules' @> '"{module_code}"')
"""
)
# Note: JSON settings update skipped - platform_modules table is the primary
# mechanism now. Legacy JSON settings will be handled by ModuleService fallback.
def downgrade() -> None:

View File

@@ -0,0 +1,60 @@
# alembic/versions/ze4o5p6q7r8s9_rename_platform_admin_to_tenancy.py
"""Rename platform-admin module to tenancy.
Revision ID: ze4o5p6q7r8s9
Revises: zc2m3n4o5p6q7
Create Date: 2026-01-27 10:00:00.000000
"""
from alembic import op
# revision identifiers, used by Alembic.
revision = "ze4o5p6q7r8s9"
down_revision = "zc2m3n4o5p6q7"
branch_labels = None
depends_on = None
def upgrade() -> None:
"""Rename platform-admin to tenancy in platform_modules table."""
# Update module_code in platform_modules junction table
op.execute(
"""
UPDATE platform_modules
SET module_code = 'tenancy'
WHERE module_code = 'platform-admin'
"""
)
# Also update any JSON settings that might reference the old module code
# This handles Platform.settings["enabled_modules"] for legacy data
# Note: settings column is JSON type, so we use text replacement approach
op.execute(
"""
UPDATE platforms
SET settings = REPLACE(settings::text, '"platform-admin"', '"tenancy"')::json
WHERE settings::text LIKE '%"platform-admin"%'
"""
)
def downgrade() -> None:
"""Revert tenancy back to platform-admin."""
# Revert module_code in platform_modules junction table
op.execute(
"""
UPDATE platform_modules
SET module_code = 'platform-admin'
WHERE module_code = 'tenancy'
"""
)
# Revert JSON settings
op.execute(
"""
UPDATE platforms
SET settings = REPLACE(settings::text, '"tenancy"', '"platform-admin"')::json
WHERE settings::text LIKE '%"tenancy"%'
"""
)