Newer
Older
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
from dataclasses import dataclass
from datetime import datetime
from icalendar import Calendar
from typing import Dict
from TheCodeLabs_BaseUtils.MultiCacheKeyService import MultiCacheKeyService
@dataclass
class CalendarEvent:
summary: str = ''
uid: str = ''
description: str = ''
location: str = ''
start: datetime = ''
end: datetime = ''
class IcsService(MultiCacheKeyService):
"""
Fetches information from a given ics calendar file.
"""
EXAMPLE_SETTINGS = {
"path": "path/to/my/calendar.ics"
}
def _fetch_data(self, settings: Dict) -> Dict:
events = []
with open(settings['path'], 'rb') as f:
calendar = Calendar.from_ical(f.read())
for component in calendar.walk():
event = CalendarEvent('event')
if component.get('SUMMARY') is None:
continue
event.summary = component.get('SUMMARY')
event.uid = component.get('UID')
if component.get('DESCRIPTION') is not None:
event.description = component.get('DESCRIPTION')
event.location = component.get('LOCATION')
if hasattr(component.get('dtstart'), 'dt'):
event.start = component.get('dtstart').dt
if hasattr(component.get('dtend'), 'dt'):
event.end = component.get('dtend').dt
event.url = component.get('URL')
events.append(event)
events = sorted(events, key=lambda event: event.start)
return {'events': events}
if __name__ == '__main__':
s = IcsService()
events = s.get_data('0815', 5, {'path': '../../../../abfallkalender_2021_richard-wagner-str.ics'})['events']
for x in events:
# if 'Papier' in x.summary: