"""Add long-form detail content to homepage team buildings. Revision ID: 0020_home_team_building_details Revises: 0019_home_wild_archive_images """ from alembic import context, op import sqlalchemy as sa from sqlalchemy import inspect from sqlalchemy.dialects import postgresql from app.migration_compat import baseline_column_names revision = "0020_home_team_building_details" down_revision = "0019_home_wild_archive_images" branch_labels = None depends_on = None DETAIL_COLUMNS = {"detailSubtitle", "detailParagraphs"} def missing_detail_columns(existing_columns: set[str]) -> set[str]: return DETAIL_COLUMNS.difference(existing_columns) def is_offline_mode() -> bool: try: return context.is_offline_mode() except (NameError, AttributeError): return False def upgrade() -> None: if is_offline_mode(): columns_to_add = missing_detail_columns( baseline_column_names("HomeTeamBuilding") ) else: bind = op.get_bind() existing_columns = {column["name"] for column in inspect(bind).get_columns("HomeTeamBuilding")} columns_to_add = missing_detail_columns(existing_columns) if "detailSubtitle" in columns_to_add: op.add_column( "HomeTeamBuilding", sa.Column("detailSubtitle", sa.String(), nullable=False, server_default=""), ) if "detailParagraphs" in columns_to_add: op.add_column( "HomeTeamBuilding", sa.Column( "detailParagraphs", postgresql.JSONB(astext_type=sa.Text()), nullable=False, server_default=sa.text("'[]'::jsonb"), ), ) op.execute( sa.text( 'UPDATE "HomeTeamBuilding" ' 'SET "detailSubtitle" = CASE ' 'WHEN COALESCE("detailSubtitle", \'\') = \'\' THEN "description" ' 'ELSE "detailSubtitle" END, ' '"detailParagraphs" = CASE ' 'WHEN "detailParagraphs" IS NULL OR jsonb_typeof("detailParagraphs") <> \'array\' ' 'OR (jsonb_typeof("detailParagraphs") = \'array\' ' 'AND jsonb_array_length("detailParagraphs") = 0) ' 'THEN jsonb_build_array("description") ' 'ELSE "detailParagraphs" END ' 'WHERE COALESCE("detailSubtitle", \'\') = \'\' ' 'OR "detailParagraphs" IS NULL ' 'OR jsonb_typeof("detailParagraphs") <> \'array\' ' 'OR (jsonb_typeof("detailParagraphs") = \'array\' ' 'AND jsonb_array_length("detailParagraphs") = 0)' ) ) if "detailSubtitle" in columns_to_add: op.alter_column("HomeTeamBuilding", "detailSubtitle", server_default=None) if "detailParagraphs" in columns_to_add: op.alter_column("HomeTeamBuilding", "detailParagraphs", server_default=None) def downgrade() -> None: op.drop_column("HomeTeamBuilding", "detailParagraphs") op.drop_column("HomeTeamBuilding", "detailSubtitle")