v0.9 ticket 02. Campaigns now carry an exploration seed set (seed personas × seed goals — the comparability unit for exploratory evaluation) and an optional budget override, stored as JSON columns isomorphic to plan. Empty seeds normalize to null, marking the campaign as opted out of exploration. resolve_budget merges per-field overrides into platform defaults; enforcement stays server-side. The create form gains seed lists and budget inputs (minutes → seconds), submitting null when left empty.
30 lines
932 B
Python
30 lines
932 B
Python
"""add exploration seeds/budget config to campaigns
|
|
|
|
Revision ID: b3c7d9e1f5a2
|
|
Revises: 0e4a7c91d2b3
|
|
Create Date: 2026-08-03
|
|
"""
|
|
|
|
from typing import Sequence, Union
|
|
|
|
import sqlalchemy as sa
|
|
import sqlmodel # noqa: F401
|
|
from alembic import op
|
|
|
|
revision: str = "b3c7d9e1f5a2"
|
|
down_revision: Union[str, Sequence[str], None] = "0e4a7c91d2b3"
|
|
branch_labels: Union[str, Sequence[str], None] = None
|
|
depends_on: Union[str, Sequence[str], None] = None
|
|
|
|
|
|
def upgrade() -> None:
|
|
with op.batch_alter_table("campaigns") as batch_op:
|
|
batch_op.add_column(sa.Column("exploration_seeds", sqlmodel.sql.sqltypes.AutoString(), nullable=True))
|
|
batch_op.add_column(sa.Column("exploration_budget", sqlmodel.sql.sqltypes.AutoString(), nullable=True))
|
|
|
|
|
|
def downgrade() -> None:
|
|
with op.batch_alter_table("campaigns") as batch_op:
|
|
batch_op.drop_column("exploration_budget")
|
|
batch_op.drop_column("exploration_seeds")
|