from operator import attrgetter import arrow from ics import Calendar EVENT_KEYS = ("begin", "end", "all_day", "name", "description", "location") def parse_ical(source): """Parses iCalendar source and returns events as list of dicts""" cal = Calendar(source) events = [] for event in sorted(cal.events, key=attrgetter("begin"), reverse=True): events.append({key: getattr(event, key) for key in EVENT_KEYS}) return events def split_events(events): """Splits events and returns list of past events and future events""" now = arrow.utcnow() past = [ev for ev in events if ev["begin"] < now] future = [ev for ev in events if ev["begin"] > now] return past, future