"""Add configurable price presentation fields to detail records.""" from alembic import context, op import sqlalchemy as sa from sqlalchemy import inspect from app.migration_compat import baseline_column_names revision = "0037_detail_price_config" down_revision = "0036_customer_browse_history" branch_labels = None depends_on = None PRICE_COLUMNS = { "priceStartingValue", "priceUnit", "pricePeopleRange", "priceDescription", } def missing_price_columns(existing_columns: set[str]) -> set[str]: return PRICE_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_price_columns(baseline_column_names("DetailRecord")) else: existing_columns = { column["name"] for column in inspect(op.get_bind()).get_columns("DetailRecord") } columns_to_add = missing_price_columns(existing_columns) definitions = { "priceStartingValue": sa.Column("priceStartingValue", sa.Float(), nullable=True), "priceUnit": sa.Column("priceUnit", sa.String(), nullable=True), "pricePeopleRange": sa.Column("pricePeopleRange", sa.String(), nullable=True), "priceDescription": sa.Column("priceDescription", sa.Text(), nullable=True), } for name, column in definitions.items(): if name in columns_to_add: op.add_column("DetailRecord", column) def downgrade() -> None: if is_offline_mode(): columns_to_drop = PRICE_COLUMNS.intersection(baseline_column_names("DetailRecord")) else: columns_to_drop = { column["name"] for column in inspect(op.get_bind()).get_columns("DetailRecord") }.intersection(PRICE_COLUMNS) for name in ("priceDescription", "pricePeopleRange", "priceUnit", "priceStartingValue"): if name in columns_to_drop: op.drop_column("DetailRecord", name)