9 Commits

Author SHA1 Message Date
fc97411177 Errorpage + RAPLA-Styling 2023-12-14 21:43:13 +01:00
a6372086db Launch prep 2023-12-14 18:49:45 +01:00
64115fe2d0 Merge remote-tracking branch 'origin/Frontend' into Backend
# Conflicts:
#	static/style.css
#	templates/index.html
2023-12-14 13:13:12 +01:00
07d4dd098f Dasboard 2023-12-14 13:10:22 +01:00
65d14f51cd Dashboard 2023-12-14 13:09:36 +01:00
15954af651 Plan + Tests 2023-12-13 18:52:59 +01:00
ae8b0206fc Plan prep frontend 2023-12-12 23:43:29 +01:00
b302ce4d49 Plan prep backend 2023-12-12 23:29:40 +01:00
3a3b6c895c plan.html Quickfix 2023-12-11 15:14:43 +01:00
25 changed files with 2139 additions and 467 deletions

View File

@ -2,15 +2,18 @@ import icalendar
import datetime import datetime
import recurring_ical_events import recurring_ical_events
from fetchMENSA import getMeals from fetchMENSA import getMeals
import pytz
shortnames = ["mon", "tue", "wed", "thu", "fri", "sat"] shortnames = ["mon", "tue", "wed", "thu", "fri", "sat"]
longnames = ["Montag", "Dienstag", "Mittwoch", "Donnerstag", "Freitag", "Samstag"] longnames = ["Montag", "Dienstag", "Mittwoch", "Donnerstag", "Freitag", "Samstag"]
months = ["Januar", "Februar", "März", "April", "Mai", "Juni", "Juli", "August", "September", "Oktober",
"November", "Dezember"]
def getWeek(weekstart: datetime, file: str, showsat: bool): def getWeek(weekstart: datetime, file: str, showsat: bool):
""" """
Liefert alle Events einer Woche zurück. Liefert alle Events einer Woche zurück. \n
Wochenstart wird automatisch auf den Montag der Woche gelegt. Wochenstart wird automatisch auf den Montag der Woche gelegt. \n
:param weekstart: :param weekstart:
:param file: :param file:
:param showsat: :param showsat:
@ -20,16 +23,30 @@ def getWeek(weekstart: datetime, file: str, showsat: bool):
start_date = datetime.date.today() start_date = datetime.date.today()
else: else:
start_date = weekstart start_date = weekstart
nextw = start_date + datetime.timedelta(weeks=1)
prevw = start_date - datetime.timedelta(weeks=1)
start_date -= datetime.timedelta(days=start_date.weekday() % 7) start_date -= datetime.timedelta(days=start_date.weekday() % 7)
end_date = start_date + datetime.timedelta(days=7) end_date = start_date + datetime.timedelta(days=6)
mon = months[start_date.month - 1]
if start_date.month != end_date.month:
if start_date.year != end_date.year:
mon += " " + str(start_date.year) + " | " + months[end_date.month - 1]
else:
mon += " | " + months[end_date.month-1]
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":
estart = estart.astimezone(pytz.timezone("Europe/Berlin"))
formstart = str(estart.hour) + ":" + str(estart.minute) formstart = str(estart.hour) + ":" + str(estart.minute)
eend = event["DTEND"].dt eend = event["DTEND"].dt
if str(eend.tzinfo) != "Europe/Berlin":
eend = eend.astimezone(pytz.timezone("Europe/Berlin"))
formend = str(eend.hour) + ":" + str(eend.minute) formend = str(eend.hour) + ":" + str(eend.minute)
forml = [formstart, formend] forml = [formstart, formend]
for i in range(2): for i in range(2):
@ -50,7 +67,7 @@ def getWeek(weekstart: datetime, file: str, showsat: bool):
"day": estart.day "day": estart.day
} }
eventl += [eventdict] eventl += [eventdict]
return eventl, daylist(start_date, showsat) return eventl, daylist(start_date, showsat), prevw, nextw, mon
def daylist(weekstart: datetime, showsat: bool): def daylist(weekstart: datetime, showsat: bool):

40
genstarts.py Normal file
View File

@ -0,0 +1,40 @@
from flask import url_for
css = ""
for se in ("start", "end"):
acht = 0
for i in range(0, 28):
if i % 4 == 0:
acht += 100
h = str(acht)
else:
h = str(acht + (i % 4 * 15))
if len(h) == 3:
h = "0" + h
css += "." + se + "-" + h + " {\n"
if se == "start":
css += "grid-row-" + se + ": " + "1" + "\n}\n"
else:
css += "grid-row-" + se + ": " + "4" + "\n}\n"
css += "\n\n\n"
for se in ("start", "end"):
acht = 700
for i in range(0, 45):
if i % 4 == 0:
acht += 100
h = str(acht)
else:
h = str(acht + (i % 4 * 15))
if len(h) == 3:
h = "0" + h
css += "." + se + "-" + h + " {\n"
css += "grid-row-" + se + ": " + str(i+1) + "\n}\n"
css += "\n\n\n"
f = open("static/cal.scss", "a")
f.write ("\n // Generated by genstarts.py\n\n")
f.write(css)
f.close()

View File

@ -1,6 +1,6 @@
#!/bin/sh #!/bin/sh
#Erstellt alle benötigten MySQL-Tabellen. #Erstellt alle benötigten MySQL-Tabellen.
mysql -e "USE paulmrtn_DUALHUB; CREATE TABLE user ( id int NOT NULL, email VARCHAR(255), password VARCHAR(255), name VARCHAR(255), kurs VARCHAR (15), PRIMARY KEY (ID), UNIQUE (ID, EMAIL) );" mysql -e "USE paulmrtn_DUALHUB; CREATE TABLE user ( id int NOT NULL, email VARCHAR(255), name VARCHAR(255), kurs VARCHAR (15), PRIMARY KEY (ID), UNIQUE (ID, EMAIL) );"
mysql -e "USE paulmrtn_DUALHUB; CREATE TABLE dualis ( uid int NOT NULL, token VARCHAR(255), result_list VARCHAR(15), token_created INT, PRIMARY KEY (uid));" mysql -e "USE paulmrtn_DUALHUB; CREATE TABLE dualis ( uid int NOT NULL, token VARCHAR(255), result_list VARCHAR(15), token_created INT, PRIMARY KEY (uid));"
mysql -e "USE paulmrtn_DUALHUB; CREATE TABLE meals ( id int NOT NULL, date date, name VARCHAR(200), vegetarian tinyint(1), vegan tinyint(1), schwein tinyint(1), PRIMARY KEY (id));" mysql -e "USE paulmrtn_DUALHUB; CREATE TABLE meals ( id int NOT NULL, date date, name VARCHAR(200), vegetarian tinyint(1), vegan tinyint(1), schwein tinyint(1), PRIMARY KEY (id));"

View File

@ -43,7 +43,6 @@ class User(UserMixin, db.Model):
""" """
id = db.Column(db.Integer, primary_key=True) id = db.Column(db.Integer, primary_key=True)
email = db.Column(db.String(255), unique=True) email = db.Column(db.String(255), unique=True)
password = db.Column(db.String(255))
name = db.Column(db.String(255)) name = db.Column(db.String(255))
kurs = db.Column(db.String(15)) kurs = db.Column(db.String(15))

View File

@ -9,3 +9,5 @@ Requests
talisman talisman
Werkzeug Werkzeug
lxml lxml
bs4
pytz

View File

@ -25,20 +25,30 @@ def index():
return redirect(url_for("login")) return redirect(url_for("login"))
@app.route("/welcome") @app.route("/dashboard")
@login_required @login_required
def welcome(): def welcome():
""" """
Interim Homepage Dashboard
:return HTML: :return HTML:
""" """
if not current_user.kurs:
return redirect(url_for("getKurs", next=url_for(request.endpoint)))
sel = request.args.get("sel")
if not sel:
sel="theorie"
kurs = current_user.kurs kurs = current_user.kurs
name = current_user.name name = current_user.name
return render_template('index.html', headermessage='DualHub', message="Hallo, " if sel == "theorie":
+ name + " (" + kurs + ")") t = ""
p = "hidden"
else:
t = "hidden"
p = ""
return render_template('dashboard.html', kurs=kurs, name=name, theorie=t, praxis=p)
@app.route("/backendpoc/noten") @app.route("/theorie/noten")
@login_required @login_required
def displayNoten(): def displayNoten():
""" """
@ -46,6 +56,8 @@ def displayNoten():
:return HTML: :return HTML:
""" """
d = Dualis.query.filter_by(uid=current_user.id).first() d = Dualis.query.filter_by(uid=current_user.id).first()
if not d.result_list:
return redirect(url_for("getSemester", next=url_for(request.endpoint)))
t = d.token t = d.token
sem = d.result_list sem = d.result_list
c = request.cookies.get("cnsc") c = request.cookies.get("cnsc")
@ -53,10 +65,10 @@ def displayNoten():
if timeout: if timeout:
return timeout return timeout
res = fetchDUALIS.getResults(t, c, sem) res = fetchDUALIS.getResults(t, c, sem)
return render_template("noten.html", noten=res, semester=fetchDUALIS.getSem(t, c), sel=sem) return render_template("noten.html", noten=res, semester=fetchDUALIS.getSem(t, c), sel=sem, s="n", praxis="hidden")
@app.route("/backendpoc/plan", methods=["GET"]) @app.route("/plan", methods=["GET"])
@login_required @login_required
def displayRapla(): def displayRapla():
""" """
@ -64,6 +76,8 @@ def displayRapla():
TODO: Persönliche Filter, Notizen, Essensvorlieben etc. berücksichtigen. TODO: Persönliche Filter, Notizen, Essensvorlieben etc. berücksichtigen.
:return HTML: :return HTML:
""" """
if not current_user.kurs:
return redirect(url_for("getKurs", next=url_for(request.endpoint)))
week = request.args.get("week") week = request.args.get("week")
if week: if week:
week = datetime.datetime.strptime(week, "%Y-%m-%d") week = datetime.datetime.strptime(week, "%Y-%m-%d")
@ -73,10 +87,12 @@ def displayRapla():
if not samstag: if not samstag:
samstag = False samstag = False
events = getWeek(week, fetchRAPLA.getIcal(current_user.kurs), samstag) events = getWeek(week, fetchRAPLA.getIcal(current_user.kurs), samstag)
return render_template("plan.html", events=events[0], eventdays=events[1]) return render_template("plan-user.html", events=events[0], eventdays=events[1],
name=current_user.name, prev=str(events[2])[:10], next=str(events[3])[:10], mon=events[4],
s="p", praxis="hidden")
@app.route("/backendpoc/plan/<string:kurs>") @app.route("/plan/<string:kurs>")
def displayPlan(kurs): def displayPlan(kurs):
""" """
Zeigt den Stundenplan ohne Login an. \n Zeigt den Stundenplan ohne Login an. \n
@ -94,18 +110,20 @@ def displayPlan(kurs):
return redirect(url_for("displayRapla")) return redirect(url_for("displayRapla"))
except AttributeError: except AttributeError:
pass pass
plan = fetchRAPLA.getIcal(kurs.upper()) kurs = kurs.upper()
plan = fetchRAPLA.getIcal(kurs)
if plan: if plan:
samstag = request.args.get("samstag") samstag = request.args.get("samstag")
if not samstag: if not samstag:
samstag = False samstag = False
events = getWeek(week, plan, samstag) events = getWeek(week, plan, samstag)
return render_template("plan-anon.html", events=events[0], eventdays=events[1]) return render_template("plan-anon.html", events=events[0], eventdays=events[1], kurs=kurs,
prev=str(events[2])[:10], next=str(events[3])[:10], mon=events[4])
else: else:
return redirect(url_for("login")) return redirect(url_for("login"))
@app.route("/backendpoc/set-up") @app.route("/set-up")
def redKurs(): def redKurs():
""" """
Setup beginnt mit Kurs. Setup beginnt mit Kurs.
@ -114,7 +132,7 @@ def redKurs():
return redirect(url_for("getKurs")) return redirect(url_for("getKurs"))
@app.route("/backendpoc/set-up/kurs") @app.route("/set-up/kurs")
@login_required @login_required
def getKurs(): def getKurs():
""" """
@ -143,10 +161,10 @@ def getKurs():
else: else:
e = True e = True
kurs = "" kurs = ""
return render_template('kurs.html', detected=(kurs, e)) return render_template('kurs.html', detected=(kurs, e), s="s", theorie="hidden", praxis="hidden")
@app.route("/backendpoc/set-up/semester") @app.route("/set-up/semester")
@login_required @login_required
def getSemester(): def getSemester():
""" """
@ -156,10 +174,10 @@ def getSemester():
t = Dualis.query.filter_by(uid=current_user.id).first().token t = Dualis.query.filter_by(uid=current_user.id).first().token
c = request.cookies.get("cnsc") c = request.cookies.get("cnsc")
return render_template("semester.html", semester=fetchDUALIS.getSem(t, c)) return render_template("semester.html", semester=fetchDUALIS.getSem(t, c), s="s", theorie="hidden", praxis="hidden")
@app.route("/backendpoc/set-up/semester", methods=["POST"]) @app.route("/set-up/semester", methods=["POST"])
@login_required @login_required
def setSemester(): def setSemester():
""" """
@ -175,7 +193,7 @@ def setSemester():
return redirect(n) return redirect(n)
@app.route("/backendpoc/set-up/rapla") @app.route("/set-up/rapla")
@login_required @login_required
def chooseRaplas(): def chooseRaplas():
""" """
@ -183,10 +201,10 @@ def chooseRaplas():
:return HTML: :return HTML:
""" """
r = getRaplas() r = getRaplas()
return render_template("rapla.html", raplas=r) return render_template("rapla.html", raplas=r, s="s", theorie="hidden", praxis="hidden")
@app.route("/backendpoc/set-up/rapla", methods=["POST"]) @app.route("/set-up/rapla", methods=["POST"])
@login_required @login_required
def getRapla(): def getRapla():
""" """
@ -206,20 +224,20 @@ def getRapla():
User.query.filter_by(id=current_user.id).first().kurs = file[5:-5] User.query.filter_by(id=current_user.id).first().kurs = file[5:-5]
db.session.commit() db.session.commit()
else: else:
return redirect(url_for("error", ecode=file + 900)) return redirect(url_for("error", ecode=900))
return redirect(url_for("welcome")) return redirect(url_for("welcome"))
@app.route("/backendpoc/log-in") @app.route("/log-in")
def login(): def login():
""" """
Login-Maske. Login-Maske.
:return HTML: :return HTML:
""" """
return render_template("login.html") return render_template("login.html", theorie="hidden", praxis="hidden", s="s")
@app.route("/backendpoc/log-in", methods=["POST"]) @app.route("/log-in", methods=["POST"])
def login_post(): def login_post():
""" """
Verarbeitet die Eingabe von login(). \n Verarbeitet die Eingabe von login(). \n
@ -236,58 +254,42 @@ def login_post():
success = make_response(redirect(url_for("getKurs"))) success = make_response(redirect(url_for("getKurs")))
user = User.query.filter_by(email=email).first() user = User.query.filter_by(email=email).first()
newcookie = ""
if user:
dualis = Dualis.query.filter_by(uid=user.id).first()
if check_password_hash(user.password, password):
cookie = request.cookies.get("cnsc")
if not dualis.token or not fetchDUALIS.checkLifetime(dualis.token_created) or not cookie:
new_token = fetchDUALIS.checkUser(email, password)
dualis.token = new_token[0]
newcookie = requesthelpers.getCookie(new_token[1].cookies)
dualis.token_created = time.time()
db.session.commit()
else:
t = fetchDUALIS.checkUser(email, password)
if t[0] == -2:
return redirect(url_for("login", code=-2))
else:
user.password = generate_password_hash(password, method="pbkdf2:sha256")
dualis.token = t[0]
newcookie = requesthelpers.getCookie(t[1].cookies)
dualis.token_created = time.time()
db.session.commit()
login_user(user)
if user.kurs:
if not n:
success = make_response(redirect(url_for("welcome")))
success.set_cookie("cnsc", value=newcookie, httponly=True, secure=True)
return success
t = fetchDUALIS.checkUser(email, password) t = fetchDUALIS.checkUser(email, password)
if t[0] == -2: if t[0] == -2:
return redirect(url_for("login", code=-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)
dualis.token_created = time.time()
db.session.commit()
login_user(user)
if user.kurs:
if not dualis.result_list:
success = make_response(redirect(url_for("getSemester")))
elif not n:
success = make_response(redirect(url_for("welcome")))
success.set_cookie("cnsc", value=newcookie, httponly=True, secure=True)
hashid = int(hashlib.sha1(email.encode("utf-8")).hexdigest(), 16) % (10 ** 8) else:
hashpw = generate_password_hash(password, method="pbkdf2:sha256") hashid = int(hashlib.sha1(email.encode("utf-8")).hexdigest(), 16) % (10 ** 8)
pname = email.find(".") + 1 pname = email.find(".") + 1
ename = min(email[pname:].find("."), email[pname:].find("@")) ename = min(email[pname:].find("."), email[pname:].find("@"))
name = email[pname:pname + ename].capitalize() name = email[pname:pname + ename].capitalize()
new_user = User(email=email, password=hashpw, name=name, id=hashid) new_user = User(email=email, name=name, id=hashid)
db.session.add(new_user) db.session.add(new_user)
cookie = requesthelpers.getCookie(t[1].cookies) cookie = requesthelpers.getCookie(t[1].cookies)
new_dualis = Dualis(uid=hashid, token=t[0], token_created=int(time.time())) new_dualis = Dualis(uid=hashid, token=t[0], token_created=int(time.time()))
db.session.add(new_dualis) db.session.add(new_dualis)
db.session.commit() db.session.commit()
login_user(new_user) login_user(new_user)
newcookie = cookie success.set_cookie("cnsc", value=cookie, httponly=True, secure=True)
success.set_cookie("cnsc", value=newcookie, httponly=True, secure=True)
return success return success
@app.route("/backendpoc/log-out") @app.route("/log-out")
@login_required @login_required
def logout(): def logout():
""" """
@ -307,29 +309,30 @@ def logout():
return red return red
@app.route("/backendpoc/error<int:ecode>") @app.route("/error")
def error(ecode): def error():
""" """
Error Page für custom-Errors. \n Error Page für custom-Errors. \n
TODO: Funktion depreciaten. Ersetzen durch Errors auf den entsprechenden Seiten. TODO: Funktion depreciaten. Ersetzen durch Errors auf den entsprechenden Seiten.
:param ecode:
:return: :return:
""" """
if ecode == 900: error = request.args.get("ecode")
if error == "900":
msg = "Ungültige RAPLA-URL! Sicher, dass der Link zum DHBW-Rapla führt?" msg = "Ungültige RAPLA-URL! Sicher, dass der Link zum DHBW-Rapla führt?"
elif ecode == 899: elif error == "899":
msg = "Der Kalender wurde nicht gefunden! Sicher, dass der Link korrekt ist?" msg = "Der Kalender wurde nicht gefunden! Sicher, dass der Link korrekt ist?"
else: else:
msg = "Unbekannter Fehler!" msg = str(error)
return render_template('index.html', message=msg, headermessage="DualHub") return render_template('display-message.html', message=msg)
@app.route("/error")
@app.errorhandler(HTTPException) @app.errorhandler(HTTPException)
def handle(e): def handle(e):
"""" """"
HTTP-Exception-Handler HTTP-Exception-Handler
""" """
return render_template('index.html', message=e, headermessage="DualHub") return render_template('display-message.html', message=e)
if __name__ == "__main__": if __name__ == "__main__":

View File

@ -1,13 +1,17 @@
:root { :root {
--numDays: 5; --numDays: 5;
--numHours: 10; --numHours: 13;
--numHalfHours: 23;
--numQuartHours: 45;
--timeHeight: 60px; --timeHeight: 60px;
--calBgColor: #fff1f8; --halfTimeHeight: 30px;
--eventBorderColor: #f2d3d8; --quartTimeHeight: 15px;
--eventColor1: #ffd6d1; --calBgColor: #3f2d2d;
--eventBorderColor: #000000;
--eventColor1: #b82424;
--eventColor2: #fafaa3; --eventColor2: #fafaa3;
--eventColor3: #e2f8ff; --eventColor3: #1894bb;
--eventColor4: #d1ffe6; --eventColor4: rgba(184, 36, 36, 0.65);
} }
.calendar { .calendar {
@ -17,9 +21,86 @@
margin: 2rem; margin: 2rem;
} }
select {
width: 100%;
height: 40px;
border-radius: 5px;
color: white;
border-color: transparent;
background-color: var(--calBgColor);
text-align: center;
}
.userbuttons {
width: 90%;
position: absolute;
display: flex;
justify-content: end;
}
.changeweek {
font-size: 2.5em;
text-decoration: none;
font-weight: 600;
color: white;
}
.changeweek:hover {
color: transparent;
-webkit-text-fill-color: transparent;
-webkit-text-stroke: 3px white;
}
h2 {
font-weight: 300;
margin: 5px;
}
.headerblock {
display: flex;
justify-content: space-between;
padding-right: 20%;
padding-left: 20%;
}
.customheader {
display: flex;
justify-content: space-evenly;
}
button {
border-radius: 5px;
border-color: white;
color: white;
border-style: solid;
background: transparent;
font-weight: 600;
width: 30px;
height: 30px;
margin: 2px;
line-height: 25px;
}
button:hover {
cursor: pointer;
}
.plusbutton {
font-size: 1.5em;
}
form {
margin-top: 5px;
}
option {
width: 300px;
font-size: 1rem;
}
.timeline { .timeline {
display: grid; display: grid;
grid-template-rows: repeat(var(--numHours), var(--timeHeight)); grid-template-rows: repeat(12, 58px);
} }
.days { .days {
@ -31,50 +112,28 @@
.events { .events {
display: grid; display: grid;
grid-template-rows: repeat(var(--numHours), var(--timeHeight)); grid-template-rows: repeat(var(--numQuartHours), var(--quartTimeHeight));
border-radius: 5px; border-radius: 5px;
color: black;
background: var(--calBgColor); background: var(--calBgColor);
} }
.start-1000 {
grid-row-start: 2;
}
.start-1200 {
grid-row-start: 4;
}
.start-1300 {
grid-row-start: 5;
}
.start-1400 {
grid-row-start: 6;
}
.end-1200 {
grid-row-end: 4;
}
.end-1300 {
grid-row-end: 5;
}
.end-1500 {
grid-row-end: 7;
}
.end-1600 {
grid-row-end: 8;
}
.end-1700 {
grid-row-end: 9;
}
.title { .title {
width: 70%;
font-weight: 600; font-weight: 600;
margin-bottom: 0.25rem; margin-top: 0px;
margin-bottom: 0px;
}
.room,
.time {
display: block;
margin-top: 0px;
margin-bottom: 0px;
}
.room {
width: 70%;
} }
.event { .event {
@ -82,36 +141,24 @@
border-radius: 5px; border-radius: 5px;
padding: 0.5rem; padding: 0.5rem;
margin: 0 0.5rem; margin: 0 0.5rem;
background: white; color: white;
background: var(--eventColor4);
position: relative;
} }
.space, .space,
.date { .date {
height: 60px; height: 100px;
} }
body { body {
font-family: system-ui, sans-serif; font-family: "Asap", "Calibri", "Arial", sans-serif;
} color: white;
background-color: black;
.corp-fi {
background: var(--eventColor1);
}
.ent-law {
background: var(--eventColor2);
}
.writing {
background: var(--eventColor3);
}
.securities {
background: var(--eventColor4);
} }
.date { .date {
display: flex; margin-bottom: 1em;
gap: 1em; gap: 1em;
} }
@ -127,4 +174,655 @@ body {
font-weight: 100; font-weight: 100;
} }
.cs1 {
margin-left: 220px;
padding: 20px;
}
nav ul {
list-style-type: none;
margin: 0;
padding: 0;
width: 200px;
background-color: #333;
position: fixed;
top: 0;
left: 0;
height: 100%;
overflow-y: auto;
font-size: 150%;
}
nav li {
border-top: none;
}
nav li.top {
border-style: solid;
border-radius: 5px;
border-color: white;
margin: 10px;
text-align: center;
}
nav a.top:hover {
background: transparent;
}
nav li.start a {
border-top: 3px solid white;
margin-top: 20px;
padding-top: 30px;
}
nav a.selected {
color: red;
background-color: black;
}
nav li.top.selected {
border-color: red;
}
nav li a {
display: block;
color: white;
padding: 12px 16px;
text-decoration: none;
}
nav li a:hover {
background-color: red;
}
nav li .bottom {
position: absolute;
bottom: 0;
width: 200px;
}
.start-0100 {
grid-row-start: 1;
}
.start-0115 {
grid-row-start: 1;
}
.start-0130 {
grid-row-start: 1;
}
.start-0145 {
grid-row-start: 1;
}
.start-0200 {
grid-row-start: 1;
}
.start-0215 {
grid-row-start: 1;
}
.start-0230 {
grid-row-start: 1;
}
.start-0245 {
grid-row-start: 1;
}
.start-0300 {
grid-row-start: 1;
}
.start-0315 {
grid-row-start: 1;
}
.start-0330 {
grid-row-start: 1;
}
.start-0345 {
grid-row-start: 1;
}
.start-0400 {
grid-row-start: 1;
}
.start-0415 {
grid-row-start: 1;
}
.start-0430 {
grid-row-start: 1;
}
.start-0445 {
grid-row-start: 1;
}
.start-0500 {
grid-row-start: 1;
}
.start-0515 {
grid-row-start: 1;
}
.start-0530 {
grid-row-start: 1;
}
.start-0545 {
grid-row-start: 1;
}
.start-0600 {
grid-row-start: 1;
}
.start-0615 {
grid-row-start: 1;
}
.start-0630 {
grid-row-start: 1;
}
.start-0645 {
grid-row-start: 1;
}
.start-0700 {
grid-row-start: 1;
}
.start-0715 {
grid-row-start: 1;
}
.start-0730 {
grid-row-start: 1;
}
.start-0745 {
grid-row-start: 1;
}
.end-0100 {
grid-row-end: 4;
}
.end-0115 {
grid-row-end: 4;
}
.end-0130 {
grid-row-end: 4;
}
.end-0145 {
grid-row-end: 4;
}
.end-0200 {
grid-row-end: 4;
}
.end-0215 {
grid-row-end: 4;
}
.end-0230 {
grid-row-end: 4;
}
.end-0245 {
grid-row-end: 4;
}
.end-0300 {
grid-row-end: 4;
}
.end-0315 {
grid-row-end: 4;
}
.end-0330 {
grid-row-end: 4;
}
.end-0345 {
grid-row-end: 4;
}
.end-0400 {
grid-row-end: 4;
}
.end-0415 {
grid-row-end: 4;
}
.end-0430 {
grid-row-end: 4;
}
.end-0445 {
grid-row-end: 4;
}
.end-0500 {
grid-row-end: 4;
}
.end-0515 {
grid-row-end: 4;
}
.end-0530 {
grid-row-end: 4;
}
.end-0545 {
grid-row-end: 4;
}
.end-0600 {
grid-row-end: 4;
}
.end-0615 {
grid-row-end: 4;
}
.end-0630 {
grid-row-end: 4;
}
.end-0645 {
grid-row-end: 4;
}
.end-0700 {
grid-row-end: 4;
}
.end-0715 {
grid-row-end: 4;
}
.end-0730 {
grid-row-end: 4;
}
.end-0745 {
grid-row-end: 4;
}
.start-0800 {
grid-row-start: 1;
}
.start-0815 {
grid-row-start: 2;
}
.start-0830 {
grid-row-start: 3;
}
.start-0845 {
grid-row-start: 4;
}
.start-0900 {
grid-row-start: 5;
}
.start-0915 {
grid-row-start: 6;
}
.start-0930 {
grid-row-start: 7;
}
.start-0945 {
grid-row-start: 8;
}
.start-1000 {
grid-row-start: 9;
}
.start-1015 {
grid-row-start: 10;
}
.start-1030 {
grid-row-start: 11;
}
.start-1045 {
grid-row-start: 12;
}
.start-1100 {
grid-row-start: 13;
}
.start-1115 {
grid-row-start: 14;
}
.start-1130 {
grid-row-start: 15;
}
.start-1145 {
grid-row-start: 16;
}
.start-1200 {
grid-row-start: 17;
}
.start-1215 {
grid-row-start: 18;
}
.start-1230 {
grid-row-start: 19;
}
.start-1245 {
grid-row-start: 20;
}
.start-1300 {
grid-row-start: 21;
}
.start-1315 {
grid-row-start: 22;
}
.start-1330 {
grid-row-start: 23;
}
.start-1345 {
grid-row-start: 24;
}
.start-1400 {
grid-row-start: 25;
}
.start-1415 {
grid-row-start: 26;
}
.start-1430 {
grid-row-start: 27;
}
.start-1445 {
grid-row-start: 28;
}
.start-1500 {
grid-row-start: 29;
}
.start-1515 {
grid-row-start: 30;
}
.start-1530 {
grid-row-start: 31;
}
.start-1545 {
grid-row-start: 32;
}
.start-1600 {
grid-row-start: 33;
}
.start-1615 {
grid-row-start: 34;
}
.start-1630 {
grid-row-start: 35;
}
.start-1645 {
grid-row-start: 36;
}
.start-1700 {
grid-row-start: 37;
}
.start-1715 {
grid-row-start: 38;
}
.start-1730 {
grid-row-start: 39;
}
.start-1745 {
grid-row-start: 40;
}
.start-1800 {
grid-row-start: 41;
}
.start-1815 {
grid-row-start: 42;
}
.start-1830 {
grid-row-start: 43;
}
.start-1845 {
grid-row-start: 44;
}
.start-1900 {
grid-row-start: 45;
}
.end-0800 {
grid-row-end: 1;
}
.end-0815 {
grid-row-end: 2;
}
.end-0830 {
grid-row-end: 3;
}
.end-0845 {
grid-row-end: 4;
}
.end-0900 {
grid-row-end: 5;
}
.end-0915 {
grid-row-end: 6;
}
.end-0930 {
grid-row-end: 7;
}
.end-0945 {
grid-row-end: 8;
}
.end-1000 {
grid-row-end: 9;
}
.end-1015 {
grid-row-end: 10;
}
.end-1030 {
grid-row-end: 11;
}
.end-1045 {
grid-row-end: 12;
}
.end-1100 {
grid-row-end: 13;
}
.end-1115 {
grid-row-end: 14;
}
.end-1130 {
grid-row-end: 15;
}
.end-1145 {
grid-row-end: 16;
}
.end-1200 {
grid-row-end: 17;
}
.end-1215 {
grid-row-end: 18;
}
.end-1230 {
grid-row-end: 19;
}
.end-1245 {
grid-row-end: 20;
}
.end-1300 {
grid-row-end: 21;
}
.end-1315 {
grid-row-end: 22;
}
.end-1330 {
grid-row-end: 23;
}
.end-1345 {
grid-row-end: 24;
}
.end-1400 {
grid-row-end: 25;
}
.end-1415 {
grid-row-end: 26;
}
.end-1430 {
grid-row-end: 27;
}
.end-1445 {
grid-row-end: 28;
}
.end-1500 {
grid-row-end: 29;
}
.end-1515 {
grid-row-end: 30;
}
.end-1530 {
grid-row-end: 31;
}
.end-1545 {
grid-row-end: 32;
}
.end-1600 {
grid-row-end: 33;
}
.end-1615 {
grid-row-end: 34;
}
.end-1630 {
grid-row-end: 35;
}
.end-1645 {
grid-row-end: 36;
}
.end-1700 {
grid-row-end: 37;
}
.end-1715 {
grid-row-end: 38;
}
.end-1730 {
grid-row-end: 39;
}
.end-1745 {
grid-row-end: 40;
}
.end-1800 {
grid-row-end: 41;
}
.end-1815 {
grid-row-end: 42;
}
.end-1830 {
grid-row-end: 43;
}
.end-1845 {
grid-row-end: 44;
}
.end-1900 {
grid-row-end: 45;
}
/*# sourceMappingURL=cal.css.map */ /*# sourceMappingURL=cal.css.map */

View File

@ -1 +1 @@
{"version":3,"sourceRoot":"","sources":["cal.scss"],"names":[],"mappings":"AAAA;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGF;EACE;EACA;EACA;EACA;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;EACA;EACA;;;AAGF;EACE;EACA;EACA;EACA;;;AAIF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAKF;EACE;EACA;;;AAGF;EACE;EACA;EACA;EACA;EACA;;;AAGF;AAAA;EAEE;;;AAKF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;EACA;;;AAGF;EACE;EACA;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;EAEE;EACA;EACA;;;AAGF;EACE;;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;;;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;;;AAGJ;EACI;EACA;EACA;;;AASJ;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;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

@ -1,13 +1,17 @@
:root { :root {
--numDays: 5; --numDays: 5;
--numHours: 10; --numHours: 13;
--numHalfHours: 23;
--numQuartHours: 45;
--timeHeight: 60px; --timeHeight: 60px;
--calBgColor: #fff1f8; --halfTimeHeight: 30px;
--eventBorderColor: #f2d3d8; --quartTimeHeight: 15px;
--eventColor1: #ffd6d1; --calBgColor: #3f2d2d;
--eventBorderColor: #000000;
--eventColor1: #b82424;
--eventColor2: #fafaa3; --eventColor2: #fafaa3;
--eventColor3: #e2f8ff; --eventColor3: #1894bb;
--eventColor4: #d1ffe6; --eventColor4: rgba(184, 36, 36, 0.65);
} }
.calendar { .calendar {
@ -17,9 +21,86 @@
margin: 2rem; margin: 2rem;
} }
select {
width: 100%;
height: 40px;
border-radius: 5px;
color: white;
border-color: transparent;
background-color: var(--calBgColor);
text-align: center;
}
.userbuttons {
width: 90%;
position: absolute;
display: flex;
justify-content: end;
}
.changeweek {
font-size: 2.5em;
text-decoration: none;
font-weight: 600;
color: white;
}
.changeweek:hover {
color: transparent;
-webkit-text-fill-color: transparent;
-webkit-text-stroke: 3px white;
}
h2 {
font-weight: 300;
margin: 5px;
}
.headerblock {
display: flex;
justify-content: space-between;
padding-right: 20%;
padding-left: 20%;
}
.customheader {
display: flex;
justify-content: space-evenly;
}
button {
border-radius: 5px;
border-color: white;
color: white;
border-style: solid;
background: transparent;
font-weight: 600;
width: 30px;
height: 30px;
margin: 2px;
line-height: 25px;
}
button:hover{
cursor: pointer;
}
.plusbutton {
font-size: 1.5em
}
form {
margin-top: 5px;
}
option {
width: 300px;
font-size: 1rem;
}
.timeline { .timeline {
display: grid; display: grid;
grid-template-rows: repeat(var(--numHours), var(--timeHeight)); grid-template-rows: repeat(12, 58px);
} }
.days { .days {
@ -28,56 +109,33 @@
gap: 5px; gap: 5px;
grid-template-columns: repeat(auto-fit, minmax(150px, 1fr)); grid-template-columns: repeat(auto-fit, minmax(150px, 1fr));
} }
.events { .events {
display: grid; display: grid;
grid-template-rows: repeat(var(--numHours), var(--timeHeight)); grid-template-rows: repeat(var(--numQuartHours), var(--quartTimeHeight));
border-radius: 5px; border-radius: 5px;
color: black;
background: var(--calBgColor); background: var(--calBgColor);
} }
// Place on Timeline
.start-1000 {
grid-row-start: 2;
}
.start-1200 {
grid-row-start: 4;
}
.start-1300 {
grid-row-start: 5;
}
.start-1400 {
grid-row-start: 6;
}
.end-1200 {
grid-row-end: 4;
}
.end-1300 {
grid-row-end: 5;
}
.end-1500 {
grid-row-end: 7;
}
.end-1600 {
grid-row-end: 8;
}
.end-1700 {
grid-row-end: 9;
}
// Events // Events
.title { .title {
width: 70%;
font-weight: 600; font-weight: 600;
margin-bottom: 0.25rem; margin-top: 0px;
margin-bottom: 0px;
}
.room,
.time {
display: block;
margin-top: 0px;
margin-bottom: 0px;
}
.room {
width: 70%;
} }
.event { .event {
@ -85,38 +143,26 @@
border-radius: 5px; border-radius: 5px;
padding: 0.5rem; padding: 0.5rem;
margin: 0 0.5rem; margin: 0 0.5rem;
background: white; color: white;
background: var(--eventColor4);
position: relative;
} }
.space, .space,
.date { .date {
height: 60px height: 100px
} }
// Global / Etc // Global / Etc
body { body {
font-family: system-ui, sans-serif; font-family: "Asap", "Calibri", "Arial", sans-serif;
} color: white;
background-color: black;
.corp-fi {
background: var(--eventColor1);
}
.ent-law {
background: var(--eventColor2);
}
.writing {
background: var(--eventColor3);
}
.securities {
background: var(--eventColor4);
} }
.date { .date {
display: flex; margin-bottom: 1em;
gap: 1em; gap: 1em;
} }
@ -130,4 +176,532 @@ body {
display: inline; display: inline;
font-size: 3rem; font-size: 3rem;
font-weight: 100; font-weight: 100;
} }
// Navbar
.cs1 {
margin-left: 220px;
padding: 20px;
}
nav ul {
list-style-type: none;
margin: 0;
padding: 0;
width: 200px;
background-color: #333;
position: fixed;
top: 0;
left: 0;
height: 100%;
overflow-y: auto;
font-size: 150%;
}
nav li {
border-top: none;
}
nav li.top {
border-style: solid;
border-radius: 5px;
border-color: white;
margin: 10px;
text-align: center;
}
nav a.top:hover {
background: transparent;
}
nav li.start a {
border-top: 3px solid white;
margin-top: 20px;
padding-top: 30px;
}
nav a.selected {
color: red;
background-color: black
}
nav li.top.selected {
border-color: red;
}
nav li a {
display: block;
color: white;
padding: 12px 16px;
text-decoration: none;
}
nav li a:hover {
background-color: red;
}
nav li .bottom {
position: absolute;
bottom: 0;
width: 200px;
}
// Place on Timeline
// Generated by genstarts.py
.start-0100 {
grid-row-start: 1
}
.start-0115 {
grid-row-start: 1
}
.start-0130 {
grid-row-start: 1
}
.start-0145 {
grid-row-start: 1
}
.start-0200 {
grid-row-start: 1
}
.start-0215 {
grid-row-start: 1
}
.start-0230 {
grid-row-start: 1
}
.start-0245 {
grid-row-start: 1
}
.start-0300 {
grid-row-start: 1
}
.start-0315 {
grid-row-start: 1
}
.start-0330 {
grid-row-start: 1
}
.start-0345 {
grid-row-start: 1
}
.start-0400 {
grid-row-start: 1
}
.start-0415 {
grid-row-start: 1
}
.start-0430 {
grid-row-start: 1
}
.start-0445 {
grid-row-start: 1
}
.start-0500 {
grid-row-start: 1
}
.start-0515 {
grid-row-start: 1
}
.start-0530 {
grid-row-start: 1
}
.start-0545 {
grid-row-start: 1
}
.start-0600 {
grid-row-start: 1
}
.start-0615 {
grid-row-start: 1
}
.start-0630 {
grid-row-start: 1
}
.start-0645 {
grid-row-start: 1
}
.start-0700 {
grid-row-start: 1
}
.start-0715 {
grid-row-start: 1
}
.start-0730 {
grid-row-start: 1
}
.start-0745 {
grid-row-start: 1
}
.end-0100 {
grid-row-end: 4
}
.end-0115 {
grid-row-end: 4
}
.end-0130 {
grid-row-end: 4
}
.end-0145 {
grid-row-end: 4
}
.end-0200 {
grid-row-end: 4
}
.end-0215 {
grid-row-end: 4
}
.end-0230 {
grid-row-end: 4
}
.end-0245 {
grid-row-end: 4
}
.end-0300 {
grid-row-end: 4
}
.end-0315 {
grid-row-end: 4
}
.end-0330 {
grid-row-end: 4
}
.end-0345 {
grid-row-end: 4
}
.end-0400 {
grid-row-end: 4
}
.end-0415 {
grid-row-end: 4
}
.end-0430 {
grid-row-end: 4
}
.end-0445 {
grid-row-end: 4
}
.end-0500 {
grid-row-end: 4
}
.end-0515 {
grid-row-end: 4
}
.end-0530 {
grid-row-end: 4
}
.end-0545 {
grid-row-end: 4
}
.end-0600 {
grid-row-end: 4
}
.end-0615 {
grid-row-end: 4
}
.end-0630 {
grid-row-end: 4
}
.end-0645 {
grid-row-end: 4
}
.end-0700 {
grid-row-end: 4
}
.end-0715 {
grid-row-end: 4
}
.end-0730 {
grid-row-end: 4
}
.end-0745 {
grid-row-end: 4
}
.start-0800 {
grid-row-start: 1
}
.start-0815 {
grid-row-start: 2
}
.start-0830 {
grid-row-start: 3
}
.start-0845 {
grid-row-start: 4
}
.start-0900 {
grid-row-start: 5
}
.start-0915 {
grid-row-start: 6
}
.start-0930 {
grid-row-start: 7
}
.start-0945 {
grid-row-start: 8
}
.start-1000 {
grid-row-start: 9
}
.start-1015 {
grid-row-start: 10
}
.start-1030 {
grid-row-start: 11
}
.start-1045 {
grid-row-start: 12
}
.start-1100 {
grid-row-start: 13
}
.start-1115 {
grid-row-start: 14
}
.start-1130 {
grid-row-start: 15
}
.start-1145 {
grid-row-start: 16
}
.start-1200 {
grid-row-start: 17
}
.start-1215 {
grid-row-start: 18
}
.start-1230 {
grid-row-start: 19
}
.start-1245 {
grid-row-start: 20
}
.start-1300 {
grid-row-start: 21
}
.start-1315 {
grid-row-start: 22
}
.start-1330 {
grid-row-start: 23
}
.start-1345 {
grid-row-start: 24
}
.start-1400 {
grid-row-start: 25
}
.start-1415 {
grid-row-start: 26
}
.start-1430 {
grid-row-start: 27
}
.start-1445 {
grid-row-start: 28
}
.start-1500 {
grid-row-start: 29
}
.start-1515 {
grid-row-start: 30
}
.start-1530 {
grid-row-start: 31
}
.start-1545 {
grid-row-start: 32
}
.start-1600 {
grid-row-start: 33
}
.start-1615 {
grid-row-start: 34
}
.start-1630 {
grid-row-start: 35
}
.start-1645 {
grid-row-start: 36
}
.start-1700 {
grid-row-start: 37
}
.start-1715 {
grid-row-start: 38
}
.start-1730 {
grid-row-start: 39
}
.start-1745 {
grid-row-start: 40
}
.start-1800 {
grid-row-start: 41
}
.start-1815 {
grid-row-start: 42
}
.start-1830 {
grid-row-start: 43
}
.start-1845 {
grid-row-start: 44
}
.start-1900 {
grid-row-start: 45
}
.end-0800 {
grid-row-end: 1
}
.end-0815 {
grid-row-end: 2
}
.end-0830 {
grid-row-end: 3
}
.end-0845 {
grid-row-end: 4
}
.end-0900 {
grid-row-end: 5
}
.end-0915 {
grid-row-end: 6
}
.end-0930 {
grid-row-end: 7
}
.end-0945 {
grid-row-end: 8
}
.end-1000 {
grid-row-end: 9
}
.end-1015 {
grid-row-end: 10
}
.end-1030 {
grid-row-end: 11
}
.end-1045 {
grid-row-end: 12
}
.end-1100 {
grid-row-end: 13
}
.end-1115 {
grid-row-end: 14
}
.end-1130 {
grid-row-end: 15
}
.end-1145 {
grid-row-end: 16
}
.end-1200 {
grid-row-end: 17
}
.end-1215 {
grid-row-end: 18
}
.end-1230 {
grid-row-end: 19
}
.end-1245 {
grid-row-end: 20
}
.end-1300 {
grid-row-end: 21
}
.end-1315 {
grid-row-end: 22
}
.end-1330 {
grid-row-end: 23
}
.end-1345 {
grid-row-end: 24
}
.end-1400 {
grid-row-end: 25
}
.end-1415 {
grid-row-end: 26
}
.end-1430 {
grid-row-end: 27
}
.end-1445 {
grid-row-end: 28
}
.end-1500 {
grid-row-end: 29
}
.end-1515 {
grid-row-end: 30
}
.end-1530 {
grid-row-end: 31
}
.end-1545 {
grid-row-end: 32
}
.end-1600 {
grid-row-end: 33
}
.end-1615 {
grid-row-end: 34
}
.end-1630 {
grid-row-end: 35
}
.end-1645 {
grid-row-end: 36
}
.end-1700 {
grid-row-end: 37
}
.end-1715 {
grid-row-end: 38
}
.end-1730 {
grid-row-end: 39
}
.end-1745 {
grid-row-end: 40
}
.end-1800 {
grid-row-end: 41
}
.end-1815 {
grid-row-end: 42
}
.end-1830 {
grid-row-end: 43
}
.end-1845 {
grid-row-end: 44
}
.end-1900 {
grid-row-end: 45
}

View File

@ -1,107 +1,140 @@
body :root {
{ --numBoxes: 2;
background-color: #1d1919; --numRows: 2;
font-size: 150%; }
font-family: "Asap","Calibri", "Arial";
color: #fff1f1; body {
animation-name: HG; background-color: black;
animation-duration: 20s; font-family: "Asap", "Calibri", "Arial", sans-serif;
animation-iteration-count: infinite font-size: 150%;
} margin: 0;
color: white;
input { }
width: 150px;
height: 50px nav ul {
} list-style-type: none;
margin: 0;
input[type=url], input[type=email], input[type=password] { padding: 0;
width: 500px; width: 200px;
} background-color: #333;
position: fixed;
select { top: 0;
width: 200px; left: 0;
height: 50px height: 100%;
} overflow-y: auto;
}
.cs
{ nav li {
border-top: none;
position: absolute; }
top: 38%;
left:12%; nav li.top {
margin: 0; border-style: solid;
width: 75%; border-radius: 5px;
/*border: 3px solid red;*/ border-color: white;
} margin: 10px;
text-align: center;
.cs h1, .cs h2, .cs form }
{
display: flex; nav a.top:hover {
text-align: center; background: transparent;
display: flex; }
justify-content: center;
align-items: center; nav li.start a {
height: 200%; border-top: 3px solid white;
/*border: 3px solid green;*/ margin-top: 20px;
} padding-top: 30px;
h1 }
{
text-align: center; nav a.selected {
font-weight: bold; color: red;
font-family: "Asap","Calibri","Arial"; }
font-size: 300%;
color: #e7dbdb; nav li.top.selected {
} border-color: red;
}
h2
{ nav li a.selected {
font-size: 100%; background-color: black;
position: sticky; }
bottom: 0;
text-align: left; nav li a {
} display: block;
color: white;
p padding: 12px 16px;
{ text-decoration: none;
line-height: 150%; }
}
nav li a:hover {
a:link background-color: red;
{ }
font-style: italic;
text-decoration: none; nav li .bottom {
font-weight: bolder; position: absolute;
color: #adadad bottom: 0;
} width: 200px;
}
a:visited
{ .cs1 {
color: #9e9393; margin-left: 220px;
} padding: 20px;
}
a:hover
{ .cs {
color: #726868; display: flex;
font-size: 105%; justify-content: center;
transition: font-size 100ms ease-in; align-items: center;
} flex-direction: column;
padding: 20px;
a, img }
{
transition: 100ms ease-out .container {
} display: flex;
flex-direction: column;
img }
{
width: 30%; /* Reihen */
height: auto .row {
} display: flex;
justify-content: space-evenly;
img:hover margin-bottom: 10px;
{ }
width: 32%;
height: auto; .box {
opacity: 75%; width: calc(100% / var(--numBoxes));
transition: 100ms ease-in; height: 300px;
} border: 5px solid red;
margin: 7px;
border-radius: 10px;
}
.box:hover {
transform: scale(101%);
}
.cs1 h1 {
margin-left: 0;
}
.notification-icon {
position: fixed;
top: 10px;
right: 10px;
width: 50px;
}
input {
width: 150px;
height: 50px;
}
input[type=url], input[type=email], input[type=password] {
width: 500px;
}
select {
width: 200px;
height: 50px;
}
/*# sourceMappingURL=style.css.map */

1
static/style.css.map Normal file
View File

@ -0,0 +1 @@
{"version":3,"sourceRoot":"","sources":["style.scss"],"names":[],"mappings":"AAAA;EACI;EACA;;;AAGJ;EACI;EACA;EACA;EACA;EACA;;;AAGJ;EACI;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;;;AAGJ;EACI;;;AAGJ;EACI;;;AAGJ;EACI;EACA;EACA;EACA;;;AAGJ;EACI;;;AAGJ;EACI;EACA;EACA;;;AAGJ;EACI;EACA;;;AAGJ;EACI;EACA;EACA;EACA;EACA;;;AAIJ;EACI;EACA;;;AAGJ;AACA;EACI;EACA;EACA;;;AAGJ;EACI;EACA;EACA;EACA;EACA;;;AAGJ;EACI;;;AAGJ;EACI;;;AAGJ;EACI;EACA;EACA;EACH;;;AAKD;EACI;EACA;;;AAGJ;EACI;;;AAGJ;EACI;EACA","file":"style.css"}

141
static/style.scss Normal file
View File

@ -0,0 +1,141 @@
:root {
--numBoxes: 2;
--numRows: 2;
}
body {
background-color: black;
font-family: "Asap", "Calibri", "Arial", sans-serif;
font-size: 150%;
margin: 0;
color: white;
}
nav ul {
list-style-type: none;
margin: 0;
padding: 0;
width: 200px;
background-color: #333;
position: fixed;
top: 0;
left: 0;
height: 100%;
overflow-y: auto;
}
nav li {
border-top: none;
}
nav li.top {
border-style: solid;
border-radius: 5px;
border-color: white;
margin: 10px;
text-align: center;
}
nav a.top:hover {
background: transparent;
}
nav li.start a {
border-top: 3px solid white;
margin-top: 20px;
padding-top: 30px;
}
nav a.selected {
color: red;
}
nav li.top.selected {
border-color: red;
}
nav li a.selected {
background-color: black;
}
nav li a {
display: block;
color: white;
padding: 12px 16px;
text-decoration: none;
}
nav li a:hover {
background-color: red;
}
nav li .bottom {
position: absolute;
bottom: 0;
width: 200px;
}
.cs1 {
margin-left: 220px;
padding: 20px;
}
.cs {
display: flex;
justify-content: center;
align-items: center;
flex-direction: column;
padding: 20px;
}
.container {
display: flex;
flex-direction: column;
}
/* Reihen */
.row {
display: flex;
justify-content: space-evenly;
margin-bottom: 10px;
}
.box {
width: calc(100%/var(--numBoxes));
height: 300px;
border: 5px solid red;
margin: 7px;
border-radius: 10px;
}
.box:hover {
transform: scale(101%);
}
.cs1 h1 {
margin-left: 0;
}
.notification-icon {
position: fixed;
top: 10px;
right: 10px;
width:50px;
}
input {
width: 150px;
height: 50px
}
input[type=url], input[type=email], input[type=password] {
width: 500px;
}
select {
width: 200px;
height: 50px
}

57
templates/dashboard.html Normal file
View File

@ -0,0 +1,57 @@
{% extends "index.html" %}
{% block content %}
<div class="cs">
<h1> Willkommen, {{ name }} ({{ kurs }})!</h1>
</div>
{% if praxis == "hidden" %}
<div class="container">
<div class="row">
<div class="box">
<div class="cs">
<h2>Aktueller GPA</h2>
</div>
</div>
<div class="box">
<div class="cs">
<h2>Countdown bis zur nächsten Klausur</h2>
</div>
</div>
</div>
<div class="row">
<div class="box">
<div class="cs">
<h2>Lernplan</h2>
</div>
</div>
<div class="box">
<div class="cs">
<h2>Nächste Vorlesung</h2>
</div>
</div>
<div class="box">
<div class="cs">
<h2>Neueste Chatnachricht</h2>
</div>
</div>
</div>
</div>
{% else %}
<div class="container">
<div class="row">
<div class="box">
<div class="cs">
<h2>ToDos</h2>
</div>
</div>
<div class="box">
<div class="cs">
<h2>Literatursammlung</h2>
</div>
</div>
</div>
</div>
{% endif %}
{% endblock %}

View File

@ -0,0 +1,4 @@
{% extends "index.html" %}
{% block content %}
<h2>{{ message }}</h2>
{% endblock %}

View File

@ -1,16 +1,38 @@
<!DOCTYPE html> <!DOCTYPE html>
<html lang="de"> <html lang="de">
<head> <head>
<title> {{headermessage}} 👀</title> <title>DualHub</title>
<link rel="stylesheet" type="text/css" href="{{ url_for('static', filename='style.css') }}"> <link rel="stylesheet" type="text/css" href={{ url_for("static", filename="style.css") }}>
<script async src="https://analytics.paulmartin.cloud/script.js" data-website-id="459fa66e-e255-4393-8e89-ead8b1572d0d"></script>
</head>
<body>
<nav>
<ul>
{% if theorie=="hidden" and praxis=="hidden" %}
<li class="top"><a class="top" href={{ url_for("welcome", sel="theorie") }}>Theorie</a></li>
<li class="top"><a class="top" href={{ url_for("welcome", sel="praxis") }}>Praxis</a></li>
{% elif theorie == "hidden" %}
<li class="top"><a class="top" href={{ url_for("welcome", sel="theorie") }}>Theorie</a></li>
<li class="top selected"><a class="top selected" href={{ url_for("welcome", sel="praxis") }}>Praxis</a></li>
{% else %}
<li class="top selected"><a class="top selected" href={{ url_for("welcome", sel="theorie") }}>Theorie</a></li>
<li class="top"><a class="top" href={{ url_for("welcome", sel="praxis") }}>Praxis</a></li>
{% endif %}
<li {{ theorie }}><a {% if s == "n" %} class="selected" {% endif %} href={{ url_for("displayNoten") }}>Noten</a></li>
<li {{ theorie }}><a {% if s == "p" %} class="selected" {% endif %} href={{ url_for("displayRapla") }}>Stundenplan</a></li>
<li {{ praxis }}><a {% if s == "t" %} class="selected" {% endif %} href="">To Dos</a></li>
<li><a {% if s == "s" %} class="selected" {% endif %} href={{ url_for("redKurs") }}>Konfiguration</a></li>
{% if request.endpoint %}
{% if request.endpoint[:7] != "login" %}
<li><a class="bottom" href={{ url_for("logout") }}>Log-Out</a></li>
{% endif %}
{% endif %}
</ul>
</nav>
<script async src="https://analytics.paulmartin.cloud/script.js" data-website-id="459fa66e-e255-4393-8e89-ead8b1572d0d"></script> <div class="cs1">
{% block content %}
{% endblock %}
</head> </div>
<body> </body>
<div class="cs">
<h1>{{message}}</h1>
</div>
</body>
</html> </html>

View File

@ -1,22 +1,18 @@
<!DOCTYPE html> {% extends "index.html" %}
<html lang="en"> {% block content %}
<head>
<meta charset="UTF-8">
<title>Kurs wählen</title>
<link rel="stylesheet" type="text/css" href="{{ url_for('static', filename='style.css') }}">
<script async src="https://analytics.paulmartin.cloud/script.js" data-website-id="459fa66e-e255-4393-8e89-ead8b1572d0d"></script>
</head>
<body>
{% if not detected[1] %} {% if not detected[1] %}
<h1>Wir haben {{ detected[0] }} als deinen Kurs ermittelt. Falls er nicht stimmt, kannst du ihn unten auswählen.</h1> <h1>Wir haben {{ detected[0] }} als deinen Kurs ermittelt. Falls er nicht stimmt, kannst du ihn unten auswählen.</h1>
<form action={{ url_for("getSemester") }}> {% if not request.args.get("next") %}
<input type="submit" value="Der Kurs stimmt!"> <form action={{ url_for("getSemester") }}>
{% else %}
<form action={{ request.args.get("next") }}>
{% endif %}
<input type="submit" value="Der Kurs stimmt!">
</form> </form>
{% else %} {% else %}
<h1>Dein Kurs konnte leider nicht ermittelt werden. Klicke den Button, um direkt zur Auswahl zu kommen.</h1> <h1>Dein Kurs konnte leider nicht ermittelt werden. Klicke den Button, um direkt zur Auswahl zu kommen.</h1>
{% endif %} {% endif %}
<form action={{ url_for("chooseRaplas") }}> <form action={{ url_for("chooseRaplas", next=request.args.get("next")) }}>
<input type="submit" value="Manuell auswählen!"> <input type="submit" value="Manuell auswählen!">
</form> </form>
</body> {% endblock %}
</html>

View File

@ -1,22 +1,15 @@
<!DOCTYPE html> {% extends "index.html" %}
<html lang="de"> {% block content %}
<head> <div class="cs">
<title> Log In 👀</title> <h1>Einloggen</h1>
<link rel="stylesheet" type="text/css" href="{{ url_for('static', filename='style.css') }}"> </div>
<div class="cs">
<script async src="https://analytics.paulmartin.cloud/script.js" data-website-id="459fa66e-e255-4393-8e89-ead8b1572d0d"></script> <form method="post" action={{ url_for ("login_post", next=request.args.get("next")) }}>
<label for="email" >Dualis-Email: </label>
<input class="input" type="email" name="email" placeholder="Email-Adresse" autofocus="">
</head> <label for="password">Dualis-Passwort:</label>
<body> <input class="input" type="password" name="password" placeholder="Passwort">
<div class="cs"> <button class="button">Login</button>
<form method="post" action={{ url_for ("login_post", next=request.args.get("next")) }}> </form>
<label for="email" >Dualis-Email: </label> </div>
<input class="input" type="email" name="email" placeholder="Email-Adresse" autofocus=""> {% endblock %}
<label for="password">Dualis-Passwort:</label>
<input class="input" type="password" name="password" placeholder="Passwort">
<button class="button">Login</button>
</form>
</div>
</body>
</html>

View File

@ -1,15 +1,17 @@
<!DOCTYPE html> {% extends "index.html" %}
<html lang="en"> {% block content %}
<head> {% for i in range (semester|length) %}
<meta charset="UTF-8"> {% if semester[i][1]==sel %}
<title>Noten</title> <h1>Deine Noten im {{ semester[i][0] }}</h1>
<link rel="stylesheet" type="text/css" href="{{ url_for('static', filename='style.css') }}"> {% endif %}
<script async src="https://analytics.paulmartin.cloud/script.js" data-website-id="459fa66e-e255-4393-8e89-ead8b1572d0d"></script> {% endfor %}
</head> <br>
<body> <br>
{% for i in noten %} {% for i in noten %}
<h2>{{ i[0] }}: {{ i[1].capitalize() }} (Credits: {{ i[2] }})</h2> <h2>{{ i[0] }}: {{ i[1].capitalize() }} (Credits: {{ i[2] }})</h2>
{% endfor %} {% endfor %}
<br>
<br>
<form method="post" action={{ url_for ("setSemester", next=url_for("displayNoten")) }}> <form method="post" action={{ url_for ("setSemester", next=url_for("displayNoten")) }}>
<label for="sem">Semester wählen! </label> <label for="sem">Semester wählen! </label>
<select name="sem" id="sem"> <select name="sem" id="sem">
@ -19,5 +21,4 @@
</select> </select>
<input type="submit" value="Semester setzen!"> <input type="submit" value="Semester setzen!">
</form> </form>
</body> {% endblock %}
</html>

View File

@ -1,57 +1,9 @@
<!DOCTYPE html> {% extends "plan-general.html"%}
<html lang="de"> {% block loginout %}
<head> <li><a class="bottom" href={{ url_for("login") }}>Log-In</a></li>
<meta charset="UTF-8"> {% endblock %}
<title>Vorlesungsplan</title> {% block startcontent %}
<link rel="stylesheet" type="text/css" href="{{ url_for('static', filename='cal.css') }}"> <h2>Vorlesungsplan {{ kurs }}</h2>
</head> {% endblock %}
<body> {% block endcontent %}
<div class="calendar"> {% endblock %}
<div class="timeline">
<div class="spacer"></div>
<div class="time-marker">08</div>
<div class="time-marker">09</div>
<div class="time-marker">10</div>
<div class="time-marker">11</div>
<div class="time-marker">12</div>
<div class="time-marker">13</div>
<div class="time-marker">14</div>
<div class="time-marker">15</div>
<div class="time-marker">16</div>
<div class="time-marker">17</div>
<div class="time-marker">18</div>
<div class="time-marker">19</div>
</div>
<div class="days">
{% for e in range (eventdays|length) %}
<div class="day {{ eventdays[e]["short"] }}">
<div class="date">
<p class="date-num">{{ eventdays[e]["day"] }}</p>
<p class="date-day">{{ eventdays[e]["long"] }}</p>
<form>
{% for n in eventdays [e]["mensa"] %}
<p class="mensa"> {{ n }}</p>
{% endfor %}
</form>
</div>
<div class="events">
{% for i in events %}
{% if i["weekday"] == e %}
<div class="event start-{{ i["start"][:2]+i["start"][3:] }} end-{{ i["end"][:2]+i["end"][3:]}}">
<p class="title">{{ i["name"] }}</p>
<p class="room">{{ i["room"] }}</p>
<p class="duration">{{ i["dur"] }}</p>
<p class="time">{{ i["start"] }} - {{ i["end"] }}</p>
</div>
{% endif %}
{% endfor %}
</div>
</div>
{% endfor %}
</div>
</div>
</div>
</div>
<a href={{ url_for("login") }}>Einloggen, um alle Features zu nutzen!</a>
</body>
</html>

View File

@ -3,9 +3,31 @@
<head> <head>
<meta charset="UTF-8"> <meta charset="UTF-8">
<title>Vorlesungsplan</title> <title>Vorlesungsplan</title>
<link rel<="s>tylesheet" type="text/css" href="{{ url_for('static', filename='cal.css') }}"> <link rel="stylesheet" type="text/css" href="{{ url_for('static', filename='cal.css') }}">
</head> </head>
<body> <body>
<nav>
<ul>
<li class="top selected"><a class="top selected" href={{ url_for("welcome", sel="theorie") }}>Theorie</a></li>
<li class="top"><a class="top" href={{ url_for("welcome", sel="praxis") }}>Praxis</a></li>
<li {{ theorie }}><a href={{ url_for("displayNoten") }}>Noten</a></li>
<li {{ theorie }}><a class="selected" href={{ url_for("displayRapla") }}>Stundenplan</a></li>
<li {{ praxis }}><a href={{ url_for("redKurs") }}>To Dos</a></li>
<li><a href={{ url_for("redKurs") }}>Konfiguration</a></li>
{% block loginout %}
{% endblock %}
</ul>
</nav>
<div class="cs1">
<div class="customheader">
{% block startcontent %}
{% endblock %}
</div>
<div class="headerblock">
<a href="?week={{prev}}" class="changeweek">🢐</a>
<a href="?today" class="changeweek">{{ mon }}</a>
<a href="?week={{next}}" class="changeweek">🢒</a>
</div>
<div class="calendar"> <div class="calendar">
<div class="timeline"> <div class="timeline">
<div class="spacer"></div> <div class="spacer"></div>
@ -22,26 +44,29 @@
<div class="time-marker">18</div> <div class="time-marker">18</div>
<div class="time-marker">19</div> <div class="time-marker">19</div>
</div> </div>
<div class="days"> <div class="days">
{% for e in range (eventdays|length) %} {% for e in range (eventdays|length) %}
<div class="day {{ eventdays[e]["short"] }}"> <div class="day {{ eventdays[e]["short"] }}">
<div class="date"> <div class="date">
<p class="date-num">{{ eventdays[e]["day"] }}</p> <p class="date-num">{{ eventdays[e]["day"] }}</p>
<p class="date-day">{{ eventdays[e]["long"] }}</p> <p class="date-day">{{ eventdays[e]["long"] }}</p>
<form> <form>
<select>
<option value="none" selected disabled> Mensa</option>
{% for n in eventdays [e]["mensa"] %} {% for n in eventdays [e]["mensa"] %}
<p class="mensa"> {{ n }}</p> <option class="mensa"> {{ n }}</option>
{% endfor %} {% endfor %}
</select>
</form> </form>
</div> </div>
<div class="events"> <div class="events">
{% for i in events %} {% for i in events %}
{% 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 %}
<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="duration">{{ i["dur"] }}</p> <p class="time">{{ i["start"] }} - {{ i["end"] }} ({{ i["dur"] }}h)</p>
<p class="time">{{ i["start"] }} - {{ i["end"] }}</p>
</div> </div>
{% endif %} {% endif %}
{% endfor %} {% endfor %}
@ -50,7 +75,8 @@
{% endfor %} {% endfor %}
</div> </div>
</div> </div>
</div> {% block endcontent %}
</div> {% endblock %}
</div>
</body> </body>
</html> </html>

15
templates/plan-user.html Normal file
View File

@ -0,0 +1,15 @@
{% extends "plan-general.html" %}
{% block loginout %}
<li><a class="bottom" href={{ url_for("logout") }}>Log-Out</a></li>
{% endblock %}
{% block startcontent %}
<h2>{{ name }}s Vorlesungsplan</h2>
{% endblock %}
{% block event %}
<div class="userbuttons">
<button>👁</button>
<button class="plusbutton">+</button>
</div>
{% endblock %}
{% block endcontent %}
{% endblock %}

View File

@ -1,11 +1,5 @@
<!DOCTYPE html> {% extends "index.html" %}
<html lang="de"> {% block content %}
<head>
<title> RAPLA importieren 👀</title>
<link rel="stylesheet" type="text/css" href="{{ url_for('static', filename='style.css') }}">
<script async src="https://analytics.paulmartin.cloud/script.js" data-website-id="459fa66e-e255-4393-8e89-ead8b1572d0d"></script>
</head>
<body>
<h1>Verfügbare Raplas </h1> <h1>Verfügbare Raplas </h1>
<form method="post" action={{ url_for ("getRapla") }}> <form method="post" action={{ url_for ("getRapla") }}>
<label for="file">Vefügbaren RAPLA wählen! </label> <label for="file">Vefügbaren RAPLA wählen! </label>
@ -20,9 +14,8 @@
</form> </form>
<h1>Eigenen Rapla hinzufügen</h1> <h1>Eigenen Rapla hinzufügen</h1>
<form method="post" action={{ url_for ("getRapla") }}> <form method="post" action={{ url_for ("getRapla") }}>
<label for="url">Rapla-URL eingeben, falls Du deinen Kurs nicht siehst:</label> <label for="url">Rapla-URL eingeben, falls Du Deinen Kurs nicht siehst:</label>
<input type="url" name="url" id="url"> <input type="url" name="url" id="url">
<input type="submit" value="Importieren!"> <input type="submit" value="Importieren!">
</form> </form>
</body> {% endblock %}
</html>

View File

@ -1,14 +1,7 @@
<!DOCTYPE html> {% extends "index.html" %}
<html lang="en"> {% block content %}
<head>
<meta charset="UTF-8">
<title>Semester wählen</title>
<link rel="stylesheet" type="text/css" href="{{ url_for('static', filename='style.css') }}">
<script async src="https://analytics.paulmartin.cloud/script.js" data-website-id="459fa66e-e255-4393-8e89-ead8b1572d0d"></script>
</head>
<body>
<h1>Bitte wähle aus der unten stehenden Liste das Semester, dessen Noten du sehen möchtest.</h1> <h1>Bitte wähle aus der unten stehenden Liste das Semester, dessen Noten du sehen möchtest.</h1>
<form method="post" action={{ url_for ("setSemester") }}> <form method="post" action={{ url_for ("setSemester", next=request.args.get("next")) }}>
<label for="sem">Semester wählen! </label> <label for="sem">Semester wählen! </label>
<select name="sem" id="sem"> <select name="sem" id="sem">
<option value = "none" selected disabled hidden></option> <option value = "none" selected disabled hidden></option>
@ -18,5 +11,4 @@
</select> </select>
<input type="submit" value="Semester setzen!"> <input type="submit" value="Semester setzen!">
</form> </form>
</body> {% endblock %}
</html>

16
templates/testpages.html Normal file
View File

@ -0,0 +1,16 @@
<!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>

97
testpages.py Normal file
View File

@ -0,0 +1,97 @@
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)