Skip to content

Commit 4cbbcf3

Browse files
authored
Add a new method for fetching older notifications (#99)
1 parent ef4f30b commit 4cbbcf3

2 files changed

Lines changed: 62 additions & 6 deletions

File tree

edupage_api/__init__.py

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -184,6 +184,20 @@ def get_notifications(self) -> list[TimelineEvent]:
184184

185185
return TimelineEvents(self).get_notifications()
186186

187+
def get_notification_history(self, date_from: date) -> list[TimelineEvent]:
188+
"""Get a list of all available notifications since `date_from` (until now).
189+
190+
This method can be used instead of `get_notifications` if notifications older than
191+
1 month are needed.
192+
193+
Args:
194+
date_from (datetime.date): The first day of the date range
195+
196+
Returns:
197+
list[TimelineEvent]: List of all notifications since `date_from` up to now.
198+
"""
199+
return TimelineEvents(self).get_notifications_history(date_from)
200+
187201
def cloud_upload(self, fd: TextIOWrapper) -> EduCloudFile:
188202
"""Upload file to EduPage cloud.
189203

edupage_api/timeline.py

Lines changed: 48 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -3,13 +3,15 @@
33

44
import json
55
from dataclasses import dataclass
6-
from datetime import datetime
6+
from datetime import datetime, date
77
from enum import Enum
88
from typing import Optional, Union
99

1010
from edupage_api.dbi import DbiHelper
1111
from edupage_api.module import Module, ModuleHelper
1212
from edupage_api.people import EduAccount
13+
from edupage_api.utils import RequestUtil
14+
from edupage_api.exceptions import RequestError, MissingDataException
1315

1416

1517
# data.dbi.event_types
@@ -136,7 +138,9 @@ class EventType(str, Enum):
136138

137139
@staticmethod
138140
def parse(event_type_str: str) -> Optional[EventType]:
139-
return ModuleHelper.parse_enum(event_type_str, EventType)
141+
return ModuleHelper.parse_enum(
142+
event_type_str, EventType # pyright: ignore[reportArgumentType]
143+
)
140144

141145

142146
@dataclass
@@ -151,12 +155,9 @@ class TimelineEvent:
151155

152156

153157
class TimelineEvents(Module):
154-
@ModuleHelper.logged_in
155-
def get_notifications(self):
158+
def __parse_items(self, timeline_items: dict) -> list[TimelineEvent]:
156159
output = []
157160

158-
timeline_items = self.edupage.data.get("items")
159-
160161
for event in timeline_items:
161162
event_id_str = event.get("timelineid")
162163
if not event_id_str:
@@ -231,4 +232,45 @@ def get_notifications(self):
231232
additional_data,
232233
)
233234
output.append(event)
235+
234236
return output
237+
238+
@ModuleHelper.logged_in
239+
def get_notifications_history(self, date_from: date):
240+
request_url = "https://gymbilba.edupage.org/timeline/"
241+
params = [
242+
("module", "todo"),
243+
("filterTab", ""),
244+
("akcia", "getData"),
245+
("filterTab", "messages"),
246+
]
247+
248+
response = self.edupage.session.post(
249+
request_url,
250+
params=params,
251+
data=RequestUtil.encode_form_data(
252+
{
253+
"datefrom": date_from.strftime("%Y-%m-%d"),
254+
}
255+
),
256+
headers={"Content-Type": "application/x-www-form-urlencoded"},
257+
)
258+
259+
if response.status_code != 200:
260+
raise RequestError(
261+
f"Edupage returned an error: status={response.status_code}"
262+
)
263+
264+
data = response.json()
265+
if "timelineItems" not in data:
266+
raise MissingDataException(
267+
"Unexpected response from edupage! (no events in this time period?)"
268+
)
269+
270+
return self.__parse_items(data["timelineItems"])
271+
272+
@ModuleHelper.logged_in
273+
def get_notifications(self):
274+
return self.__parse_items(
275+
self.edupage.data.get("items") # pyright: ignore[reportArgumentType]
276+
)

0 commit comments

Comments
 (0)