Rapla-Key-Import + Depreciate calendars/list.json
This commit is contained in:
3
.gitignore
vendored
3
.gitignore
vendored
@ -3,5 +3,4 @@ ENV/
|
||||
set/
|
||||
VIRTUAL_ENV/
|
||||
calendars/
|
||||
.idea/
|
||||
calendars/list.json
|
||||
.idea/
|
||||
@ -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
|
||||
|
||||
@ -1,2 +0,0 @@
|
||||
{
|
||||
}
|
||||
125
fetchRAPLA.py
125
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("<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
11
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.
|
||||
|
||||
@ -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
|
||||
cryptography
|
||||
python-dateutil~=2.9.0.post0
|
||||
requests~=2.31.0
|
||||
@ -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))
|
||||
|
||||
@ -126,7 +126,8 @@ option {
|
||||
}
|
||||
|
||||
.room,
|
||||
.time {
|
||||
.time,
|
||||
.teacher {
|
||||
display: block;
|
||||
margin-top: 0px;
|
||||
margin-bottom: 0px;
|
||||
|
||||
@ -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"}
|
||||
@ -128,7 +128,8 @@ option {
|
||||
}
|
||||
|
||||
.room,
|
||||
.time {
|
||||
.time,
|
||||
.teacher {
|
||||
display: block;
|
||||
margin-top: 0px;
|
||||
margin-bottom: 0px;
|
||||
|
||||
@ -64,9 +64,10 @@
|
||||
{% if i["weekday"] == e %}
|
||||
<div class="event start-{{ i["start"][:2]+i["start"][3:] }} end-{{ i["end"][:2]+i["end"][3:]}}">
|
||||
{% block event %} {% endblock %}
|
||||
<p class="title">{{ i["name"] }}</p>
|
||||
<p class="room">{{ i["room"] }}</p>
|
||||
<p class="time">{{ i["start"] }} - {{ i["end"] }} ({{ i["dur"] }}h)</p>
|
||||
<p class="title">{{ i["name"] }}</p>
|
||||
<p class="room">{{ i["room"] }}</p>
|
||||
<p class="teacher">{{ i["teacher"] }}</p>
|
||||
<p class="time">{{ i["start"] }} - {{ i["end"] }} ({{ i["dur"] }}h)</p>
|
||||
</div>
|
||||
{% endif %}
|
||||
{% endfor %}
|
||||
|
||||
@ -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>
|
||||
@ -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)
|
||||
Reference in New Issue
Block a user