Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Update resolve_bill method #149

Merged
merged 7 commits into from
Oct 18, 2024
Merged
Show file tree
Hide file tree
Changes from 5 commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,9 @@
# Changelog

## 6.20.8 - Oct 18, 2024q

* Improve resolve bill to capture at least the most recent session

## 6.20.7 - Oct 10, 2024

* Fix matching committee organizations when chamber is specified for an organizational bill sponsor
Expand Down
32 changes: 24 additions & 8 deletions openstates/importers/base.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
import json
import logging
import typing
from datetime import datetime, timedelta
from datetime import datetime
from django.db.models import Q, Model
from django.db.models.signals import post_save
from .. import settings
Expand Down Expand Up @@ -128,6 +128,7 @@ def __init__(self, jurisdiction_id: str, do_postimport=True) -> None:
self.pseudo_id_cache: typing.Dict[str, typing.Optional[_ID]] = {}
self.person_cache: typing.Dict[_PersonCacheKey, typing.Optional[str]] = {}
self.session_cache: typing.Dict[str, LegislativeSession] = {}
self.all_sessions_cache: typing.List[LegislativeSession] = []
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Might be worth a comment here explaining the difference between these two

self.logger = logging.getLogger("openstates")
self.info = self.logger.info
self.debug = self.logger.debug
Expand All @@ -139,6 +140,12 @@ def __init__(self, jurisdiction_id: str, do_postimport=True) -> None:
if settings.IMPORT_TRANSFORMERS.get(self._type):
self.cached_transformers = settings.IMPORT_TRANSFORMERS[self._type]

def get_all_sessions(self) -> None:
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think this method should return self.all_sessions_cache (rather than ONLY load a value to that property) - that would make it consistent with get_session() which returns the requested session

if not self.all_sessions_cache:
self.all_sessions_cache = LegislativeSession.objects.filter(
jurisdiction_id=self.jurisdiction_id
).order_by("-start_date")

def get_session(self, identifier: str) -> LegislativeSession:
if identifier not in self.session_cache:
self.session_cache[identifier] = LegislativeSession.objects.get(
Expand Down Expand Up @@ -166,18 +173,27 @@ def resolve_bill(self, bill_id: str, *, date: str) -> typing.Optional[_ID]:
bill_transform_func = settings.IMPORT_TRANSFORMERS.get("bill", {}).get(
"identifier", None
)
self.get_all_sessions()
if bill_transform_func:
bill_id = bill_transform_func(bill_id)

# move the start_date up a bit in case the event is on the last day of a session to compare with end_date
date = datetime.fromisoformat(date)
new_date = date - timedelta(days=1)
# Some steps here to first find the session that matches the incoming entity using the entity date
# If a unique session is not found, then use the session with the latest "start_date"
date = datetime.fromisoformat(date).strftime("%Y-%m-%d")
session_ids = [
session.id
for session in self.all_sessions_cache
if session.start_date <= date
and (session.end_date >= date or not session.end_date)
]

if len(session_ids) == 1:
session_id = session_ids.pop()
else:
session_id = self.all_sessions_cache[0].id if self.all_sessions_cache else None

objects = Bill.objects.filter(
Q(legislative_session__end_date__gte=new_date)
| Q(legislative_session__end_date=""),
legislative_session__start_date__lte=date,
legislative_session__jurisdiction_id=self.jurisdiction_id,
legislative_session__id=session_id,
identifier=bill_id,
)
ids = {each.id for each in objects}
Expand Down
2 changes: 1 addition & 1 deletion pyproject.toml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
[tool.poetry]
name = "openstates"
version = "6.20.7"
version = "6.20.8"
description = "core infrastructure for the openstates project"
authors = ["James Turk <dev@jamesturk.net>"]
license = "MIT"
Expand Down
Loading