Rapla-Key-Import + Depreciate calendars/list.json

This commit is contained in:
2024-04-17 13:56:16 +02:00
parent e2eec5794e
commit dd052aeded
13 changed files with 126 additions and 176 deletions

3
.gitignore vendored
View File

@ -3,5 +3,4 @@ ENV/
set/ set/
VIRTUAL_ENV/ VIRTUAL_ENV/
calendars/ calendars/
.idea/ .idea/
calendars/list.json

View File

@ -40,8 +40,10 @@ async def getWeek(weekstart: datetime, file: str, showsat: bool):
mon += " " + str(end_date.year) mon += " " + str(end_date.year)
with open("calendars/" + file) as f: with open("calendars/" + file) as f:
calendar = icalendar.Calendar.from_ical(f.read()) calendar = icalendar.Calendar.from_ical(f.read())
events = recurring_ical_events.of(calendar).between(start_date, end_date) events = recurring_ical_events.of(calendar).between(start_date, end_date)
eventl = [] eventl = []
for event in events: for event in events:
estart = event["DTSTART"].dt estart = event["DTSTART"].dt
if str(estart.tzinfo) != "Europe/Berlin": if str(estart.tzinfo) != "Europe/Berlin":
@ -60,6 +62,10 @@ async def getWeek(weekstart: datetime, file: str, showsat: bool):
forml[i] = "0" + forml[i] forml[i] = "0" + forml[i]
formstart = forml[0] formstart = forml[0]
formend = forml[1] formend = forml[1]
try:
teacher = event["ATTENDEE"].params["CN"]
except KeyError:
teacher = ""
eventdict = { eventdict = {
"start": formstart, "start": formstart,
"end": formend, "end": formend,
@ -67,7 +73,8 @@ async def getWeek(weekstart: datetime, file: str, showsat: bool):
"name": event["SUMMARY"], "name": event["SUMMARY"],
"room": event["LOCATION"], "room": event["LOCATION"],
"weekday": estart.weekday(), "weekday": estart.weekday(),
"day": estart.day "day": estart.day,
"teacher": teacher,
} }
eventl += [eventdict] eventl += [eventdict]
return eventl, await daylist(start_date, showsat), prevw, nextw, mon return eventl, await daylist(start_date, showsat), prevw, nextw, mon

View File

@ -1,2 +0,0 @@
{
}

View File

@ -1,14 +1,15 @@
import urllib.error import urllib.error
from urllib.request import urlretrieve
from dateutil.parser import *
import asyncio import asyncio
import httpx import httpx
import icalendar import icalendar
from icalendar import Calendar, Event
import json import json
import recurring_ical_events
from init import scheduler, app from init import scheduler, app, Rapla, db
async def fetchPlan(session, url): async def fetchPlan(session, url):
@ -21,6 +22,12 @@ def writeToFile(filename, data):
f.close() 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): def parseURL(url: str):
""" """
Konvertiert URLs ins korrekte Format. \n Konvertiert URLs ins korrekte Format. \n
@ -36,17 +43,19 @@ def parseURL(url: str):
url = url[rapla:] url = url[rapla:]
http = url.find(":") http = url.find(":")
if url[:http] == "http": if url[:http] == "http":
url = "https" + url[http:] url = f"https{url[http:]}"
elif http == -1: elif http == -1:
url = "https://" + url url = f"https://{url}"
p = url.find("page=") p = url.find("page=")
u = url.find("&") u = url.find("&")
if (url[p + 5:u]).lower() == "ical": if (url[p + 5:u]).lower() == "ical":
return url return 1, url
elif p != -1: 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: else:
return 0 return 0, 0
async def getNewRapla(url: str): async def getNewRapla(url: str):
@ -57,26 +66,26 @@ async def getNewRapla(url: str):
:param url: :param url:
:return str: :return str:
""" """
url = parseURL(url) parsed = parseURL(url)
if url == 0: if parsed[0] == 0:
return 0 return 0
elif parsed[0] == 1:
url = parsed[1]
elif parsed[0] == 2:
return await buildFromKey(parsed[1])
urlfile = url.find("file=") urlfile = url.find("file=")
kurs = url[urlfile + 5:].upper() kurs = url[urlfile + 5:].upper()
if url[-5:] != ".ical":
try: try:
urlretrieve(url, "calendars/rapla" + kurs + ".ical") async with httpx.AsyncClient() as s:
async with httpx.AsyncClient() as s: response = await fetchPlan(s, url)
response = await fetchPlan(s, url) writeToFile(f"calendars/rapla{kurs}.ical", response)
writeToFile(f"calendars/rapla{kurs}.ical", response) except urllib.error.URLError:
except urllib.error.URLError: return -1
return -1 writeToDB(kurs, url)
file = open("calendars/list.json", "r+") return f"rapla{kurs}.ical"
jsoncal = json.load(file) else:
jsoncal.update({kurs: [f"rapla{kurs}.ical", url]}) return url
file.close()
file = open("calendars/list.json", "w")
json.dump(jsoncal, file, indent=4)
return f"rapla{kurs}.ical"
def getIcal(kurs: str): def getIcal(kurs: str):
@ -85,10 +94,9 @@ def getIcal(kurs: str):
:param kurs: :param kurs:
:return str: :return str:
""" """
file = open("calendars/list.json", "r") rapla = Rapla.query.filter(Rapla.name == kurs).first()
jf = json.load(file)
try: try:
return jf[kurs][0] return rapla.file
except KeyError: except KeyError:
return None return None
@ -98,16 +106,11 @@ def getRaplas():
Liefert alle auf dem Server gespeicherten Raplas. Liefert alle auf dem Server gespeicherten Raplas.
:return (Kursliste, Dateiliste, URL-Liste): :return (Kursliste, Dateiliste, URL-Liste):
""" """
file = open("calendars/list.json", "r") raplas = Rapla.query.all()
jsonf = json.load(file) kursl = [rapla.name for rapla in raplas]
kursl = [] filel = [rapla.file for rapla in raplas]
filel = [] urll = [rapla.link for rapla in raplas]
urll = [] return kursl, filel, urll
for i in jsonf:
kursl += [i]
filel += [jsonf[i][0]]
urll += [jsonf[i][1]]
return sorted(kursl), sorted(filel), sorted(urll)
async def refreshRapla(): async def refreshRapla():
@ -126,7 +129,51 @@ async def refreshRapla():
writeToFile(f"calendars/{filel[cal]}", callist[cal]) 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(): def raplaschedule():
with app.app_context(): with app.app_context():
asyncio.run(refreshRapla()) 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("<title>") + 7:page.text.find("</title>")]
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"

11
init.py
View File

@ -1,4 +1,3 @@
import apscheduler
from flask import Flask from flask import Flask
from flask_login import LoginManager, UserMixin from flask_login import LoginManager, UserMixin
from flask_sqlalchemy import SQLAlchemy from flask_sqlalchemy import SQLAlchemy
@ -8,7 +7,6 @@ from get_mysql import get_mysql
import atexit import atexit
from flask_apscheduler import APScheduler from flask_apscheduler import APScheduler
def create(): def create():
""" """
Erstellt die Flask-App inkl. Datenbank und Login-Manager. 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) 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): class Meals(db.Model):
""" """
Datenbank-Modell für Meals. Datenbank-Modell für Meals.

View File

@ -1,20 +1,22 @@
beautifulsoup4 beautifulsoup4~=4.12.2
Flask Flask~=3.0.3
Flask_APScheduler Flask_APScheduler
Flask_Login Flask_Login
flask_sqlalchemy flask_sqlalchemy
icalendar icalendar~=5.0.11
recurring_ical_events recurring_ical_events
talisman talisman
Werkzeug Werkzeug~=3.0.0
lxml lxml
bs4 bs4~=0.0.1
pytz pytz~=2023.3.post1
flask_talisman flask_talisman
asyncio asyncio~=3.4.3
httpx httpx~=1.0.0b0
celery celery~=5.4.0rc2
flask[async] flask[async]
pymysql pymysql
APScheduler APScheduler
cryptography cryptography
python-dateutil~=2.9.0.post0
requests~=2.31.0

View File

@ -238,7 +238,7 @@ async def getRapla():
elif url != "None": elif url != "None":
file = await getNewRapla(url) file = await getNewRapla(url)
if type(file) is not int: 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() db.session.commit()
else: else:
return redirect(url_for("error", ecode=900)) return redirect(url_for("error", ecode=900))

View File

@ -126,7 +126,8 @@ option {
} }
.room, .room,
.time { .time,
.teacher {
display: block; display: block;
margin-top: 0px; margin-top: 0px;
margin-bottom: 0px; margin-bottom: 0px;

View File

@ -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"} {"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"}

View File

@ -128,7 +128,8 @@ option {
} }
.room, .room,
.time { .time,
.teacher {
display: block; display: block;
margin-top: 0px; margin-top: 0px;
margin-bottom: 0px; margin-bottom: 0px;

View File

@ -64,9 +64,10 @@
{% if i["weekday"] == e %} {% if i["weekday"] == e %}
<div class="event start-{{ i["start"][:2]+i["start"][3:] }} end-{{ i["end"][:2]+i["end"][3:]}}"> <div class="event start-{{ i["start"][:2]+i["start"][3:] }} end-{{ i["end"][:2]+i["end"][3:]}}">
{% block event %} {% endblock %} {% block event %} {% endblock %}
<p class="title">{{ i["name"] }}</p> <p class="title">{{ i["name"] }}</p>
<p class="room">{{ i["room"] }}</p> <p class="room">{{ i["room"] }}</p>
<p class="time">{{ i["start"] }} - {{ i["end"] }} ({{ i["dur"] }}h)</p> <p class="teacher">{{ i["teacher"] }}</p>
<p class="time">{{ i["start"] }} - {{ i["end"] }} ({{ i["dur"] }}h)</p>
</div> </div>
{% endif %} {% endif %}
{% endfor %} {% endfor %}

View File

@ -1,16 +0,0 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Test Pages</title>
</head>
<body>
<a href={{ url_for("kurs") }} > kurs </a> <br>
<a href={{ url_for("login") }} > login </a><br>
<a href={{ url_for("displayNoten") }} > noten </a><br>
<a href={{ url_for("plananon", kurs="tinf22b3") }} > plan-anon </a><br>
<a href={{ url_for("planuser") }} > plan-user </a><br>
<a href={{ url_for("chooseRaplas") }} > rapla </a><br>
<a href={{ url_for("getSemester") }} > semester </a><br>
</body>
</html>

View File

@ -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/<string:kurs>")
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)