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 %}
-