calendar.ical.get_upcoming_events should fail hard if there was any exception/unsuccessful response

The error should not be swallowed and it should be instead propagated up
to calendar.get_upcoming_events, if it's called from that context. And
calendar.get_upcoming_events should be in charge of handling the
exceptions and make sure that failing to retrieve the events for one
calendar doesn't make the whole method fail.
This commit is contained in:
Fabio Manganiello 2021-03-05 11:16:14 +01:00
parent 4ada1c663d
commit 47ba13d985
2 changed files with 22 additions and 31 deletions

View File

@ -110,8 +110,11 @@ class CalendarPlugin(Plugin, CalendarInterface):
events = []
for calendar in self.calendars:
cal_events = calendar.get_upcoming_events().output or []
events.extend(cal_events)
try:
cal_events = calendar.get_upcoming_events().output or []
events.extend(cal_events)
except Exception as e:
self.logger.warning('Could not retrieve events: {}'.format(str(e)))
events = sorted(events, key=lambda event:
dateutil.parser.parse(

View File

@ -69,38 +69,26 @@ class CalendarIcalPlugin(Plugin, CalendarInterface):
from icalendar import Calendar
events = []
try:
response = requests.get(self.url)
except Exception as e:
self.logger.exception(e)
return events
response = requests.get(self.url)
assert response.ok, \
"HTTP error while getting events from {}: {}".format(self.url, response.text)
if response.ok:
calendar = None
calendar = Calendar.from_ical(response.text)
for event in calendar.walk():
if event.name != 'VEVENT':
continue # Not an event
try:
calendar = Calendar.from_ical(response.text)
except Exception as e:
self.logger.exception(e)
return events
event = self._translate_event(event)
for event in calendar.walk():
if event.name != 'VEVENT':
continue # Not an event
event = self._translate_event(event)
if event['status'] and event['responseStatus'] \
and dateutil.parser.parse(event['end']['dateTime']) >= \
datetime.datetime.now(pytz.timezone('UTC')) \
and (
(only_participating
and event['status'] == 'confirmed'
and event['responseStatus'] in ['accepted', 'tentative'])
or not only_participating):
events.append(event)
else:
self.logger.error("HTTP error while getting {}: {}".format(self.url, response))
if event['status'] and event['responseStatus'] \
and dateutil.parser.parse(event['end']['dateTime']) >= \
datetime.datetime.now(pytz.timezone('UTC')) \
and (
(only_participating
and event['status'] == 'confirmed'
and event['responseStatus'] in ['accepted', 'tentative'])
or not only_participating):
events.append(event)
return events