diff --git a/app.py b/app.py index 5337e79..a9bfa0e 100644 --- a/app.py +++ b/app.py @@ -96,8 +96,9 @@ def getRapla(): return redirect(url_for("error", ecode=file + 900)) return redirect(url_for("welcome")) -@login_required + @app.route("/backendpoc/plan", methods=["GET"]) +@login_required def displayRapla(): week = request.args.get("week") if week: @@ -215,5 +216,10 @@ def logout(): return red +@app.errorhandler(AttributeError) +def handle_anon(e): + return redirect(url_for("login"), code=e) + + if __name__ == "__main__": app.run(host='0.0.0.0', port=2024, debug=True) diff --git a/calendar_generation.py b/calendar_generation.py index faab5d9..838ecf9 100644 --- a/calendar_generation.py +++ b/calendar_generation.py @@ -1,11 +1,7 @@ -import time import icalendar import datetime -import requests import recurring_ical_events -import json -from init import app, db, Meals - +from fetchMENSA import getMeals def getWeek(weekstart: datetime, file: str, showsat: bool): @@ -69,50 +65,3 @@ def daylist(weekstart: datetime, showsat: bool): return dayl -def getMeals(day: datetime): - print (day) - if day.day < 10: - tag = "0" + str(day.day) - else: - tag = str(day.day) - day = str(day.year) + "-" + str(day.month) + "-" + tag - essen = [] - query = Meals.query.filter_by(date=day).all() - - if len(query) != 0: - for i in query: - essen += [i.name] - return essen - - url = "https://dh-api.paulmartin.cloud/plans/" + day + "?canteens=erzberger" - response = requests.request("GET", url) - response = response.content - jres = json.loads(response.decode("utf-8")) - - try: - num = len(jres["data"][0]["lines"]) - for i in range(num): - try: - jsmeal = jres["data"][0]["lines"][i]["meals"][0] - except IndexError: - return ["Essen nicht (mehr) verfügbar"] - name = jsmeal["name"] - vegan = jsmeal["classifiers"].count("VG") == 1 - schwein = jsmeal["classifiers"].count("S") == 1 - if vegan: - veget = True - else: - veget = jsmeal["classifiers"].count("VEG") == 1 - if veget: - if name.count("Reibekäse") > 0: - vegan = True - - if name != "Tagesdessert": - essen += [name] - mid = int(time.time()*1000) % 100000 - neu = Meals(date=day, name=name, id=mid, vegan=vegan, vegetarian=veget, schwein=schwein) - db.session.add(neu) - db.session.commit() - except KeyError: - essen = ["Essen nicht (mehr) verfügbar"] - return essen diff --git a/fetchMENSA.py b/fetchMENSA.py new file mode 100644 index 0000000..e06b44c --- /dev/null +++ b/fetchMENSA.py @@ -0,0 +1,107 @@ +import json +from init import db, Meals, scheduler +import datetime +import requests +import hashlib +import time + +nomeal = 'Essen nicht (mehr) verfügbar' + + +def getMeals(day: datetime): + day = formatDay(day) + essen = [] + query = Meals.query.filter_by(date=day).all() + if len(query) != 0: + for i in query: + essen += [i.name] + essen.sort(key=len, reverse=True) + return essen + return getMealsFromAPI(day, dbentry=True) + + +def getMealsFromAPI(day: str, dbentry: bool = False): + url = "https://dh-api.paulmartin.cloud/plans/" + day + "?canteens=erzberger" + response = requests.request("GET", url) + response = response.content + jres = json.loads(response.decode("utf-8")) + essen = [] + + try: + num = len(jres["data"][0]["lines"]) + for i in range(num): + try: + jsmeal = jres["data"][0]["lines"][i]["meals"] + cont = True + except IndexError: + essen = [] + cont = False + if cont: + for e in range(len(jsmeal)): + ji = jsmeal[e] + name = ji["name"] + if pricetofloat(ji["price"]) >= 1.1: + vegan = ji["classifiers"].count("VG") == 1 + schwein = ji["classifiers"].count("S") == 1 + if vegan: + veget = True + else: + veget = ji["classifiers"].count("VEG") == 1 + if veget: + if name.count("Reibekäse") > 0: + vegan = True + + essen += [name] + if dbentry: + mid = int(hashlib.sha1((day + name).encode("utf-8")).hexdigest(), 16) % (8 ** 8) + neu = Meals(date=day, name=name, id=mid, vegan=vegan, vegetarian=veget, schwein=schwein) + db.session.add(neu) + db.session.commit() + if not essen: + essen = [nomeal] + except KeyError: + essen = [nomeal] + return essen + + +def pricetofloat(price: str): + price = price[:-2] + price = price.replace(",", ".") + try: + return float(price) + except ValueError: + return 0 + + +def formatDay(day: datetime): + if day.day < 10: + tag = "0" + str(day.day) + else: + tag = str(day.day) + day = str(day.year) + "-" + str(day.month) + "-" + tag + return day + + +@scheduler.task('cron', id="refreshMeals", hour='*', day_of_week='*', minute='1-59', week='*', second='30') +def refreshMeals(): + print("Aktualisiere Essenspläne...\n") + with scheduler.app.app_context(): + table = Meals.query.all() + dates = [] + for i in table: + if i.date not in dates: + dates += [i.date] + for i in range(len(dates)): + dates[i] = formatDay(dates[i]) + for i in dates: + apinames = getMealsFromAPI(i) + dbmeals = Meals.query.filter_by(date=i).all() + dbnames = [] + for m in dbmeals: + dbnames += [m.name] + if set (dbnames) != set(apinames) and nomeal not in apinames: + print (dbnames, apinames) + for n in dbnames: + db.session.delete(Meals.query.filter_by(date=i, name=n).first()) + db.session.commit() + getMealsFromAPI(i, True) diff --git a/parseICAL.py b/parseICAL.py deleted file mode 100644 index fc1e48b..0000000 --- a/parseICAL.py +++ /dev/null @@ -1,86 +0,0 @@ -import icalendar -import datetime -import requests -import recurring_ical_events -import json - - -def getWeek(weekstart: datetime, file: str, showsat: bool): - if weekstart == "today": - start_date = datetime.date.today() - else: - start_date = weekstart - start_date -= datetime.timedelta(days=start_date.weekday() % 7) - end_date = start_date + datetime.timedelta(days=7) - 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 - formstart = str(estart.hour) + ":" + str(estart.minute) - eend = event["DTEND"].dt - 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] - 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 - } - eventl += [eventdict] - return eventl, daylist(start_date, showsat) - - -shortnames = ["mon", "tue", "wed", "thu", "fri", "sat"] -longnames = ["Montag", "Dienstag", "Mittwoch", "Donnerstag", "Freitag", "Samstag"] - - -def daylist(weekstart: datetime, showsat: bool): - weekday = weekstart - dayl = [] - if showsat: - r = 6 - else: - r = 5 - for i in range(r): - essen = getMeals(weekday) - dayl += [{ - "day": weekday.day, - "short": shortnames[i], - "long": longnames[i], - "mensa": essen - }] - weekday += datetime.timedelta(days=1) - return dayl - - -def getMeals(day: datetime): - if day.day < 10: - tag = "0" + str(day.day) - else: - tag = str(day.day) - day = str(day.year) + "-" + str(day.month) + "-" + tag - url = "https://dh-api.paulmartin.cloud/plans/" + day + "?canteens=erzberger" - response = requests.request("GET", url) - response = response.content - jres = json.loads(response.decode("utf-8")) - essen = [] - try: - num = len(jres["data"][0]["lines"]) - for i in range(num): - essen += [jres["data"][0]["lines"][i]["meals"][0]["name"]] - except KeyError: - essen = ["Tag nicht (mehr) verfügbar"] - return essen