Skip to content
Snippets Groups Projects
Select Git revision
  • 9cfadd69f6213c4bbe4dc2dffad5a591f4780e32
  • master default
  • v1.34.0
  • v1.33.0
  • v1.32.1
  • v1.32.0
  • v1.31.2
  • v1.31.1
  • v1.31.0
  • v1.30.0
  • v1.29.0
  • v1.28.0
  • v1.27.0
  • v1.26.0
  • v1.25.0
  • v1.24.0
  • v1.23.1
  • v1.23.0
  • v1.22.0
  • v1.20.0
  • v1.19.1
  • v1.19.0
22 results

IcsService.py

Blame
  • IcsService.py 1.86 KiB
    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 None:
                        continue
    
                    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)