From 15a9c24cf307aa127d6a33dc16729967a6432fa1 Mon Sep 17 00:00:00 2001 From: Mo8it Date: Sat, 17 Apr 2021 02:19:38 +0200 Subject: [PATCH] Added button to register and deactivate users, made rows in tables selectable and fixed redirect for set_semester --- advlabdb/forms.py | 2 +- advlabdb/routes.py | 76 +++++++++++++++++++++++----------- advlabdb/templates/layout.html | 1 + advlabdb/templates/users.html | 20 +++++++++ advlabdb/utils.py | 13 +++--- 5 files changed, 81 insertions(+), 31 deletions(-) diff --git a/advlabdb/forms.py b/advlabdb/forms.py index b0dfbdf..bc47534 100644 --- a/advlabdb/forms.py +++ b/advlabdb/forms.py @@ -8,7 +8,7 @@ class RegistrationForm(FlaskForm): email = StringField("Email", validators=[DataRequired(), Email()]) admin = BooleanField("Admin") - submit = SubmitField("Sign Up") + submit = SubmitField("Register") def validate_email(self, email): user = User.query.filter_by(email=email.data.lower()).first() diff --git a/advlabdb/routes.py b/advlabdb/routes.py index 78063fd..49afdd9 100644 --- a/advlabdb/routes.py +++ b/advlabdb/routes.py @@ -1,3 +1,4 @@ +import json from advlabdb import app, user_datastore from flask import render_template, request, url_for, flash, redirect, session from flask_security import auth_required, roles_required, hash_password, current_user @@ -22,8 +23,8 @@ def util_processor(): if "activeSemesterId" not in session: session["activeSemesterId"] = lastSemesterId elif session["activeSemesterId"] != lastSemesterId: - flash(f"Warning: You are in the old semester {Semester.query.get(session['activeSemesterId']).label}!", - "danger") + flash(f"You are in the old semester {Semester.query.get(session['activeSemesterId']).label}!", + "warning") return Semester.query.get(session["activeSemesterId"]).label def navbarItems(title): @@ -64,9 +65,7 @@ def util_processor(): @app.route("/") def index(): - title = "Index" - return render_template(titleToTemplate(title) + ".html", - title=title, + return render_template("index.html", ) @@ -188,31 +187,47 @@ def groups(): ) -@app.route("/users") +@app.route("/users", methods=["GET", "POST"]) @roles_required("admin") def users(): - headerAndDataList = [["Email", "row.email"], - ["Roles", "[role.name for role in row.roles]"], - ["Assistant", "row.assistant"]] + if request.method == 'POST': + if "registerUser" in request.form: + return redirect(url_for("register")) + else: + headerAndDataList = [["Email", "row.email"], + ["Roles", "[role.name for role in row.roles]"], + ["Assistant", "row.assistant"]] - table = makeTable(headerAndDataList=headerAndDataList, - rows=User.query.all()) + table = makeTable(headerAndDataList=headerAndDataList, + rows=User.query.filter(User.active == True).all(), + tableId="usersTab") - title = "Users" - return render_template(titleToTemplate(title) + ".html", - title=title, - table=table, - ) + title = "Users" + return render_template(titleToTemplate(title) + ".html", + title=title, + table=table, + ) -@app.route("/set_semester", methods=["GET"]) -@auth_required() -def set_semester(): - session["activeSemesterId"] = int(request.args.get("semester_id")) - title = "Index" - return render_template(titleToTemplate(title) + ".html", - title=title, - ) +@app.route("/deactivate_users", methods=["GET"]) +@roles_required("admin") +def deactivate_users(): + usersJson = json.loads(request.args.get("json")) + deactivatedUsersEmails = [] + for userJson in usersJson: + email = userJson["email"] + user = User.query.filter(User.email == email).first() + if user == current_user: + flash("You have tried to deactivate yourself as user!", "danger") + continue + if user_datastore.deactivate_user(user): + deactivatedUsersEmails.append(email) + db.session.commit() + if deactivatedUsersEmails == []: + flash(f"No users deactivated!", "warning") + else: + flash(f"Users with emails {deactivatedUsersEmails} deactivated!", "success") + return redirect(url_for("users")) @app.route("/semesters") @@ -231,6 +246,13 @@ def semesters(): ) +@app.route("/set_semester", methods=["GET"]) +@auth_required() +def set_semester(): + session["activeSemesterId"] = int(request.args.get("semester_id")) + return redirect(request.referrer) + + @app.route("/register", methods=["GET", "POST"]) def register(): form = RegistrationForm() @@ -241,7 +263,11 @@ def register(): email = form.email.data.lower() admin = form.admin.data - roles = ["assistant"] if not admin else ["admin"] + if admin: + roles = ["admin"] + flash("You have registered a new admin!", "danger") + else: + roles = ["assistant"] user_datastore.create_user(email=email, password=passwordHash, roles=roles) db.session.commit() diff --git a/advlabdb/templates/layout.html b/advlabdb/templates/layout.html index dd81bd6..b8e9c3b 100644 --- a/advlabdb/templates/layout.html +++ b/advlabdb/templates/layout.html @@ -76,5 +76,6 @@ + {% block scripts %}{% endblock scripts %} diff --git a/advlabdb/templates/users.html b/advlabdb/templates/users.html index 31810f8..289475d 100644 --- a/advlabdb/templates/users.html +++ b/advlabdb/templates/users.html @@ -2,5 +2,25 @@ {% block content %} {{table|safe}} +
+ +
+
+
+ +
{% endblock content %} + +{% block scripts %} + +{% endblock scripts %} diff --git a/advlabdb/utils.py b/advlabdb/utils.py index 6fbecdb..2168abf 100644 --- a/advlabdb/utils.py +++ b/advlabdb/utils.py @@ -1,7 +1,7 @@ from random import choice from string import digits, ascii_letters -def makeTable(headerAndDataList, rows): +def makeTable(headerAndDataList, rows, tableId="tab"): def cellString(cell): cell = str(cell) if cell == "[]": @@ -14,22 +14,25 @@ def makeTable(headerAndDataList, rows): return cell def td(cell): - return "" + cellString(cell) + "" + return '' + cellString(cell) + '' def th(cell): - return '' + cellString(cell) + '' + return '' + cellString(cell) + '' table = ''' -''' + +''' for i in headerAndDataList: table += th(i[0]) table += ''' @@ -37,7 +40,7 @@ data-export-types="['json', 'xml', 'csv', 'txt', 'sql', 'pdf']"> \n''' for row in rows: - table += '' + table += '' for i in headerAndDataList: table += td(eval(i[1]))