from server import db from database.models import Calendar as dbCalendar from backend import Event as bEvent from ics import Calendar as iCalendar import requests def icalToCalendarDb(url, name, user): try: c = iCalendar(requests.get(url).text) except: return False c = dbCalendar(calendar_id = url, calendar_type = 'ical', name = name, toggle = "False", color = "#000000") db.session.add(c) user.calendars.append(c) db.session.commit() def fetchCalendarEvents(calendars, startDate, endDate): all_events = [] for calendar in calendars: if calendar.toggle == "True" and calendar.calendar_type == "ical": ical = iCalendar(requests.get(calendar.calendar_id).text) for event in ical.events: event = fitEventToCalendarTimezone(event, ical) name = event.name start = event.begin.format() end = event.end.format() newEvent = bEvent(name, start, end) if eventWithinStartEnd(startDate, endDate, event): if not eventAllDay(event): print(start, flush=True) all_events.append(newEvent) return all_events def fitEventToCalendarTimezone(event, calendar): event.begin = event.begin.to(next(iter(calendar._timezones))) event.end = event.end.to(next(iter(calendar._timezones))) return event # converts everything to epoch seconds and utc # and then checks if at either event start or event end # is is within startDate and endDate def eventWithinStartEnd(startDate, endDate, event): if((startDate.timestamp() <= event.begin.timestamp and event.begin.timestamp <= endDate.timestamp()) or startDate.timestamp() <= event.end.timestamp and event.end.timestamp <= endDate.timestamp()): return True return False def eventAllDay(event): beginDay = event.begin.replace(hour=0, minute=0, second=0) endDay = event.end.replace(hour=0, minute=0, second=0) delta = endDay - beginDay if delta.days >= 2: return True return False