diff --git a/calendar_generation.py b/calendar_generation.py index 8248061..919b12b 100644 --- a/calendar_generation.py +++ b/calendar_generation.py @@ -6,6 +6,7 @@ import datetime import recurring_ical_events from fetchMENSA import getMeals import pytz +from init import * shortnames = ["mon", "tue", "wed", "thu", "fri", "sat"] longnames = ["Montag", "Dienstag", "Mittwoch", "Donnerstag", "Freitag", "Samstag"] @@ -78,11 +79,32 @@ async def getWeek(weekstart: datetime, file: str, showsat: bool): "weekday": estart.weekday(), "day": estart.day, "teacher": teacher, + "id": event["UID"] } eventl += [eventdict] return eventl, await MensaDayList(start_date, showsat), prevw, nextw, mon +async def createCustomCalendar (uid: int): + hiddenEvents = HiddenVL.query.filter_by(uid=uid).all() + hiddenEventIDs = {event.eventid for event in hiddenEvents} + kurs = User.query.filter_by(id=uid).first().kurs + raplaFile = Rapla.query.filter_by(name=kurs).first().file + with open(f"calendars/{raplaFile}") as f: + calendar = icalendar.Calendar.from_ical(f.read()) + newCalendar = icalendar.Calendar() + for component in calendar.walk(): + if component.name != "VEVENT": + if component.name != "VCALENDAR": + newCalendar.add_component(component) + elif component["UID"] not in hiddenEventIDs: + newCalendar.add_component(component) + byteText = newCalendar.to_ical() + with open(f"calendars/{uid}.ical", 'w+') as f: + f.write(byteText.decode("utf-8")) + return uid + + async def MensaDayList(weekstart: datetime, showsat: bool): """ Gibt die Essen einer Woche zurück. diff --git a/fetchDUALIS.py b/fetchDUALIS.py index 5c3f329..c31e27c 100644 --- a/fetchDUALIS.py +++ b/fetchDUALIS.py @@ -30,7 +30,7 @@ async def checkUser(email: str, password: str): content = (f"usrname={formattedEmail}&pass={formattedPassword}&ARGUMENTS=clino%2Cusrname%2Cpass%2C" f"menuno%2Cmenu_type%2Cbrowser%2Cplatform&APPNAME=CampusNet&PRGNAME=LOGINCHECK") response = await s.post(url=url, headers=headers, content=content) - header = response.headers + header = response.headers try: refresh = header["REFRESH"] arg = refresh.find("=-N") + 3 diff --git a/fetchRAPLA.py b/fetchRAPLA.py index 05bca3d..93a93cf 100644 --- a/fetchRAPLA.py +++ b/fetchRAPLA.py @@ -11,8 +11,8 @@ from dateutil.relativedelta import relativedelta from icalendar import Calendar, Event import json -from init import scheduler, flaskApp, Rapla, db - +from init import scheduler, flaskApp, Rapla, db, HiddenVL, User +from calendar_generation import createCustomCalendar async def fetchPlan(session, url): """ @@ -121,12 +121,18 @@ async def getNewRapla(url: str, testing=False): return url -def getIcal(kurs: str): +def getIcal(uid: int | None = None, kurs: str | None = None): """ - Liefert den Namen der Datei des mitgegebenen Kurses. + Liefert den Namen der Datei des mitgegebenen Users. + :param uid: :param kurs: :return str: """ + if uid: + if HiddenVL.query.filter_by(uid=uid).first(): + return f"{uid}.ical" + else: + kurs = User.query.filter_by(id=uid).first().kurs rapla = Rapla.query.filter(Rapla.name == kurs).first() try: return rapla.file @@ -164,6 +170,11 @@ async def refreshRapla(): for calendar in range(len(calendarList)): if calendarList[calendar] != 200: writeToFile(f"calendars/{fileList[calendar]}", calendarList[calendar]) + hiddenEvents = HiddenVL.query.all() + hiddenUsers = {event.uid for event in hiddenEvents} + for user in hiddenUsers: + uid = await createCustomCalendar(user) + print (f"Update custom calendar: {uid}") @scheduler.task('cron', id="raplaSchedule", hour='*', day_of_week='*', minute='*/3', week='*', second='40') diff --git a/init.py b/init.py index e78dd10..b1f19f3 100644 --- a/init.py +++ b/init.py @@ -87,6 +87,17 @@ class Rapla(db.Model): link = db.Column(db.String(255), unique=True) +class HiddenVL(db.Model): + """ + Datenbank-Modell für ausgeblendete Vorlesungen. + """ + __tablename__ = 'hiddenVL' + uid = db.Column(db.Integer, ForeignKey('dualis.uid', ondelete='CASCADE')) + eventid = db.Column(db.String(255)) + id = db.Column(db.String(255), primary_key=True) + name = db.Column(db.String(255)) + + class Meals(db.Model): """ Datenbank-Modell für Meals. diff --git a/routing.py b/routing.py index 2816a16..67db1c8 100644 --- a/routing.py +++ b/routing.py @@ -1,8 +1,9 @@ #!/usr/bin/env python3.6 from flask import make_response -from flask import render_template, url_for, redirect, request +from flask import render_template, url_for, redirect, request, send_from_directory from flask_login import (login_user as loginUser, login_required as loginRequired, logout_user as logoutUser, current_user as currentUser) +from sqlalchemy.exc import IntegrityError from werkzeug.exceptions import HTTPException import hashlib import datetime @@ -12,7 +13,7 @@ import fetchDUALIS import fetchRAPLA from requesthelpers import * from fetchRAPLA import * -from calendar_generation import getWeek +from calendar_generation import getWeek, createCustomCalendar from init import * @@ -87,18 +88,18 @@ def initRoutes(app: Flask): if not currentUser.kurs: return redirect(url_for("getKurs", next=url_for(request.endpoint))) week = request.args.get("week") - if week: + if week and week!="today": week = datetime.strptime(week, "%Y-%m-%d") else: week = "today" samstag = request.args.get("samstag") if not samstag: samstag = False - events = await getWeek(week, fetchRAPLA.getIcal(currentUser.kurs), samstag) + events = await getWeek(week, fetchRAPLA.getIcal(uid=currentUser.id), samstag) return render_template("plan-user.html", events=events[0], eventdays=events[1], - name=currentUser.name, prev=str(events[2])[:10], next=str(events[3])[:10], - mon=events[4], - s="p", praxis="hidden") + uid=currentUser.id, name=currentUser.name, prev=str(events[2])[:10], + next=str(events[3])[:10], mon=events[4], login=True, s="p", date=str(week)[:10], + praxis="hidden") @app.route("/plan/") async def displayPlan(kurs: str): @@ -119,17 +120,29 @@ def initRoutes(app: Flask): except AttributeError: pass kurs = kurs.upper() - plan = fetchRAPLA.getIcal(kurs) + plan = fetchRAPLA.getIcal(kurs=kurs) if plan: samstag = request.args.get("samstag") if not samstag: samstag = False events = await getWeek(week, plan, samstag) 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], praxis="hidden") + login=False, prev=str(events[2])[:10], next=str(events[3])[:10], + mon=events[4], praxis="hidden") else: return redirect(url_for("login")) + @app.route("/plan/restore") + @loginRequired + async def restoreVL(): + events = HiddenVL.query.filter_by(uid=currentUser.id).all() + return render_template("restore-events.html", events=events, praxis="hidden") + + @app.route("/plan/calendar/", methods=["GET"]) + async def deliverCalendar(uid: int): + calstring = fetchRAPLA.getIcal(uid=uid) + return send_from_directory("calendars", calstring, as_attachment=False) + @app.route("/set-up") def redKurs(): """ @@ -156,7 +169,7 @@ def initRoutes(app: Flask): if not currentUser.kurs: kurs = await fetchDUALIS.getKurs(dualisUser.token, cookie) if kurs != 0: - if not fetchRAPLA.getIcal(kurs): + if not fetchRAPLA.getIcal(kurs=kurs): return render_template('kurs.html', detected=(kurs, dualisError), s="s", theorie="hidden", praxis="hidden", file=False) currentUser.kurs = kurs @@ -251,6 +264,33 @@ def initRoutes(app: Flask): """ return render_template("login.html", theorie="hidden", praxis="hidden", s="s") + @app.route("/plan/delete", methods=["POST"]) + @loginRequired + async def removeEvent(): + day = request.args.get("day") + id = str(request.args.get("id")) + uid = currentUser.id + name = request.args.get("name") + idDB = HiddenVL(uid=uid, eventid=id, id=str(uid) + id, name=name) + db.session.add(idDB) + try: + db.session.commit() + except IntegrityError: + return redirect(url_for("displayRapla", week=day)) + await createCustomCalendar(currentUser.id) + return redirect(url_for("displayRapla", week=day)) + + @app.route("/plan/restore/event") + @loginRequired + async def restoreEvent(): + id = str(request.args.get("id")) + uid = currentUser.id + entry = HiddenVL.query.filter_by(id=str(uid) + id).first() + db.session.delete(entry) + db.session.commit() + await createCustomCalendar(currentUser.id) + return redirect(url_for("restoreVL")) + @app.route("/log-in", methods=["POST"]) async def login_post(): """ @@ -315,8 +355,9 @@ def initRoutes(app: Flask): logoutUser() redirection = make_response(redirect(url_for("login", code=1, next=url_for("welcome")))) redirection.set_cookie("cnsc", value="Logged out! Your temporary token " - "on our server and the cookie on your device have been deleted.", httponly=True, - secure=True) + "on our server and the cookie on your device have been deleted.", + httponly=True, + secure=True) return redirection @app.route("/error") diff --git a/static/cal.css b/static/cal.css index 0fc8525..f8065ee 100644 --- a/static/cal.css +++ b/static/cal.css @@ -68,6 +68,11 @@ h2 { justify-content: space-evenly; } +a { + color: white; + font-size: 100%; +} + button { border-radius: 5px; border-color: white; diff --git a/static/cal.css.map b/static/cal.css.map index b247b58..3b8cdab 100644 --- a/static/cal.css.map +++ b/static/cal.css.map @@ -1 +1 @@ -{"version":3,"sourceRoot":"","sources":["cal.scss"],"names":[],"mappings":"AAAA;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGF;EACE;EACA;EACA;EACA;;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGF;EACE;EACA;EACA;EACA;;;AAGF;EACE;EACA;EACA;EACA;;;AAGF;EACE;EACA;EACA;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;EACA;EACA;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;EACA;EACA;;;AAEF;EACE;EACA;EACA;EACA;EACA;;;AAMF;EACE;EACA;EACA;EACA;;;AAGF;AAAA;AAAA;EAGE;EACA;EACA;;;AAGF;EACE;;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGF;EACE;;;AAGF;AAAA;EAEE;;;AAKF;EACE;EACA;EACA;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;EACA;;;AAGF;EACE;EACA;EACA;;;AAKF;EACI;EACA;;;AAIJ;EACI;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGJ;EACI;;;AAGJ;EACI;EACA;EACA;EACA;EACA;;;AAGJ;EACI;;;AAGJ;EACI;EACA;EACA;;;AAGJ;EACI;EACA;;;AAGJ;EACI;;;AAIJ;EACI;EACA;EACA;EACA;;;AAGJ;EACI;EACA;;;AAGJ;EACI;EACA;EACA;;;AAGJ;EACI;;;AAGJ;EACI;EACA;EACA;;;AAGJ;EACI;EACA;;;AAGJ;EACE;;;AAQF;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAKA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAKA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAKA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA","file":"cal.css"} \ No newline at end of file +{"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;;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;EACA;EACA;;;AAEF;EACE;EACA;EACA;EACA;EACA;;;AAMF;EACE;EACA;EACA;EACA;;;AAGF;AAAA;AAAA;EAGE;EACA;EACA;;;AAGF;EACE;;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGF;EACE;;;AAGF;AAAA;EAEE;;;AAKF;EACE;EACA;EACA;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;EACA;;;AAGF;EACE;EACA;EACA;;;AAKF;EACI;EACA;;;AAIJ;EACI;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGJ;EACI;;;AAGJ;EACI;EACA;EACA;EACA;EACA;;;AAGJ;EACI;;;AAGJ;EACI;EACA;EACA;;;AAGJ;EACI;EACA;;;AAGJ;EACI;;;AAIJ;EACI;EACA;EACA;EACA;;;AAGJ;EACI;EACA;;;AAGJ;EACI;EACA;EACA;;;AAGJ;EACI;;;AAGJ;EACI;EACA;EACA;;;AAGJ;EACI;EACA;;;AAGJ;EACE;;;AAQF;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAKA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAKA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAKA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA;;;AAEA;EACA","file":"cal.css"} \ No newline at end of file diff --git a/static/cal.scss b/static/cal.scss index a46d57f..5ec013c 100644 --- a/static/cal.scss +++ b/static/cal.scss @@ -68,6 +68,11 @@ h2 { justify-content: space-evenly; } +a { + color: white; + font-size: 100%; +} + button { border-radius: 5px; border-color: white; diff --git a/static/style.css b/static/style.css index 857a183..5868d91 100644 --- a/static/style.css +++ b/static/style.css @@ -89,6 +89,11 @@ nav li .bottom { padding: 20px; } +a { + color: white; + font-size: 110%; +} + .container { display: flex; flex-direction: column; diff --git a/static/style.css.map b/static/style.css.map index 16d7c80..ddc44b7 100644 --- a/static/style.css.map +++ b/static/style.css.map @@ -1 +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;EACA;;;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;;;AAGD;EACI;;;AAGJ;EACI;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGJ;EACI;EACA;;;AAGJ;EACE;;;AAGF;EACI;EACA;;;AAGJ;EACI;;;AAGJ;EACI;EACA","file":"style.css"} \ No newline at end of file +{"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;EACA;;;AAGJ;EACI;EACA;EACA;;;AAGJ;EACI;EACA;;;AAGJ;EACI;EACA;EACA;EACA;EACA;;;AAGJ;EACI;EACA;;;AAIJ;EACI;EACA;;;AAGJ;AACA;EACI;EACA;EACA;;;AAGJ;EACI;EACA;EACA;EACA;EACA;;;AAGJ;EACI;;;AAGJ;EACI;;;AAGJ;EACI;EACA;EACA;EACH;;;AAGD;EACI;;;AAGJ;EACI;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGJ;EACI;EACA;;;AAGJ;EACE;;;AAGF;EACI;EACA;;;AAGJ;EACI;;;AAGJ;EACI;EACA","file":"style.css"} \ No newline at end of file diff --git a/static/style.scss b/static/style.scss index 112ea7b..c466185 100644 --- a/static/style.scss +++ b/static/style.scss @@ -89,6 +89,11 @@ nav li .bottom { padding: 20px; } +a { + color: white; + font-size: 110%; +} + .container { display: flex; diff --git a/templates/plan-general.html b/templates/plan-general.html index 96be0ce..c913cb7 100644 --- a/templates/plan-general.html +++ b/templates/plan-general.html @@ -62,15 +62,26 @@
{% for i in events %} {% if i["weekday"] == e %} -
- {% block event %} {% endblock %} -

{{ i["name"] }}

-

{{ i["room"] }}

- {% for teacher in i["teacher"] %} -

{{ teacher }}

- {% endfor %} -

{{ i["start"] }} - {{ i["end"] }} ({{ i["dur"] }}h)

-
+ {% with event=i %} +
+ {% if login %} +
+
+ +
+
+ +
+
+ {% endif %} +

{{ event["name"] }}

+

{{ event["room"] }}

+ {% for teacher in event["teacher"] %} +

{{ teacher }}

+ {% endfor %} +

{{ event["start"] }} - {{ event["end"] }} ({{ event["dur"] }}h)

+
+ {% endwith %} {% endif %} {% endfor %}
diff --git a/templates/plan-user.html b/templates/plan-user.html index 3c83f01..51140af 100644 --- a/templates/plan-user.html +++ b/templates/plan-user.html @@ -5,11 +5,8 @@ {% block startcontent %}

{{ name }}s Vorlesungsplan

{% endblock %} -{% block event %} -
- - -
-{% endblock %} {% block endcontent %} + Kalender-Abo +
+ Ausgeblendete Vorlesungen wieder einblenden {% endblock %} \ No newline at end of file diff --git a/templates/restore-events.html b/templates/restore-events.html new file mode 100644 index 0000000..600986f --- /dev/null +++ b/templates/restore-events.html @@ -0,0 +1,12 @@ +{% extends "index.html" %} +{% block content %} +

Ausgeblendete Vorlesungen

+{% for event in events %} +
  • + {{ event.name }} +
  • +{% endfor %} +{% if events | length == 0 %} + Zurück zum Stundenplan (keine ausgeblendeten Vorlesungen) +{% endif %} +{% endblock %} \ No newline at end of file