Self-hosted US Congress monitoring platform with AI policy briefs, bill/member/topic follows, ntfy + RSS + email notifications, alignment scoring, collections, and draft-letter generator. Authored by: Jack Levy
64 lines
2.6 KiB
Python
64 lines
2.6 KiB
Python
"""Add bill_votes and member_vote_positions tables
|
|
|
|
Revision ID: 0017
|
|
Revises: 0016
|
|
"""
|
|
from alembic import op
|
|
import sqlalchemy as sa
|
|
|
|
revision = "0017"
|
|
down_revision = "0016"
|
|
branch_labels = None
|
|
depends_on = None
|
|
|
|
|
|
def upgrade():
|
|
op.create_table(
|
|
"bill_votes",
|
|
sa.Column("id", sa.Integer, primary_key=True, autoincrement=True),
|
|
sa.Column("bill_id", sa.String, sa.ForeignKey("bills.bill_id", ondelete="CASCADE"), nullable=False),
|
|
sa.Column("congress", sa.Integer, nullable=False),
|
|
sa.Column("chamber", sa.String(50), nullable=False),
|
|
sa.Column("session", sa.Integer, nullable=False),
|
|
sa.Column("roll_number", sa.Integer, nullable=False),
|
|
sa.Column("question", sa.Text),
|
|
sa.Column("description", sa.Text),
|
|
sa.Column("vote_date", sa.Date),
|
|
sa.Column("yeas", sa.Integer),
|
|
sa.Column("nays", sa.Integer),
|
|
sa.Column("not_voting", sa.Integer),
|
|
sa.Column("result", sa.String(200)),
|
|
sa.Column("source_url", sa.String),
|
|
sa.Column("fetched_at", sa.DateTime(timezone=True)),
|
|
sa.Column("created_at", sa.DateTime(timezone=True), server_default=sa.text("now()")),
|
|
)
|
|
op.create_index("ix_bill_votes_bill_id", "bill_votes", ["bill_id"])
|
|
op.create_unique_constraint(
|
|
"uq_bill_votes_roll",
|
|
"bill_votes",
|
|
["congress", "chamber", "session", "roll_number"],
|
|
)
|
|
|
|
op.create_table(
|
|
"member_vote_positions",
|
|
sa.Column("id", sa.Integer, primary_key=True, autoincrement=True),
|
|
sa.Column("vote_id", sa.Integer, sa.ForeignKey("bill_votes.id", ondelete="CASCADE"), nullable=False),
|
|
sa.Column("bioguide_id", sa.String, sa.ForeignKey("members.bioguide_id", ondelete="SET NULL"), nullable=True),
|
|
sa.Column("member_name", sa.String(200)),
|
|
sa.Column("party", sa.String(50)),
|
|
sa.Column("state", sa.String(10)),
|
|
sa.Column("position", sa.String(50), nullable=False),
|
|
sa.Column("created_at", sa.DateTime(timezone=True), server_default=sa.text("now()")),
|
|
)
|
|
op.create_index("ix_member_vote_positions_vote_id", "member_vote_positions", ["vote_id"])
|
|
op.create_index("ix_member_vote_positions_bioguide_id", "member_vote_positions", ["bioguide_id"])
|
|
|
|
|
|
def downgrade():
|
|
op.drop_index("ix_member_vote_positions_bioguide_id", "member_vote_positions")
|
|
op.drop_index("ix_member_vote_positions_vote_id", "member_vote_positions")
|
|
op.drop_table("member_vote_positions")
|
|
op.drop_index("ix_bill_votes_bill_id", "bill_votes")
|
|
op.drop_constraint("uq_bill_votes_roll", "bill_votes")
|
|
op.drop_table("bill_votes")
|