Skip to content
Snippets Groups Projects
IcsService.py 1.84 KiB
Newer Older
  • Learn to ignore specific revisions
  • 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:
    
            print(x.summary, x.start)