4 Commits

Author SHA1 Message Date
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
18 changed files with 468 additions and 258 deletions

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

@ -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")
@ -74,10 +88,11 @@ def displayRapla():
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-user.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]) 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
@ -102,14 +117,13 @@ def displayPlan(kurs):
if not samstag: if not samstag:
samstag = False samstag = False
events = getWeek(week, plan, samstag) events = getWeek(week, plan, samstag)
print(events)
return render_template("plan-anon.html", events=events[0], eventdays=events[1], kurs=kurs, 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]) 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.
@ -118,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():
""" """
@ -147,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():
""" """
@ -160,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():
""" """
@ -179,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():
""" """
@ -187,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():
""" """
@ -214,16 +228,16 @@ def getRapla():
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
@ -240,44 +254,29 @@ 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) 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))
else: if user:
user.password = generate_password_hash(password, method="pbkdf2:sha256") dualis = Dualis.query.filter_by(uid=user.id).first()
dualis.token = t[0] dualis.token = t[0]
newcookie = requesthelpers.getCookie(t[1].cookies) newcookie = requesthelpers.getCookie(t[1].cookies)
dualis.token_created = time.time() dualis.token_created = time.time()
db.session.commit() db.session.commit()
login_user(user) login_user(user)
if user.kurs: if user.kurs:
if not n: if not dualis.result_list:
success = make_response(redirect(url_for("getSemester")))
elif not n:
success = make_response(redirect(url_for("welcome"))) success = make_response(redirect(url_for("welcome")))
success.set_cookie("cnsc", value=newcookie, httponly=True, secure=True) success.set_cookie("cnsc", value=newcookie, httponly=True, secure=True)
return success
t = fetchDUALIS.checkUser(email, password)
if t[0] == -2:
return redirect(url_for("login", code=-2))
else:
hashid = int(hashlib.sha1(email.encode("utf-8")).hexdigest(), 16) % (10 ** 8) hashid = int(hashlib.sha1(email.encode("utf-8")).hexdigest(), 16) % (10 ** 8)
hashpw = generate_password_hash(password, method="pbkdf2:sha256")
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)
@ -286,12 +285,11 @@ def login_post():
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():
""" """

View File

@ -168,6 +168,77 @@ 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;
}
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.top.selected {
color: red;
background-color: black;
}
nav li.top.selected {
border-color: red;
}
nav li a.selected {
background-color: white;
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: 100%;
}
.start-0100 { .start-0100 {
grid-row-start: 1; grid-row-start: 1;
} }

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;;;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;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;EACA;EACA;;;AAEF;EACE;EACA;EACA;EACA;;;AAMF;EACE;EACA;EACA;EACA;;;AAGF;AAAA;EAEE;EACA;EACA;;;AAGF;EACE;;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;;;AAGF;AAAA;EAEE;;;AAKF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;EACA;;;AAGF;EACE;EACA;EACA;;;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;;;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;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;EACA;EACA;;;AAEF;EACE;EACA;EACA;EACA;;;AAMF;EACE;EACA;EACA;EACA;;;AAGF;AAAA;EAEE;EACA;EACA;;;AAGF;EACE;;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;;;AAGF;AAAA;EAEE;;;AAKF;EACE;;;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;;;AAGJ;EACI;;;AAGJ;EACI;EACA;EACA;EACA;EACA;;;AAGJ;EACI;;;AAGJ;EACI;EACA;EACA;;;AAGJ;EACI;EACF;;;AAGF;EACI;;;AAGJ;EACI;EACA;;;AAGJ;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

@ -172,6 +172,81 @@ body {
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;
}
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.top.selected {
color: red;
background-color: black
}
nav li.top.selected {
border-color: red;
}
nav li a.selected {
background-color: white;
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: 100%;
}
// Place on Timeline // Place on Timeline

View File

@ -1,17 +1,128 @@
body :root {
{ --numBoxes: 2;
background-color: #1d1919; --numRows: 2;
}
body {
background-color: black;
font-family: "Asap", "Calibri", "Arial", sans-serif;
font-size: 150%; font-size: 150%;
font-family: "Asap","Calibri", "Arial"; margin: 0;
color: #fff1f1; color: white;
animation-name: HG; }
animation-duration: 20s;
animation-iteration-count: infinite 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.top.selected {
color: red;
}
nav li.top.selected {
border-color: red;
}
nav li a.selected {
background-color: black;
color: white;
}
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: 100%;
}
.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: 5px;
border-radius: 10px;
}
.cs1 h1 {
margin-left: 0;
}
.notification-icon {
position: fixed;
top: 10px;
right: 10px;
width: 50px;
} }
input { input {
width: 150px; width: 150px;
height: 50px height: 50px;
} }
input[type=url], input[type=email], input[type=password] { input[type=url], input[type=email], input[type=password] {
@ -20,88 +131,7 @@ input[type=url], input[type=email], input[type=password] {
select { select {
width: 200px; width: 200px;
height: 50px height: 50px;
}
.cs
{
position: absolute;
top: 38%;
left:12%;
margin: 0;
width: 75%;
/*border: 3px solid red;*/
}
.cs h1, .cs h2, .cs form
{
display: flex;
text-align: center;
display: flex;
justify-content: center;
align-items: center;
height: 200%;
/*border: 3px solid green;*/
}
h1
{
text-align: center;
font-weight: bold;
font-family: "Asap","Calibri","Arial";
font-size: 300%;
color: #e7dbdb;
}
h2
{
font-size: 100%;
position: sticky;
bottom: 0;
text-align: left;
}
p
{
line-height: 150%;
}
a:link
{
font-style: italic;
text-decoration: none;
font-weight: bolder;
color: #adadad
}
a:visited
{
color: #9e9393;
}
a:hover
{
color: #726868;
font-size: 105%;
transition: font-size 100ms ease-in;
}
a, img
{
transition: 100ms ease-out
}
img
{
width: 30%;
height: auto
}
img:hover
{
width: 32%;
height: auto;
opacity: 75%;
transition: 100ms ease-in;
} }
/*# 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;EACA;;;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;;;AAIJ;EACI;;;AAGJ;EACI;EACA;EACA;EACH;;;AAKD;EACI;EACA;;;AAGJ;EACI;;;AAGJ;EACI;EACA","file":"style.css"}

22
templates/dashboard.html Normal file
View File

@ -0,0 +1,22 @@
{% extends "index.html" %}
{% block content %}
<div class="cs">
<h1> Willkommen, {{ name }} ({{ kurs }})!</h1>
</div>
<div class="container">
<div class="row">
<div class="box"></div>
<div class="box"></div>
</div>
<div class="row">
<div class="box"></div>
<div class="box"></div>
<div class="box"></div>
</div>
</div>
{% endblock %}

View File

@ -1,16 +1,36 @@
<!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> <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={{ url_for("redKurs") }}>To Dos</a></li>
<li><a {% if s == "s" %} class="selected" {% endif %} href={{ url_for("redKurs") }}>Konfiguration</a></li>
{% if request.endpoint[:7] != "login" %}
<li><a class="bottom" href={{ url_for("logout") }}>Log-Out</a></li>
{% endif %}
</ul>
</nav>
<div class="cs1">
</head> {% block content %}
<body> {% endblock %}
<div class="cs"> </div>
<h1>{{message}}</h1> </body>
</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>
{% if not request.args.get("next") %}
<form action={{ url_for("getSemester") }}> <form action={{ url_for("getSemester") }}>
{% else %}
<form action={{ request.args.get("next") }}>
{% endif %}
<input type="submit" value="Der Kurs stimmt!"> <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,14 +1,8 @@
<!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>
<script async src="https://analytics.paulmartin.cloud/script.js" data-website-id="459fa66e-e255-4393-8e89-ead8b1572d0d"></script>
</head>
<body>
<div class="cs"> <div class="cs">
<form method="post" action={{ url_for ("login_post", next=request.args.get("next")) }}> <form method="post" action={{ url_for ("login_post", next=request.args.get("next")) }}>
<label for="email" >Dualis-Email: </label> <label for="email" >Dualis-Email: </label>
@ -18,5 +12,4 @@
<button class="button">Login</button> <button class="button">Login</button>
</form> </form>
</div> </div>
</body> {% endblock %}
</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,4 +1,7 @@
{% extends "plan-general.html"%} {% extends "plan-general.html"%}
{% block loginout %}
<li><a class="bottom" href={{ url_for("login") }}>Log-In</a></li>
{% endblock %}
{% block startcontent %} {% block startcontent %}
<h2>Vorlesungsplan {{ kurs }}</h2> <h2>Vorlesungsplan {{ kurs }}</h2>
{% endblock %} {% endblock %}

View File

@ -6,6 +6,19 @@
<link rel="stylesheet" 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"> <div class="customheader">
{% block startcontent %} {% block startcontent %}
{% endblock %} {% endblock %}
@ -64,5 +77,6 @@
</div> </div>
{% block endcontent %} {% block endcontent %}
{% endblock %} {% endblock %}
</div>
</body> </body>
</html> </html>

View File

@ -1,4 +1,7 @@
{% extends "plan-general.html" %} {% extends "plan-general.html" %}
{% block loginout %}
<li><a class="bottom" href={{ url_for("logout") }}>Log-Out</a></li>
{% endblock %}
{% block startcontent %} {% block startcontent %}
<h2>{{ name }}s Vorlesungsplan</h2> <h2>{{ name }}s Vorlesungsplan</h2>
{% endblock %} {% endblock %}
@ -9,5 +12,4 @@
</div> </div>
{% endblock %} {% endblock %}
{% block endcontent %} {% block endcontent %}
<!-- Button zum Hinzufügen von Kommentaren -->
{% endblock %} {% 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>