Skip to content

Commit 675d0f9

Browse files
authored
Merge pull request #5 from RutgerRauws/feature/get-assembly
Add Assembly support and big refactoring using hooks instead of from_json functions
2 parents ce7ccd6 + 4e2a570 commit 675d0f9

23 files changed

+380
-147
lines changed

examples/get_assembly.py

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
# Add the notubiz folder to the path
2+
import sys, os
3+
sys.path.append(os.path.abspath(os.path.join(os.path.dirname(__file__), '..')))
4+
5+
from notubiz import ApiClient, Configuration
6+
from notubiz.api.clients import AssemblyClient, MeetingClient
7+
8+
configuration = Configuration(organisation_id = 686) # Gemeente Eindhoven
9+
10+
api_client = ApiClient(configuration)
11+
12+
assembly_client = AssemblyClient(api_client)
13+
meeting_client = MeetingClient(api_client)
14+
15+
assembly = assembly_client.get(1253866)
16+
17+
for assembly_meeting in assembly.meetings:
18+
meeting = meeting_client.get(assembly_meeting.id)
19+
20+
print("{} - {} ({})".format(assembly_meeting.plannings[0].start_date, meeting.title, meeting.location))

examples/get_events.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,8 +13,8 @@
1313

1414
event_client = EventsClient(api_client)
1515

16-
start_date = datetime(2019, 1, 1)
17-
end_date = datetime(2020, 3, 31, 23, 59, 59)
16+
start_date = datetime(2025, 1, 5)
17+
end_date = datetime(2025, 1, 7, 23, 59, 59)
1818

1919
events = event_client.get(start_date, end_date)
2020

notubiz/api/_converter.py

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
from cattr import Converter
2+
from datetime import datetime
3+
4+
from notubiz.api._helpers import parse_date
5+
from notubiz.api._hooks_registry import Hooks
6+
7+
def get_converter() -> Converter:
8+
converter = Converter()
9+
converter.register_structure_hook(datetime, lambda date_string, _: parse_date(date_string))
10+
11+
# Custom hooks
12+
for cls, hook in Hooks.items():
13+
converter.register_structure_hook(cls, hook)
14+
15+
return converter

notubiz/api/_hooks_registry.py

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
from notubiz.api.dataclasses import Event, event_hook
2+
from notubiz.api.dataclasses import Meeting, meeting_hook
3+
from notubiz.api.dataclasses import AgendaItem, agenda_item_hook
4+
from notubiz.api.dataclasses import Speakers, Speaker, speakers_hook, speaker_hook
5+
6+
Hooks = {
7+
Event: event_hook,
8+
Meeting: meeting_hook,
9+
AgendaItem: agenda_item_hook,
10+
Speakers: speakers_hook,
11+
Speaker: speaker_hook
12+
}

notubiz/api/clients/__init__.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
11
from notubiz.api.clients.events_client import EventsClient
22
from notubiz.api.clients.meeting_client import MeetingClient
3-
from notubiz.api.clients.speakers_client import SpeakersClient
3+
from notubiz.api.clients.speakers_client import SpeakersClient
4+
from notubiz.api.clients.assembly_client import AssemblyClient
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
from notubiz import ApiClient
2+
from notubiz.api.dataclasses.assembly import Assembly
3+
4+
from notubiz.api._converter import get_converter
5+
6+
class AssemblyClient:
7+
api_client : ApiClient
8+
9+
def __init__(self, api_client : ApiClient):
10+
self.api_client = api_client
11+
12+
def get(self, assembly_event_id : int) -> Assembly:
13+
json_object = self.api_client.get("events/assemblies/{}".format(assembly_event_id))
14+
15+
json_assembly = json_object["assembly"]
16+
17+
return get_converter().structure(json_assembly, Assembly)

notubiz/api/clients/events_client.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@
22
from notubiz.api.dataclasses import Event
33
from datetime import datetime
44

5+
from notubiz.api._converter import get_converter
6+
57
class EventsClient:
68
api_client : ApiClient
79

@@ -10,6 +12,7 @@ def __init__(self, api_client : ApiClient):
1012

1113

1214
def get(self, date_from: datetime, date_to: datetime, gremia: list[int] = None) -> list[Event]:
15+
converter = get_converter()
1316

1417
json_events : list[dict] = []
1518
has_more_pages = True
@@ -34,4 +37,4 @@ def get(self, date_from: datetime, date_to: datetime, gremia: list[int] = None)
3437
page += 1
3538

3639
# Now run the deserialization based on the merged events
37-
return [Event.from_json(json_event) for json_event in json_events]
40+
return [converter.structure(json_event, Event) for json_event in json_events]

notubiz/api/clients/meeting_client.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
from notubiz import ApiClient
22
from notubiz.api.dataclasses import Meeting
3+
from notubiz.api._converter import get_converter
34

45
class MeetingClient:
56
api_client : ApiClient
@@ -9,4 +10,5 @@ def __init__(self, api_client : ApiClient):
910

1011
def get(self, meeting_id : int) -> Meeting:
1112
json_object = self.api_client.get("events/meetings/{}".format(meeting_id))
12-
return Meeting.from_json(json_object)
13+
14+
return get_converter().structure(json_object, Meeting)

notubiz/api/clients/speakers_client.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
from notubiz.api_client import ApiClient
22
from notubiz.api.dataclasses import Speakers
3+
from notubiz.api._converter import get_converter
34

45
class SpeakersClient:
56
api_client : ApiClient
@@ -9,4 +10,4 @@ def __init__(self, api_client : ApiClient):
910

1011
def get(self) -> Speakers:
1112
json_object = self.api_client.get("speakers")
12-
return Speakers.from_json(json_object)
13+
return get_converter().structure(json_object, Speakers)
Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
1-
from notubiz.api.dataclasses.event import Event
2-
from notubiz.api.dataclasses.meeting import Meeting
1+
from notubiz.api.dataclasses.event import Event, event_hook
2+
from notubiz.api.dataclasses.meeting import Meeting, meeting_hook
3+
from notubiz.api.dataclasses.assembly import Assembly
34
from notubiz.api.dataclasses.document import Document
4-
from notubiz.api.dataclasses.agenda_item import AgendaItem
5-
from notubiz.api.dataclasses.speakers import Speaker, Speakers
5+
from notubiz.api.dataclasses.agenda_item import AgendaItem, agenda_item_hook
6+
from notubiz.api.dataclasses.speakers import Speakers, Speaker, speakers_hook, speaker_hook

0 commit comments

Comments
 (0)