import time import asyncio import icalendar import datetime import recurring_ical_events from fetchMENSA import getMeals import pytz shortnames = ["mon", "tue", "wed", "thu", "fri", "sat"] longnames = ["Montag", "Dienstag", "Mittwoch", "Donnerstag", "Freitag", "Samstag"] months = ["Januar", "Februar", "März", "April", "Mai", "Juni", "Juli", "August", "September", "Oktober", "November", "Dezember"] async def getWeek(weekstart: datetime, file: str, showsat: bool): """ Liefert alle Events einer Woche zurück. \n Wochenstart wird automatisch auf den Montag der Woche gelegt. \n :param weekstart: :param file: :param showsat: :return: """ if weekstart == "today": start_date = datetime.date.today() else: start_date = weekstart nextw = start_date + datetime.timedelta(weeks=1) prevw = start_date - datetime.timedelta(weeks=1) start_date -= datetime.timedelta(days=start_date.weekday() % 7) end_date = start_date + datetime.timedelta(days=6) mon = months[start_date.month - 1] if start_date.month != end_date.month: if start_date.year != end_date.year: mon += " " + str(start_date.year) + " | " + months[end_date.month - 1] else: mon += " | " + months[end_date.month-1] mon += " " + str(end_date.year) with open("calendars/" + file) as f: calendar = icalendar.Calendar.from_ical(f.read()) events = recurring_ical_events.of(calendar).between(start_date, end_date) eventl = [] for event in events: estart = event["DTSTART"].dt if str(estart.tzinfo) != "Europe/Berlin": estart = estart.astimezone(pytz.timezone("Europe/Berlin")) formstart = str(estart.hour) + ":" + str(estart.minute) eend = event["DTEND"].dt if str(eend.tzinfo) != "Europe/Berlin": eend = eend.astimezone(pytz.timezone("Europe/Berlin")) formend = str(eend.hour) + ":" + str(eend.minute) forml = [formstart, formend] for i in range(2): if len(forml[i]) != 5: if forml[i][-2] == ":": forml[i] = forml[i] + "0" if forml[i][1] == ":": forml[i] = "0" + forml[i] formstart = forml[0] formend = forml[1] try: if type(event["ATTENDEE"]) is not list: teacher = [event["ATTENDEE"].params["CN"]] else: teacher = [i.params["CN"] for i in event["ATTENDEE"]] except KeyError: teacher = "" eventdict = { "start": formstart, "end": formend, "dur": str(event["DTEND"].dt - event["DTSTART"].dt)[:-3], "name": event["SUMMARY"], "room": event["LOCATION"], "weekday": estart.weekday(), "day": estart.day, "teacher": teacher, } eventl += [eventdict] return eventl, await daylist(start_date, showsat), prevw, nextw, mon async def daylist(weekstart: datetime, showsat: bool): """ Gibt die Essen einer Woche zurück. :param weekstart: :param showsat: :return: """ weekday = weekstart dayl = [] if showsat: r = 6 else: r = 5 essen = [] for i in range(r): essen += [getMeals(weekday)] dayl += [{ "day": weekday.day, "short": shortnames[i], "long": longnames[i], "mensa": i }] weekday += datetime.timedelta(days=1) essenl = await asyncio.gather(*essen, return_exceptions=True) for day in range(r): dayl[day]["mensa"] = essenl[day] return dayl