Skip to content

Commit 148885b

Browse files
authored
Merge pull request #4 from RutgerRauws/fix/refactor-structure
Refactor structure
2 parents b66c370 + e50665b commit 148885b

18 files changed

+163
-152
lines changed

examples/find_speaker.py

+5-5
Original file line numberDiff line numberDiff line change
@@ -2,14 +2,14 @@
22
import sys, os
33
sys.path.append(os.path.abspath(os.path.join(os.path.dirname(__file__), '..')))
44

5-
import notubiz
6-
import notubiz.api.speakers
5+
from notubiz import ApiClient, Configuration
6+
from notubiz.api.clients import SpeakersClient
77

8-
configuration = notubiz.Configuration(organisation_id = 686) # Gemeente Eindhoven
8+
configuration = Configuration(organisation_id = 686) # Gemeente Eindhoven
99

10-
api_client = notubiz.ApiClient(configuration)
10+
api_client = ApiClient(configuration)
1111

12-
speakers = notubiz.api.NotubizSpeakers(api_client).get()
12+
speakers = SpeakersClient(api_client).get()
1313

1414
speaker = speakers.find_by_person_id(194366)
1515

examples/get_events.py

+5-5
Original file line numberDiff line numberDiff line change
@@ -4,14 +4,14 @@
44

55
from datetime import datetime
66

7-
import notubiz
8-
import notubiz.api.event
7+
from notubiz import ApiClient, Configuration
8+
from notubiz.api.clients import EventsClient
99

10-
configuration = notubiz.Configuration(organisation_id = 686) # Gemeente Eindhoven
10+
configuration = Configuration(organisation_id = 686) # Gemeente Eindhoven
1111

12-
api_client = notubiz.ApiClient(configuration)
12+
api_client = ApiClient(configuration)
1313

14-
event_client = notubiz.api.event.EventApi(api_client)
14+
event_client = EventsClient(api_client)
1515

1616
start_date = datetime(2019, 1, 1)
1717
end_date = datetime(2020, 3, 31, 23, 59, 59)

examples/get_meeting.py

+5-5
Original file line numberDiff line numberDiff line change
@@ -2,14 +2,14 @@
22
import sys, os
33
sys.path.append(os.path.abspath(os.path.join(os.path.dirname(__file__), '..')))
44

5-
import notubiz
6-
import notubiz.api.meeting
5+
from notubiz import ApiClient, Configuration
6+
from notubiz.api.clients.meeting_client import MeetingClient
77

8-
configuration = notubiz.Configuration(organisation_id = 686) # Gemeente Eindhoven
8+
configuration = Configuration(organisation_id = 686) # Gemeente Eindhoven
99

10-
api_client = notubiz.ApiClient(configuration)
10+
api_client = ApiClient(configuration)
1111

12-
meeting_client = notubiz.api.NotubizMeeting(api_client)
12+
meeting_client = MeetingClient(api_client)
1313

1414
meeting = meeting_client.get(1147925)
1515

notubiz/api/__init__.py

-2
This file was deleted.

notubiz/api/clients/__init__.py

+3
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
from notubiz.api.clients.events_client import EventsClient
2+
from notubiz.api.clients.meeting_client import MeetingClient
3+
from notubiz.api.clients.speakers_client import SpeakersClient

notubiz/api/clients/events_client.py

+37
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
from notubiz import ApiClient
2+
from notubiz.api.dataclasses import Event
3+
from datetime import datetime
4+
5+
class EventsClient:
6+
api_client : ApiClient
7+
8+
def __init__(self, api_client : ApiClient):
9+
self.api_client = api_client
10+
11+
12+
def get(self, date_from: datetime, date_to: datetime, gremia: list[int] = None) -> list[Event]:
13+
14+
json_events : list[dict] = []
15+
has_more_pages = True
16+
page = 1 # Notubiz uses 1-based paging
17+
18+
# We loop over the pages until no more pages are left
19+
while has_more_pages:
20+
21+
additional_payload = {
22+
'date_from': date_from.strftime("%Y-%m-%d %H:%M:%S"),
23+
'date_to': date_to.strftime("%Y-%m-%d %H:%M:%S"),
24+
# For some reason this endpoint requires 'organisation_id' instead of 'organisation"
25+
'organisation_id': self.api_client.configuration.organisation_id,
26+
'gremia': gremia,
27+
'page': page
28+
}
29+
30+
json_events_page = self.api_client.get("events/", additional_payload)
31+
json_events.extend(json_events_page["events"])
32+
33+
has_more_pages = json_events_page["pagination"]["has_more_pages"]
34+
page += 1
35+
36+
# Now run the deserialization based on the merged events
37+
return [Event.from_json(json_event) for json_event in json_events]

notubiz/api/clients/meeting_client.py

+12
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
from notubiz import ApiClient
2+
from notubiz.api.dataclasses import Meeting
3+
4+
class MeetingClient:
5+
api_client : ApiClient
6+
7+
def __init__(self, api_client : ApiClient):
8+
self.api_client = api_client
9+
10+
def get(self, meeting_id : int) -> Meeting:
11+
json_object = self.api_client.get("events/meetings/{}".format(meeting_id))
12+
return Meeting.from_json(json_object)
+12
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
from notubiz.api_client import ApiClient
2+
from notubiz.api.dataclasses import Speakers
3+
4+
class SpeakersClient:
5+
api_client : ApiClient
6+
7+
def __init__(self, api_client : ApiClient):
8+
self.api_client = api_client
9+
10+
def get(self) -> Speakers:
11+
json_object = self.api_client.get("speakers")
12+
return Speakers.from_json(json_object)

notubiz/api/dataclasses/__init__.py

+5
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
from notubiz.api.dataclasses.event import Event
2+
from notubiz.api.dataclasses.meeting import Meeting
3+
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

notubiz/api/agenda_item.py notubiz/api/dataclasses/agenda_item.py

+15-15
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
from typing import Optional, Dict, Any
66

77
from notubiz.api._helpers import parse_date, get_attribute, get_title, get_description
8-
from notubiz.api.document import Document, NotubizDocument
8+
from notubiz.api.dataclasses.document import Document
99

1010
@define
1111
class AgendaItem:
@@ -19,6 +19,18 @@ class AgendaItem:
1919
documents: list[Document]
2020
agenda_items : list['AgendaItem'] = field(factory=list)
2121

22+
class AgendaItems:
23+
@staticmethod
24+
def from_json(json_object : any) -> list[AgendaItem]:
25+
c = cattrs.Converter()
26+
27+
c.register_structure_hook(datetime, lambda date_string, _: parse_date(date_string))
28+
c.register_structure_hook(AgendaItem, agenda_item_structure_hook)
29+
30+
agenda_items = [c.structure(item, AgendaItem) for item in json_object]
31+
32+
return agenda_items
33+
2234

2335
def get_start_date(attributes) -> datetime:
2436
try:
@@ -36,8 +48,8 @@ def agenda_item_structure_hook(data: Dict[str, Any], cls: type) -> AgendaItem:
3648
type_data = data.get("type_data", {})
3749
attributes = type_data["attributes"]
3850

39-
documents = [NotubizDocument.from_json(item) for item in data["documents"]]
40-
agenda_items = NotubizAgendaItems.from_json(data["agenda_items"])
51+
documents = [Document.from_json(item) for item in data["documents"]]
52+
agenda_items = AgendaItems.from_json(data["agenda_items"])
4153

4254
return AgendaItem(
4355
id=data["id"],
@@ -51,15 +63,3 @@ def agenda_item_structure_hook(data: Dict[str, Any], cls: type) -> AgendaItem:
5163
agenda_items = agenda_items
5264
)
5365

54-
55-
class NotubizAgendaItems:
56-
def from_json(json_object : any) -> list[AgendaItem]:
57-
c = cattrs.Converter()
58-
59-
c.register_structure_hook(datetime, lambda date_string, _: parse_date(date_string))
60-
c.register_structure_hook(AgendaItem, agenda_item_structure_hook)
61-
62-
agenda_items = [c.structure(item, AgendaItem) for item in json_object]
63-
64-
return agenda_items
65-

notubiz/api/document.py notubiz/api/dataclasses/document.py

+3-3
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
from attrs import define, field
22
import cattrs
3-
from typing import Optional, Dict, Any, List
3+
from typing import Optional, List
44
from datetime import datetime
55

66
@define
@@ -19,8 +19,8 @@ class Document:
1919
versions: List[DocumentVersion]
2020
id: Optional[int] = field(default=None) # Apparently some documents have no ID
2121

22-
class NotubizDocument:
23-
def from_json(json_object : any) -> Document:
22+
@staticmethod
23+
def from_json(json_object : any) -> 'Document':
2424
c = cattrs.Converter()
2525
c.register_structure_hook(datetime, lambda d, _: datetime.strptime(d, "%Y-%m-%d %H:%M:%S"))
2626

notubiz/api/event.py notubiz/api/dataclasses/event.py

+1-38
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
21
from attrs import define, field
32
import cattrs
43
from cattrs import transform_error
@@ -8,8 +7,6 @@
87
from datetime import datetime
98
from notubiz.api._helpers import parse_date, get_title, get_location
109

11-
from notubiz import ApiClient
12-
1310
@define
1411
class Planning:
1512
# Auto-filled
@@ -57,38 +54,4 @@ def from_json(json_object : any) -> 'Event':
5754
meeting.location = get_location(attributes)
5855
meeting.gremium_id = json_object["gremium"]["id"]
5956

60-
return meeting
61-
62-
class EventApi:
63-
api_client : ApiClient
64-
65-
def __init__(self, api_client : ApiClient):
66-
self.api_client = api_client
67-
68-
69-
def get(self, date_from: datetime, date_to: datetime, gremia: list[int] = None) -> list[Event]:
70-
71-
json_events : list[dict] = []
72-
has_more_pages = True
73-
page = 1 # Notubiz uses 1-based paging
74-
75-
# We loop over the pages until no more pages are left
76-
while has_more_pages:
77-
78-
additional_payload = {
79-
'date_from': date_from.strftime("%Y-%m-%d %H:%M:%S"),
80-
'date_to': date_to.strftime("%Y-%m-%d %H:%M:%S"),
81-
# For some reason this endpoint requires 'organisation_id' instead of 'organisation"
82-
'organisation_id': self.api_client.configuration.organisation_id,
83-
'gremia': gremia,
84-
'page': page
85-
}
86-
87-
json_events_page = self.api_client.get("events/", additional_payload)
88-
json_events.extend(json_events_page["events"])
89-
90-
has_more_pages = json_events_page["pagination"]["has_more_pages"]
91-
page += 1
92-
93-
# Now run the deserialization based on the merged events
94-
return [Event.from_json(json_event) for json_event in json_events]
57+
return meeting

notubiz/api/dataclasses/meeting.py

+39
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
from attrs import define, field
2+
import cattrs
3+
from cattrs import transform_error
4+
5+
from notubiz.api._helpers import get_title, get_location
6+
from notubiz.api.dataclasses.agenda_item import AgendaItem, AgendaItems
7+
8+
from typing import Optional, Dict, Any
9+
10+
@define
11+
class Meeting:
12+
# Auto-filled
13+
id : int
14+
url : str
15+
16+
# Manually filled
17+
title : Optional[str] = field(init=False)
18+
location : Optional[str] = field(init=False)
19+
agenda_items : list[AgendaItem] = field(init=False)
20+
21+
@staticmethod
22+
def from_json(json_object : any) -> 'Meeting':
23+
c = cattrs.Converter()
24+
25+
meeting_json = json_object.get("meeting", {})
26+
27+
try:
28+
meeting = c.structure(meeting_json, Meeting)
29+
except Exception as exc:
30+
print("\n".join(transform_error(exc)))
31+
quit()
32+
33+
attributes = meeting_json.get("attributes", [])
34+
meeting.title = get_title(attributes)
35+
meeting.location = get_location(attributes)
36+
37+
meeting.agenda_items = AgendaItems.from_json(meeting_json.get("agenda_items"))
38+
39+
return meeting

notubiz/api/speakers.py notubiz/api/dataclasses/speakers.py

+2-14
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,6 @@
22
import cattrs
33
from cattrs import transform_error
44
from cattrs.gen import make_dict_unstructure_fn, make_dict_structure_fn, override
5-
from typing import Optional
6-
7-
from notubiz.api_client import ApiClient
85

96
@define
107
class SpeakerAttributes:
@@ -48,17 +45,8 @@ def find_by_person_id(self, person_id : int):
4845

4946
return None
5047

51-
class NotubizSpeakers:
52-
api_client : ApiClient
53-
54-
def __init__(self, api_client : ApiClient):
55-
self.api_client = api_client
56-
57-
def get(self) -> Speakers:
58-
json_object = self.api_client.get("speakers")
59-
return NotubizSpeakers.from_json(json_object)
60-
61-
def from_json(json_object : any) -> Speakers:
48+
@staticmethod
49+
def from_json(json_object : any) -> 'Speakers':
6250
c = cattrs.Converter()
6351

6452
unst_hook = make_dict_unstructure_fn(Speakers, c, speakers=override(rename="speaker"))

0 commit comments

Comments
 (0)