diff --git a/.gitignore b/.gitignore
index 4579e6f..fdaf744 100644
--- a/.gitignore
+++ b/.gitignore
@@ -3,5 +3,4 @@ ENV/
set/
VIRTUAL_ENV/
calendars/
-.idea/
-calendars/list.json
+.idea/
\ No newline at end of file
diff --git a/calendar_generation.py b/calendar_generation.py
index 38c6cad..c2efdf2 100644
--- a/calendar_generation.py
+++ b/calendar_generation.py
@@ -40,8 +40,10 @@ async def getWeek(weekstart: datetime, file: str, showsat: bool):
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":
@@ -60,6 +62,10 @@ async def getWeek(weekstart: datetime, file: str, showsat: bool):
forml[i] = "0" + forml[i]
formstart = forml[0]
formend = forml[1]
+ try:
+ teacher = event["ATTENDEE"].params["CN"]
+ except KeyError:
+ teacher = ""
eventdict = {
"start": formstart,
"end": formend,
@@ -67,7 +73,8 @@ async def getWeek(weekstart: datetime, file: str, showsat: bool):
"name": event["SUMMARY"],
"room": event["LOCATION"],
"weekday": estart.weekday(),
- "day": estart.day
+ "day": estart.day,
+ "teacher": teacher,
}
eventl += [eventdict]
return eventl, await daylist(start_date, showsat), prevw, nextw, mon
diff --git a/calendars/list.json b/calendars/list.json
deleted file mode 100644
index 7a73a41..0000000
--- a/calendars/list.json
+++ /dev/null
@@ -1,2 +0,0 @@
-{
-}
\ No newline at end of file
diff --git a/fetchRAPLA.py b/fetchRAPLA.py
index 7c6a428..736de81 100644
--- a/fetchRAPLA.py
+++ b/fetchRAPLA.py
@@ -1,14 +1,15 @@
import urllib.error
-from urllib.request import urlretrieve
+
+from dateutil.parser import *
import asyncio
import httpx
import icalendar
+from icalendar import Calendar, Event
import json
-import recurring_ical_events
-from init import scheduler, app
+from init import scheduler, app, Rapla, db
async def fetchPlan(session, url):
@@ -21,6 +22,12 @@ def writeToFile(filename, data):
f.close()
+def writeToDB(kurs, url):
+ new_kurs = Rapla(name=kurs, link=url, file=f"rapla{kurs}.ical")
+ db.session.add(new_kurs)
+ db.session.commit()
+
+
def parseURL(url: str):
"""
Konvertiert URLs ins korrekte Format. \n
@@ -36,17 +43,19 @@ def parseURL(url: str):
url = url[rapla:]
http = url.find(":")
if url[:http] == "http":
- url = "https" + url[http:]
+ url = f"https{url[http:]}"
elif http == -1:
- url = "https://" + url
+ url = f"https://{url}"
p = url.find("page=")
u = url.find("&")
if (url[p + 5:u]).lower() == "ical":
- return url
+ return 1, url
elif p != -1:
- return url[:p + 5] + "ical" + url[u:]
+ return 1, f"{url[:p + 5]}ical{url[u:]}"
+ elif url.find("key") != -1:
+ return 2, url
else:
- return 0
+ return 0, 0
async def getNewRapla(url: str):
@@ -57,26 +66,26 @@ async def getNewRapla(url: str):
:param url:
:return str:
"""
- url = parseURL(url)
- if url == 0:
+ parsed = parseURL(url)
+ if parsed[0] == 0:
return 0
+ elif parsed[0] == 1:
+ url = parsed[1]
+ elif parsed[0] == 2:
+ return await buildFromKey(parsed[1])
urlfile = url.find("file=")
kurs = url[urlfile + 5:].upper()
-
- try:
- urlretrieve(url, "calendars/rapla" + kurs + ".ical")
- async with httpx.AsyncClient() as s:
- response = await fetchPlan(s, url)
- writeToFile(f"calendars/rapla{kurs}.ical", response)
- except urllib.error.URLError:
- return -1
- file = open("calendars/list.json", "r+")
- jsoncal = json.load(file)
- jsoncal.update({kurs: [f"rapla{kurs}.ical", url]})
- file.close()
- file = open("calendars/list.json", "w")
- json.dump(jsoncal, file, indent=4)
- return f"rapla{kurs}.ical"
+ if url[-5:] != ".ical":
+ try:
+ async with httpx.AsyncClient() as s:
+ response = await fetchPlan(s, url)
+ writeToFile(f"calendars/rapla{kurs}.ical", response)
+ except urllib.error.URLError:
+ return -1
+ writeToDB(kurs, url)
+ return f"rapla{kurs}.ical"
+ else:
+ return url
def getIcal(kurs: str):
@@ -85,10 +94,9 @@ def getIcal(kurs: str):
:param kurs:
:return str:
"""
- file = open("calendars/list.json", "r")
- jf = json.load(file)
+ rapla = Rapla.query.filter(Rapla.name == kurs).first()
try:
- return jf[kurs][0]
+ return rapla.file
except KeyError:
return None
@@ -98,16 +106,11 @@ def getRaplas():
Liefert alle auf dem Server gespeicherten Raplas.
:return (Kursliste, Dateiliste, URL-Liste):
"""
- file = open("calendars/list.json", "r")
- jsonf = json.load(file)
- kursl = []
- filel = []
- urll = []
- for i in jsonf:
- kursl += [i]
- filel += [jsonf[i][0]]
- urll += [jsonf[i][1]]
- return sorted(kursl), sorted(filel), sorted(urll)
+ raplas = Rapla.query.all()
+ kursl = [rapla.name for rapla in raplas]
+ filel = [rapla.file for rapla in raplas]
+ urll = [rapla.link for rapla in raplas]
+ return kursl, filel, urll
async def refreshRapla():
@@ -126,7 +129,51 @@ async def refreshRapla():
writeToFile(f"calendars/{filel[cal]}", callist[cal])
-@scheduler.task('cron', id="raplaschedule", hour='*', day_of_week='*', minute='*/15', week='*')
+#@scheduler.task('cron', id="raplaschedule", hour='*', day_of_week='*', minute='*/2', week='*')
def raplaschedule():
with app.app_context():
asyncio.run(refreshRapla())
+
+
+async def buildFromKey(url):
+ async with httpx.AsyncClient() as s:
+ page = await s.get(url=url)
+ if page.text[:10] == "BEGIN:VCAL":
+ info = page.headers['content-disposition']
+ kursname = info[info.find('filename=')+9:-4].upper()
+ writeToDB(kursname, url)
+ return url
+ else:
+ kursname = page.text[page.text.find("
") + 7:page.text.find("")]
+ if len(kursname) > 15:
+ return 0
+ start = "2024-08-01"
+ end = "2024-12-31"
+ payload = {"url": url, "start": start, "end": end}
+ req = await s.post(url="https://dh-api.paulmartin.cloud/rapla", data=payload,
+ headers={'Content-Type': 'application/x-www-form-urlencoded'}, timeout=10)
+ jsonresp = json.loads(req.text)
+ cal = Calendar()
+ cal.add('prodid', '-//Rapla//iCal Plugin//EN')
+ cal.add('version', '2.0')
+ for i in jsonresp:
+ if len(jsonresp[i]) != 0:
+ for jsonday in jsonresp[i]:
+ event = Event()
+ event.add('SUMMARY', jsonday['title'])
+ event.add('LOCATION', jsonday['ressources'])
+ event.add('DTSTART', parse(jsonday['startDate'], dayfirst=True))
+ event.add('DTEND', parse(jsonday['endDate'], dayfirst=True))
+ try:
+ teacher = icalendar.vCalAddress(value=jsonday['persons'])
+ teacher.params["CN"] = jsonday['persons']
+ except KeyError:
+ teacher = icalendar.vCalAddress(value="")
+ teacher.params["CN"] = ""
+ event.add('ATTENDEE', teacher)
+ cal.add_component(event)
+ with open(f"calendars/rapla{kursname}.ical", "wb") as f:
+ f.write(cal.to_ical())
+ f.close()
+ writeToDB(kursname, url)
+ return f"rapla{kursname}.ical"
diff --git a/init.py b/init.py
index c9e09e8..a2b1d4d 100644
--- a/init.py
+++ b/init.py
@@ -1,4 +1,3 @@
-import apscheduler
from flask import Flask
from flask_login import LoginManager, UserMixin
from flask_sqlalchemy import SQLAlchemy
@@ -8,7 +7,6 @@ from get_mysql import get_mysql
import atexit
from flask_apscheduler import APScheduler
-
def create():
"""
Erstellt die Flask-App inkl. Datenbank und Login-Manager.
@@ -69,6 +67,15 @@ class Semesterlist(db.Model):
itemid = db.Column(db.Integer, primary_key=True)
+class Rapla(db.Model):
+ """
+ Datenbank-Modell für Rapla.
+ """
+ name = db.Column(db.String(15), primary_key=True)
+ file = db.Column(db.String(20), unique=True)
+ link = db.Column(db.String(255), unique=True)
+
+
class Meals(db.Model):
"""
Datenbank-Modell für Meals.
diff --git a/requirements.txt b/requirements.txt
index 5b7d78c..264a7f5 100644
--- a/requirements.txt
+++ b/requirements.txt
@@ -1,20 +1,22 @@
-beautifulsoup4
-Flask
+beautifulsoup4~=4.12.2
+Flask~=3.0.3
Flask_APScheduler
Flask_Login
flask_sqlalchemy
-icalendar
+icalendar~=5.0.11
recurring_ical_events
talisman
-Werkzeug
+Werkzeug~=3.0.0
lxml
-bs4
-pytz
+bs4~=0.0.1
+pytz~=2023.3.post1
flask_talisman
-asyncio
-httpx
-celery
+asyncio~=3.4.3
+httpx~=1.0.0b0
+celery~=5.4.0rc2
flask[async]
pymysql
APScheduler
-cryptography
\ No newline at end of file
+cryptography
+python-dateutil~=2.9.0.post0
+requests~=2.31.0
\ No newline at end of file
diff --git a/routing.py b/routing.py
index a67aca2..6cc4da4 100644
--- a/routing.py
+++ b/routing.py
@@ -238,7 +238,7 @@ async def getRapla():
elif url != "None":
file = await getNewRapla(url)
if type(file) is not int:
- User.query.filter_by(id=current_user.id).first().kurs = file[5:-5]
+ loadUser(current_user.id).kurs = file[5:-5]
db.session.commit()
else:
return redirect(url_for("error", ecode=900))
diff --git a/static/cal.css b/static/cal.css
index 507e70f..0fc8525 100644
--- a/static/cal.css
+++ b/static/cal.css
@@ -126,7 +126,8 @@ option {
}
.room,
-.time {
+.time,
+.teacher {
display: block;
margin-top: 0px;
margin-bottom: 0px;
diff --git a/static/cal.css.map b/static/cal.css.map
index 1976298..b247b58 100644
--- a/static/cal.css.map
+++ b/static/cal.css.map
@@ -1 +1 @@
-{"version":3,"sourceRoot":"","sources":["cal.scss"],"names":[],"mappings":"AAAA;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGF;EACE;EACA;EACA;EACA;;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGF;EACE;EACA;EACA;EACA;;;AAGF;EACE;EACA;EACA;EACA;;;AAGF;EACE;EACA;EACA;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;EACA;EACA;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;EACA;EACA;;;AAEF;EACE;EACA;EACA;EACA;EACA;;;AAMF;EACE;EACA;EACA;EACA;;;AAGF;AAAA;EAEE;EACA;EACA;;;AAGF;EACE;;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGF;EACE;;;AAGF;AAAA;EAEE;;;AAKF;EACE;EACA;EACA;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;EACA;;;AAGF;EACE;EACA;EACA;;;AAKF;EACI;EACA;;;AAIJ;EACI;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGJ;EACI;;;AAGJ;EACI;EACA;EACA;EACA;EACA;;;AAGJ;EACI;;;AAGJ;EACI;EACA;EACA;;;AAGJ;EACI;EACA;;;AAGJ;EACI;;;AAIJ;EACI;EACA;EACA;EACA;;;AAGJ;EACI;EACA;;;AAGJ;EACI;EACA;EACA;;;AAGJ;EACI;;;AAGJ;EACI;EACA;EACA;;;AAGJ;EACI;EACA;;;AAGJ;EACE;;;AAQF;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAKA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAKA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAKA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA","file":"cal.css"}
\ No newline at end of file
+{"version":3,"sourceRoot":"","sources":["cal.scss"],"names":[],"mappings":"AAAA;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGF;EACE;EACA;EACA;EACA;;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGF;EACE;EACA;EACA;EACA;;;AAGF;EACE;EACA;EACA;EACA;;;AAGF;EACE;EACA;EACA;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;EACA;EACA;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;EACA;EACA;;;AAEF;EACE;EACA;EACA;EACA;EACA;;;AAMF;EACE;EACA;EACA;EACA;;;AAGF;AAAA;AAAA;EAGE;EACA;EACA;;;AAGF;EACE;;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGF;EACE;;;AAGF;AAAA;EAEE;;;AAKF;EACE;EACA;EACA;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;EACA;;;AAGF;EACE;EACA;EACA;;;AAKF;EACI;EACA;;;AAIJ;EACI;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGJ;EACI;;;AAGJ;EACI;EACA;EACA;EACA;EACA;;;AAGJ;EACI;;;AAGJ;EACI;EACA;EACA;;;AAGJ;EACI;EACA;;;AAGJ;EACI;;;AAIJ;EACI;EACA;EACA;EACA;;;AAGJ;EACI;EACA;;;AAGJ;EACI;EACA;EACA;;;AAGJ;EACI;;;AAGJ;EACI;EACA;EACA;;;AAGJ;EACI;EACA;;;AAGJ;EACE;;;AAQF;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAKA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAKA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAKA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA","file":"cal.css"}
\ No newline at end of file
diff --git a/static/cal.scss b/static/cal.scss
index 88644ca..c6bd428 100644
--- a/static/cal.scss
+++ b/static/cal.scss
@@ -128,7 +128,8 @@ option {
}
.room,
-.time {
+.time,
+.teacher {
display: block;
margin-top: 0px;
margin-bottom: 0px;
diff --git a/templates/plan-general.html b/templates/plan-general.html
index c93b7ea..ecf996c 100644
--- a/templates/plan-general.html
+++ b/templates/plan-general.html
@@ -64,9 +64,10 @@
{% if i["weekday"] == e %}
{% block event %} {% endblock %}
-
{{ i["name"] }}
-
{{ i["room"] }}
-
{{ i["start"] }} - {{ i["end"] }} ({{ i["dur"] }}h)
+
{{ i["name"] }}
+
{{ i["room"] }}
+
{{ i["teacher"] }}
+
{{ i["start"] }} - {{ i["end"] }} ({{ i["dur"] }}h)
{% endif %}
{% endfor %}
diff --git a/templates/testpages.html b/templates/testpages.html
deleted file mode 100644
index f7bc70b..0000000
--- a/templates/testpages.html
+++ /dev/null
@@ -1,16 +0,0 @@
-
-
-
-
- Test Pages
-
-
- kurs
- login
- noten
- plan-anon
- plan-user
- rapla
- semester
-
-
\ No newline at end of file
diff --git a/tests_examples/testpages.py b/tests_examples/testpages.py
deleted file mode 100644
index 5516e1a..0000000
--- a/tests_examples/testpages.py
+++ /dev/null
@@ -1,97 +0,0 @@
-import datetime
-
-import flask
-from flask import render_template, Flask, url_for, redirect
-
-app = Flask(__name__)
-
-sampleweek = ([{'start': '08:30', 'end': '11:00', 'dur': '2:30', 'name': "Rechnerarchitekturen",
- 'room': "A266 Hörsaal", 'weekday': 0, 'day': 11},
- {'start': '09:30', 'end': '12:00', 'dur': '2:30', 'name': "Netztechnik 1", 'room': "", 'weekday': 1,
- 'day': 12},
- {'start': '08:30', 'end': '12:00', 'dur': '3:30', 'name': "Info3", 'room': "", 'weekday': 2,
- 'day': 13},
- {'start': '08:30', 'end': '12:00', 'dur': '3:30', 'name': "Info3", 'room': "", 'weekday': 3,
- 'day': 14}, {'start': '11:00', 'end': '12:30', 'dur': '1:30', 'name': "Systemnahes Programmieren",
- 'room': "A266 Hörsaal", 'weekday': 0, 'day': 11},
- {'start': '13:00', 'end': '16:15', 'dur': '3:15', 'name': "Java", 'room': "A266 Hörsaal",
- 'weekday': 3, 'day': 14}], [{'day': 11, 'short': 'mon', 'long': 'Montag', 'mensa': [
- 'Frikadelle Hausfrauen Art mit Kräutersoße und Risoleekartoffeln Kräutersoße',
- 'Veganes Gemüseschnitzel Risoleekartoffeln Kräutersoße', 'Kaiserschmarrn mit Rosinen und Apfelmus Vanillesoße']},
- {'day': 12, 'short': 'tue', 'long': 'Dienstag', 'mensa': [
- 'Alaska Seelachsfilet in Backteig hausgemachter Kartoffelsalat Dip',
- 'Gemüsefrikadellen hausgemachter Kartoffelsalat Dip']},
- {'day': 13, 'short': 'wed', 'long': 'Mittwoch', 'mensa': [
- 'Roter Curry - Gemüseeintopf mit Hähnchenstreifen und Baguettebrötchen',
- 'Roter Curry - Gemüseeintopf mit Sojastreifen und Baguettebrötchen',
- 'Gebratene Gnocchis mit Karotten und Schnittlauchsoße']},
- {'day': 14, 'short': 'thu', 'long': 'Donnerstag', 'mensa': [
- 'Pasta mit Paprika, getrockneten Tomaten, Pinienkernen, Basilikum und Reibekäse',
- '2010: Königsberger Klopse in Kapernsoße und Salzkartoffeln',
- 'Pasta mit Hackfleisch - Champignon - Soße, Reibekäse']},
- {'day': 15, 'short': 'fri', 'long': 'Freitag', 'mensa': [
- 'Griechische Nudelpfanne mit Sojastreifen, Gemüse, Pinienkerne und Tomatensoße',
- 'Griechische Nudelpfanne mit Geflügel, Gemüse, Pinienkerne und Tomatensoße']}],
- datetime.date(2023, 12, 6), datetime.date(2023, 12, 20), 'Dezember 2023')
-
-
-@app.route("/")
-def index():
- return render_template('testpages.html')
-
-
-@app.route("/kurs")
-def kurs():
- return render_template("kurs.html", detected=("TINF22B3", False))
-
-
-@app.route("/login")
-def login():
- return render_template("login.html")
-
-
-@app.route("/noten")
-def displayNoten():
- return render_template("noten.html", noten=[["Info", "nicht bestanden", 2000]],
- semester=[["Sommersemester", "SoSe"]], sel="SoSe")
-
-
-@app.route("/plan/")
-def plananon(kurs):
- return render_template("plan-anon.html", events=sampleweek[0], eventdays=sampleweek[1], kurs=kurs,
- prev=str(sampleweek[2])[:10], next=str(sampleweek[3])[:10], mon=sampleweek[4])
-
-
-@app.route("/plan")
-def planuser():
- return render_template("plan-user.html", events=sampleweek[0], eventdays=sampleweek[1], kurs=kurs,
- prev=str(sampleweek[2])[:10], next=str(sampleweek[3])[:10], mon=sampleweek[4], name="Studi")
-
-
-@app.route("/rapla")
-def chooseRaplas():
- return render_template("rapla.html", raplas=[["TINF22B3"], ["TINF22B3"], ["TINF22B3"]])
-
-
-@app.route("/semester")
-def getSemester():
- return render_template("semester.html", semester=[["Sommersemester 2023", "SoSeID"]])
-
-
-@app.route("/setsemester", methods=["POST"])
-def setSemester():
- return redirect(url_for("index"))
-
-
-@app.route("/getrapla", methods=["POST"])
-def getRapla():
- return redirect(url_for("index"))
-
-
-@app.route("/login", methods=["POST"])
-def login_post():
- return redirect(url_for("index"))
-
-
-if __name__ == "__main__":
- app.run(host='0.0.0.0', port=2024, debug=True)