diff --git a/fetchDUALIS.py b/fetchDUALIS.py index cfe7fbe..0d5a192 100644 --- a/fetchDUALIS.py +++ b/fetchDUALIS.py @@ -4,6 +4,8 @@ import time from bs4 import BeautifulSoup from flask import redirect, url_for from init import Dualis +import asyncio +import httpx headers = { 'Cookie': 'cnsc=0', @@ -16,28 +18,29 @@ headers = { url = "https://dualis.dhbw.de/scripts/mgrqispi.dll" -def checkUser(email: str, password: str): +async def checkUser(email: str, password: str): """ Erhält von Dualis den Token und Cookie für User. :param email: :param password: :return (Token, Session): """ - s = requests.Session() - fpw = urllib.parse.quote(password, safe='', encoding=None, errors=None) - fmail = urllib.parse.quote(email, safe='', encoding=None, errors=None) - payload = 'usrname=' + fmail + '&pass=' + fpw + ('&ARGUMENTS=clino%2Cusrname%2Cpass%2Cmenuno%2Cmenu_type%2Cbrowser' - '%2Cplatform&APPNAME=CampusNet&PRGNAME=LOGINCHECK') - response = s.post(url, headers=headers, data=payload) - header = response.headers - try: - refresh = header["REFRESH"] - arg = refresh.find("=-N") + 3 - komma = refresh[arg:].find(",") - except KeyError: - return -2, s - token = refresh[arg:komma + arg] - return token, s + async with httpx.AsyncClient() as s: + fpw = urllib.parse.quote(password, safe='', encoding=None, errors=None) + fmail = urllib.parse.quote(email, safe='', encoding=None, errors=None) + content = (f'usrname={fmail}&pass={fpw}&ARGUMENTS=clino%2Cusrname%2Cpass%2Cmenuno%2Cmenu_type%2Cbrowser' + f'%2Cplatform&APPNAME=CampusNet&PRGNAME=LOGINCHECK') + response = await s.post(url=url, headers=headers, content=content) + header = response.headers + try: + refresh = header["REFRESH"] + arg = refresh.find("=-N") + 3 + komma = refresh[arg:].find(",") + cookie = s.cookies.get("cnsc") + except KeyError: + return -2, s + token = refresh[arg:komma + arg] + return token, cookie def getKurs(token: int, cookie: str): diff --git a/fetchMENSA.py b/fetchMENSA.py index 0e2fa6c..3fc967d 100644 --- a/fetchMENSA.py +++ b/fetchMENSA.py @@ -1,5 +1,5 @@ import json -from init import db, Meals, scheduler +from init import db, Meals#, scheduler import datetime import requests import time @@ -110,29 +110,29 @@ def formatDay(day: datetime): return day -@scheduler.task('cron', id="refreshMeals", hour='8-11', day_of_week='*', minute='15', week='*', second='30') +#@scheduler.task('cron', id="refreshMeals", hour='8-11', day_of_week='*', minute='15', week='*', second='30') def refreshMeals(): """ Aktualisiert immer vormittags alle Mahlzeiten in der Datenbank. \n Datenbankeinträge werden ersetzt, wenn die API andere Mahlzeiten liefert. """ 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: - for n in dbnames: - db.session.delete(Meals.query.filter_by(date=i, name=n).first()) - db.session.commit() - getMealsFromAPI(i, True) + #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: + # 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/fetchRAPLA.py b/fetchRAPLA.py index ead790f..57cf7e3 100644 --- a/fetchRAPLA.py +++ b/fetchRAPLA.py @@ -3,7 +3,7 @@ from urllib.request import urlretrieve import icalendar import json import recurring_ical_events -from init import scheduler +#from init import scheduler def parseURL(url: str): @@ -93,7 +93,7 @@ def getRaplas(): return sorted(kursl), sorted(filel), sorted(urll) -@scheduler.task("interval", id="refreshRapla", minutes=5) +#@scheduler.task("interval", id="refreshRapla", minutes=5) def refreshRapla(): """ Aktualisiert alle 5 Minuten alle gespeicherten Raplas. diff --git a/init.py b/init.py index 9d67306..2ef4837 100644 --- a/init.py +++ b/init.py @@ -4,7 +4,7 @@ from flask_sqlalchemy import SQLAlchemy from flask_talisman import Talisman from get_mysql import get_mysql import atexit -from flask_apscheduler import APScheduler +#from flask_apscheduler import APScheduler def create(): @@ -25,7 +25,7 @@ def create(): login_manager.login_view = "login" # Shut down the scheduler when exiting the app - atexit.register(lambda: scheduler.shutdown()) + #atexit.register(lambda: scheduler.shutdown()) @login_manager.user_loader def load_user(uid: int): @@ -69,11 +69,11 @@ class Meals(db.Model): schwein = db.Column(db.Boolean) -scheduler = APScheduler() +#scheduler = APScheduler() app = create() def_src = ["*.paulmartin.cloud", '\'self\''] Talisman(app, content_security_policy={"default-src": def_src, "script-src": def_src # + ["'unsafe-inline'"] }) -scheduler.init_app(app) -scheduler.start() -scheduler.api_enabled = True +#scheduler.init_app(app) +#scheduler.start() +#scheduler.api_enabled = True diff --git a/requirements.txt b/requirements.txt index 289d27b..6cde40d 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,13 +1,16 @@ -beautifulsoup4 -Flask +beautifulsoup4~=4.12.2 +Flask~=3.0.3 Flask_APScheduler Flask_Login flask_sqlalchemy -icalendar +icalendar~=5.0.11 recurring_ical_events -Requests +Requests~=2.31.0 talisman -Werkzeug +Werkzeug~=3.0.0 lxml -bs4 -pytz +bs4~=0.0.1 +pytz~=2023.3.post1 + +asyncio~=3.4.3 +httpx~=1.0.0b0 \ No newline at end of file diff --git a/routing.py b/routing.py index 4cde145..6a31036 100644 --- a/routing.py +++ b/routing.py @@ -49,7 +49,7 @@ def welcome(): return render_template('dashboard.html', kurs=kurs, name=name, theorie=t, praxis=p) -@app.route("/theorie/noten") +@app.route("/theorie/noten", methods=["GET", "POST"]) @login_required def displayNoten(): """ @@ -57,6 +57,9 @@ def displayNoten(): :return HTML: """ d = Dualis.query.filter_by(uid=current_user.id).first() + if request.method == "POST": + d.result_list = request.form.get("sem") + db.session.commit() if not d.result_list: return redirect(url_for("getSemester", next=url_for(request.endpoint))) t = d.token @@ -65,8 +68,7 @@ def displayNoten(): timeout = fetchDUALIS.timeOut(d, c, "displayNoten") if timeout: return timeout - res = fetchDUALIS.getResults(t, c, sem) - return render_template("noten.html", noten=res, semester=fetchDUALIS.getSem(t, c), sel=sem, s="n", praxis="hidden") + return render_template("noten.html", noten=fetchDUALIS.getResults(t, c, sem), semester=fetchDUALIS.getSem(t, c), sel=sem, s="n", praxis="hidden") @app.route("/plan", methods=["GET"]) @@ -242,7 +244,7 @@ def login(): @app.route("/log-in", methods=["POST"]) -def login_post(): +async def login_post(): """ Verarbeitet die Eingabe von login(). \n Falls der User schon angelegt ist, wird das Passwort verglichen. \n @@ -258,13 +260,13 @@ def login_post(): success = make_response(redirect(url_for("getKurs"))) user = User.query.filter_by(email=email).first() - t = fetchDUALIS.checkUser(email, password) + t = await fetchDUALIS.checkUser(email, password) if t[0] == -2: return redirect(url_for("login", code=-2)) if user: dualis = Dualis.query.filter_by(uid=user.id).first() dualis.token = t[0] - newcookie = requesthelpers.getCookie(t[1].cookies) + newcookie = t[1] dualis.token_created = time.time() db.session.commit() login_user(user) diff --git a/templates/noten.html b/templates/noten.html index bc67c81..6ec0d77 100644 --- a/templates/noten.html +++ b/templates/noten.html @@ -27,7 +27,7 @@ {% endfor %}

-