diff --git a/python/data_science/ingest_congress.py b/python/data_science/ingest_congress.py index 1182423..b7e7868 100644 --- a/python/data_science/ingest_congress.py +++ b/python/data_science/ingest_congress.py @@ -180,10 +180,7 @@ def _split_name(display_name: str) -> tuple[str, str]: def ingest_bills(engine: Engine, congress_dirs: list[Path]) -> None: """Load bill data.json files.""" with Session(engine) as session: - existing_bills = { - (row.congress, row.bill_type, row.number) - for row in session.execute(select(Bill.congress, Bill.bill_type, Bill.number)).all() - } + existing_bills = {(bill.congress, bill.bill_type, bill.number) for bill in session.scalars(select(Bill)).all()} logger.info("Found %d existing bills in DB", len(existing_bills)) total_inserted = 0 @@ -251,8 +248,7 @@ def ingest_votes(engine: Engine, congress_dirs: list[Path]) -> None: bill_map = _build_bill_map(session) logger.info("Loaded %d bills into lookup map", len(bill_map)) existing_votes = { - (row.congress, row.chamber, row.session, row.number) - for row in session.execute(select(Vote.congress, Vote.chamber, Vote.session, Vote.number)).all() + (vote.congress, vote.chamber, vote.session, vote.number) for vote in session.scalars(select(Vote)).all() } logger.info("Found %d existing votes in DB", len(existing_votes)) @@ -279,15 +275,12 @@ def ingest_votes(engine: Engine, congress_dirs: list[Path]) -> None: def _build_legislator_map(session: Session) -> dict[str, int]: """Build a mapping of bioguide_id -> legislator.id.""" - return {row.bioguide_id: row.id for row in session.execute(select(Legislator.bioguide_id, Legislator.id)).all()} + return {legislator.bioguide_id: legislator.id for legislator in session.scalars(select(Legislator)).all()} def _build_bill_map(session: Session) -> dict[tuple[int, str, int], int]: """Build a mapping of (congress, bill_type, number) -> bill.id.""" - return { - (row.congress, row.bill_type, row.number): row.id - for row in session.execute(select(Bill.congress, Bill.bill_type, Bill.number, Bill.id)).all() - } + return {(bill.congress, bill.bill_type, bill.number): bill.id for bill in session.scalars(select(Bill)).all()} def _parse_vote( @@ -406,8 +399,7 @@ def ingest_bill_text(engine: Engine, congress_dirs: list[Path]) -> None: bill_map = _build_bill_map(session) logger.info("Loaded %d bills into lookup map", len(bill_map)) existing_bill_texts = { - (row.bill_id, row.version_code) - for row in session.execute(select(BillText.bill_id, BillText.version_code)).all() + (bill_text.bill_id, bill_text.version_code) for bill_text in session.scalars(select(BillText)).all() } logger.info("Found %d existing bill text versions in DB", len(existing_bill_texts)) diff --git a/python/signal_bot/device_registry.py b/python/signal_bot/device_registry.py index d4dd299..8221063 100644 --- a/python/signal_bot/device_registry.py +++ b/python/signal_bot/device_registry.py @@ -63,9 +63,9 @@ class DeviceRegistry: return with Session(self.engine) as session: - device = session.execute( + device = session.scalars( select(SignalDevice).where(SignalDevice.phone_number == phone_number) - ).scalar_one_or_none() + ).one_or_none() if device: if device.safety_number != safety_number and device.trust_level != TrustLevel.BLOCKED: @@ -99,9 +99,9 @@ class DeviceRegistry: Returns True if the device was found and verified. """ with Session(self.engine) as session: - device = session.execute( + device = session.scalars( select(SignalDevice).where(SignalDevice.phone_number == phone_number) - ).scalar_one_or_none() + ).one_or_none() if not device: logger.warning(f"Cannot verify unknown device: {phone_number}") @@ -139,9 +139,9 @@ class DeviceRegistry: def grant_role(self, phone_number: str, role: Role) -> bool: """Add a role to a device. Called by admin over SSH.""" with Session(self.engine) as session: - device = session.execute( + device = session.scalars( select(SignalDevice).where(SignalDevice.phone_number == phone_number) - ).scalar_one_or_none() + ).one_or_none() if not device: logger.warning(f"Cannot grant role for unknown device: {phone_number}") @@ -150,7 +150,7 @@ class DeviceRegistry: if any(record.name == role for record in device.roles): return True - role_record = session.execute(select(RoleRecord).where(RoleRecord.name == role)).scalar_one_or_none() + role_record = session.scalars(select(RoleRecord).where(RoleRecord.name == role)).one_or_none() if not role_record: logger.warning(f"Unknown role: {role}") @@ -165,9 +165,9 @@ class DeviceRegistry: def revoke_role(self, phone_number: str, role: Role) -> bool: """Remove a role from a device. Called by admin over SSH.""" with Session(self.engine) as session: - device = session.execute( + device = session.scalars( select(SignalDevice).where(SignalDevice.phone_number == phone_number) - ).scalar_one_or_none() + ).one_or_none() if not device: logger.warning(f"Cannot revoke role for unknown device: {phone_number}") @@ -182,16 +182,16 @@ class DeviceRegistry: def set_roles(self, phone_number: str, roles: list[Role]) -> bool: """Replace all roles for a device. Called by admin over SSH.""" with Session(self.engine) as session: - device = session.execute( + device = session.scalars( select(SignalDevice).where(SignalDevice.phone_number == phone_number) - ).scalar_one_or_none() + ).one_or_none() if not device: logger.warning(f"Cannot set roles for unknown device: {phone_number}") return False role_names = [str(role) for role in roles] - records = list(session.execute(select(RoleRecord).where(RoleRecord.name.in_(role_names))).scalars().all()) + records = session.scalars(select(RoleRecord).where(RoleRecord.name.in_(role_names))).all() device.roles = records session.commit() self._update_cache(phone_number, device) @@ -203,7 +203,7 @@ class DeviceRegistry: def list_devices(self) -> list[SignalDevice]: """Return all known devices.""" with Session(self.engine) as session: - return list(session.execute(select(SignalDevice)).scalars().all()) + return list(session.scalars(select(SignalDevice)).all()) def sync_identities(self) -> None: """Pull identity list from signal-cli and record any new ones.""" @@ -226,9 +226,7 @@ class DeviceRegistry: def _load_device(self, phone_number: str) -> SignalDevice | None: """Fetch a device by phone number (with joined roles).""" with Session(self.engine) as session: - return session.execute( - select(SignalDevice).where(SignalDevice.phone_number == phone_number) - ).scalar_one_or_none() + return session.scalars(select(SignalDevice).where(SignalDevice.phone_number == phone_number)).one_or_none() def _update_cache(self, phone_number: str, device: SignalDevice) -> None: """Refresh the cache entry for a device.""" @@ -244,9 +242,9 @@ class DeviceRegistry: def _set_trust(self, phone_number: str, level: str, log_msg: str | None = None) -> bool: """Update the trust level for a device.""" with Session(self.engine) as session: - device = session.execute( + device = session.scalars( select(SignalDevice).where(SignalDevice.phone_number == phone_number) - ).scalar_one_or_none() + ).one_or_none() if not device: return False @@ -269,7 +267,7 @@ def sync_roles(engine: Engine) -> None: expected = {role.value for role in Role} with Session(engine) as session: - existing = {record.name for record in session.execute(select(RoleRecord)).scalars().all()} + existing = set(session.scalars(select(RoleRecord.name)).all()) to_add = expected - existing to_remove = existing - expected