"""Simplified operator model: master Auto-Trade + per-trade Grow. subscriptions.auto_trade : ONE persistent gate. OFF (default) = scan + ingest signals (feed only), no trades. ON = auto-open on signal. bot_trades.grow_mode : per-trade pyramiding switch (default off). Defaults are safe (false) so existing rows do NOT auto-trade / auto-pyramid until the user explicitly opts in — no behavior change on upgrade. Revision ID: 016 Revises: 015 Create Date: 2026-05-18 00:00:00.000000 """ from typing import Sequence, Union import sqlalchemy as sa from alembic import op from sqlalchemy import inspect revision: str = "016" down_revision: Union[str, None] = "015" branch_labels: Union[str, Sequence[str], None] = None depends_on: Union[str, Sequence[str], None] = None def _columns(table: str) -> set: return {c["name"] for c in inspect(op.get_bind()).get_columns(table)} def upgrade() -> None: if "auto_trade" not in _columns("subscriptions"): with op.batch_alter_table("subscriptions") as b: b.add_column(sa.Column("auto_trade", sa.Boolean(), nullable=False, server_default=sa.false())) if "grow_mode" not in _columns("bot_trades"): with op.batch_alter_table("bot_trades") as b: b.add_column(sa.Column("grow_mode", sa.Boolean(), nullable=False, server_default=sa.false())) def downgrade() -> None: if "grow_mode" in _columns("bot_trades"): with op.batch_alter_table("bot_trades") as b: b.drop_column("grow_mode") if "auto_trade" in _columns("subscriptions"): with op.batch_alter_table("subscriptions") as b: b.drop_column("auto_trade")