feat: add platform detail/edit admin UI and service enhancements

- Add platform detail and edit admin pages with templates and JS
- Add ContentPageService methods: list_all_platform_pages, list_all_vendor_defaults
- Deprecate /admin/platform-homepage route (redirects to /admin/platforms)
- Add migration to fix content_page nullable columns
- Refine platform and vendor context middleware
- Add platform context middleware unit tests
- Update platforms.js with improved functionality
- Add section-based homepage plan documentation

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
2026-01-23 14:08:02 +01:00
parent d70a9f38d4
commit 3d3b8cae22
25 changed files with 3233 additions and 95 deletions

View File

@@ -178,9 +178,7 @@ def upgrade() -> None:
""")
)
# Get the OMS platform ID
result = conn.execute(sa.text("SELECT id FROM platforms WHERE code = 'oms'"))
oms_platform_id = result.fetchone()[0]
I dn
# =========================================================================
# 6. Backfill content_pages with platform_id

View File

@@ -0,0 +1,115 @@
"""Fix content_page nullable boolean columns
Revision ID: z7h8i9j0k1l2
Revises: z6g7h8i9j0k1
Create Date: 2026-01-20
This migration:
1. Sets NULL values to defaults for boolean and integer columns
2. Alters columns to be NOT NULL
"""
from alembic import op
import sqlalchemy as sa
# revision identifiers, used by Alembic.
revision = "z7h8i9j0k1l2"
down_revision = "z6g7h8i9j0k1"
branch_labels = None
depends_on = None
def upgrade() -> None:
# First, update any NULL values to defaults
op.execute("""
UPDATE content_pages
SET display_order = 0
WHERE display_order IS NULL
""")
op.execute("""
UPDATE content_pages
SET show_in_footer = true
WHERE show_in_footer IS NULL
""")
op.execute("""
UPDATE content_pages
SET show_in_header = false
WHERE show_in_header IS NULL
""")
op.execute("""
UPDATE content_pages
SET show_in_legal = false
WHERE show_in_legal IS NULL
""")
# Now alter columns to be NOT NULL
op.alter_column(
"content_pages",
"display_order",
existing_type=sa.Integer(),
nullable=False,
server_default="0",
)
op.alter_column(
"content_pages",
"show_in_footer",
existing_type=sa.Boolean(),
nullable=False,
server_default="true",
)
op.alter_column(
"content_pages",
"show_in_header",
existing_type=sa.Boolean(),
nullable=False,
server_default="false",
)
op.alter_column(
"content_pages",
"show_in_legal",
existing_type=sa.Boolean(),
nullable=False,
server_default="false",
)
def downgrade() -> None:
# Revert columns to nullable (no server default)
op.alter_column(
"content_pages",
"display_order",
existing_type=sa.Integer(),
nullable=True,
server_default=None,
)
op.alter_column(
"content_pages",
"show_in_footer",
existing_type=sa.Boolean(),
nullable=True,
server_default=None,
)
op.alter_column(
"content_pages",
"show_in_header",
existing_type=sa.Boolean(),
nullable=True,
server_default=None,
)
op.alter_column(
"content_pages",
"show_in_legal",
existing_type=sa.Boolean(),
nullable=True,
server_default=None,
)