diff --git a/DB.drawio b/DB.drawio index e20a472..eaabc3a 100644 --- a/DB.drawio +++ b/DB.drawio @@ -1 +1 @@ -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 \ No newline at end of file +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 \ No newline at end of file diff --git a/advlabdb/routes.py b/advlabdb/routes.py index a23b695..127ba78 100644 --- a/advlabdb/routes.py +++ b/advlabdb/routes.py @@ -1,4 +1,4 @@ -from flask import redirect, render_template, request, url_for +from flask import redirect, render_template, request, url_for, flash from flask_security import auth_required, current_user from advlabdb import app @@ -73,7 +73,12 @@ def index(): @app.route("/set_semester") @auth_required() def set_semester(): - setUserActiveSemester(request.args.get("semester_id")) - ref = request.referrer - red = ref if ref else url_for("index") + try: + semesterId = int(request.args.get("semester_id")) + except Exception as ex: + flash(str(ex), "error") + else: + setUserActiveSemester(semesterId) + + red = request.referrer or url_for("index") return redirect(red) diff --git a/advlabdb/utils.py b/advlabdb/utils.py index 2a78e4d..1c14fa5 100644 --- a/advlabdb/utils.py +++ b/advlabdb/utils.py @@ -102,11 +102,16 @@ def partFromLabelInUserActiveSemester(partLabel): def setUserActiveSemester(semesterId): - try: - current_user.active_semester_id = Semester.query.get(int(semesterId)).id - except Exception as err: - flash(str(err)) - return False - db.session.commit() - flash(f"Active semester changed to {Semester.query.get(semesterId).label}!", "warning") - return True + if current_user.active_semester_id != semesterId: + if Semester.query.get(semesterId): + try: + current_user.active_semester_id = semesterId + db.session.commit() + except Exception as ex: + flash(str(ex), "error") + + db.session.rollback() + else: + flash(f"Active semester changed to {Semester.query.get(semesterId).label}!", "warning") + else: + flash(f"No semester with ID {semesterId}!", "error")