fix: member sync — robust chamber parsing and district int conversion

- Handle terms as list or dict (Congress.gov API inconsistency)
- Infer 'House of Representatives' from district presence as fallback
- Convert district to int before str() to avoid leading zeros / 'None'

Authored by: Jack Levy
This commit is contained in:
Jack Levy
2026-03-15 11:09:55 -04:00
parent db0d841ef0
commit 1a8061539f

View File

@@ -165,8 +165,19 @@ def _normalize_state(state: str | None) -> str | None:
def parse_member_from_api(data: dict) -> dict:
"""Normalize raw API member list data into our model fields."""
terms = data.get("terms", {}).get("item", [])
terms_raw = data.get("terms", {})
if isinstance(terms_raw, list):
terms = terms_raw
elif isinstance(terms_raw, dict):
terms = terms_raw.get("item", [])
else:
terms = []
current_term = terms[-1] if terms else {}
chamber = current_term.get("chamber")
# Fallback: infer House from presence of a numeric district
if not chamber and data.get("district"):
chamber = "House of Representatives"
district = data.get("district")
return {
"bioguide_id": data.get("bioguideId"),
"name": data.get("name", ""),
@@ -174,8 +185,8 @@ def parse_member_from_api(data: dict) -> dict:
"last_name": data.get("lastName"),
"party": data.get("partyName") or None,
"state": _normalize_state(data.get("state")),
"chamber": current_term.get("chamber"),
"district": str(data.get("district")) if data.get("district") else None,
"chamber": chamber,
"district": str(int(district)) if district is not None else None,
"photo_url": data.get("depiction", {}).get("imageUrl"),
"official_url": data.get("officialWebsiteUrl"),
}