From e368402eea7d1fe3768cd0e009295e809ac59953 Mon Sep 17 00:00:00 2001 From: Richie Cahill Date: Sun, 29 Mar 2026 12:02:00 -0400 Subject: [PATCH] adding LegislatorSocialMedia --- ...ding_legislatorsocialmedia_5cd7eee3549d.py | 58 +++++++++++++++++++ .../orm/data_science_dev/congress/__init__.py | 3 +- .../data_science_dev/congress/legislator.py | 21 ++++++- 3 files changed, 80 insertions(+), 2 deletions(-) create mode 100644 python/alembic/data_science_dev/versions/2026_03_29-adding_legislatorsocialmedia_5cd7eee3549d.py diff --git a/python/alembic/data_science_dev/versions/2026_03_29-adding_legislatorsocialmedia_5cd7eee3549d.py b/python/alembic/data_science_dev/versions/2026_03_29-adding_legislatorsocialmedia_5cd7eee3549d.py new file mode 100644 index 0000000..f7bc5b4 --- /dev/null +++ b/python/alembic/data_science_dev/versions/2026_03_29-adding_legislatorsocialmedia_5cd7eee3549d.py @@ -0,0 +1,58 @@ +"""adding LegislatorSocialMedia. + +Revision ID: 5cd7eee3549d +Revises: 83bfc8af92d8 +Create Date: 2026-03-29 11:53:44.224799 + +""" + +from __future__ import annotations + +from typing import TYPE_CHECKING + +import sqlalchemy as sa +from alembic import op + +from python.orm import DataScienceDevBase + +if TYPE_CHECKING: + from collections.abc import Sequence + +# revision identifiers, used by Alembic. +revision: str = "5cd7eee3549d" +down_revision: str | None = "83bfc8af92d8" +branch_labels: str | Sequence[str] | None = None +depends_on: str | Sequence[str] | None = None + +schema = DataScienceDevBase.schema_name + + +def upgrade() -> None: + """Upgrade.""" + # ### commands auto generated by Alembic - please adjust! ### + op.create_table( + "legislator_social_media", + sa.Column("legislator_id", sa.Integer(), nullable=False), + sa.Column("platform", sa.String(), nullable=False), + sa.Column("account_name", sa.String(), nullable=False), + sa.Column("url", sa.String(), nullable=True), + sa.Column("source", sa.String(), nullable=False), + sa.Column("id", sa.Integer(), nullable=False), + sa.Column("created", sa.DateTime(timezone=True), server_default=sa.text("now()"), nullable=False), + sa.Column("updated", sa.DateTime(timezone=True), server_default=sa.text("now()"), nullable=False), + sa.ForeignKeyConstraint( + ["legislator_id"], + [f"{schema}.legislator.id"], + name=op.f("fk_legislator_social_media_legislator_id_legislator"), + ), + sa.PrimaryKeyConstraint("id", name=op.f("pk_legislator_social_media")), + schema=schema, + ) + # ### end Alembic commands ### + + +def downgrade() -> None: + """Downgrade.""" + # ### commands auto generated by Alembic - please adjust! ### + op.drop_table("legislator_social_media", schema=schema) + # ### end Alembic commands ### diff --git a/python/orm/data_science_dev/congress/__init__.py b/python/orm/data_science_dev/congress/__init__.py index 44cb304..b8c6e7d 100644 --- a/python/orm/data_science_dev/congress/__init__.py +++ b/python/orm/data_science_dev/congress/__init__.py @@ -1,13 +1,14 @@ """init.""" from python.orm.data_science_dev.congress.bill import Bill, BillText -from python.orm.data_science_dev.congress.legislator import Legislator +from python.orm.data_science_dev.congress.legislator import Legislator, LegislatorSocialMedia from python.orm.data_science_dev.congress.vote import Vote, VoteRecord __all__ = [ "Bill", "BillText", "Legislator", + "LegislatorSocialMedia", "Vote", "VoteRecord", ] diff --git a/python/orm/data_science_dev/congress/legislator.py b/python/orm/data_science_dev/congress/legislator.py index f750451..81a424f 100644 --- a/python/orm/data_science_dev/congress/legislator.py +++ b/python/orm/data_science_dev/congress/legislator.py @@ -5,7 +5,7 @@ from __future__ import annotations from datetime import date from typing import TYPE_CHECKING -from sqlalchemy import Text +from sqlalchemy import ForeignKey, Text from sqlalchemy.orm import Mapped, mapped_column, relationship from python.orm.data_science_dev.base import DataScienceDevTableBase @@ -40,8 +40,27 @@ class Legislator(DataScienceDevTableBase): current_district: Mapped[int | None] current_chamber: Mapped[str | None] + social_media_accounts: Mapped[list[LegislatorSocialMedia]] = relationship( + "LegislatorSocialMedia", + back_populates="legislator", + cascade="all, delete-orphan", + ) vote_records: Mapped[list[VoteRecord]] = relationship( "VoteRecord", back_populates="legislator", cascade="all, delete-orphan", ) + + +class LegislatorSocialMedia(DataScienceDevTableBase): + """Social media account linked to a legislator.""" + + __tablename__ = "legislator_social_media" + + legislator_id: Mapped[int] = mapped_column(ForeignKey("main.legislator.id")) + platform: Mapped[str] + account_name: Mapped[str] + url: Mapped[str | None] + source: Mapped[str] + + legislator: Mapped[Legislator] = relationship(back_populates="social_media_accounts")