1
0
Fork 0
mirror of https://codeberg.org/Mo8it/AdvLabDB.git synced 2024-09-19 18:31:16 +00:00

Added button to register and deactivate users, made rows in tables selectable and fixed redirect for set_semester

This commit is contained in:
Mo 2021-04-17 02:19:38 +02:00
parent 263ce65098
commit 15a9c24cf3
5 changed files with 81 additions and 31 deletions

View file

@ -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()

View file

@ -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,15 +187,20 @@ def groups():
)
@app.route("/users")
@app.route("/users", methods=["GET", "POST"])
@roles_required("admin")
def users():
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())
rows=User.query.filter(User.active == True).all(),
tableId="usersTab")
title = "Users"
return render_template(titleToTemplate(title) + ".html",
@ -205,14 +209,25 @@ def users():
)
@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()

View file

@ -76,5 +76,6 @@
<script src="https://cdn.jsdelivr.net/npm/tableexport.jquery.plugin@1.10.21/libs/jsPDF-AutoTable/jspdf.plugin.autotable.js" integrity="sha256-V3ovkrEpDyy74G52YBOG4TSBoC2sHkbbitBEp9/kZcY=" crossorigin="anonymous"></script>
<script src="https://cdn.jsdelivr.net/npm/tableexport.jquery.plugin@1.10.21/tableExport.min.js" integrity="sha256-/VfFIAF4GLBN7iah7RFGi+zISoczKczfQTP4Dh4N0uw=" crossorigin="anonymous"></script>
<script src="https://cdn.jsdelivr.net/npm/bootstrap-table@1.18.2/dist/extensions/export/bootstrap-table-export.min.js" integrity="sha256-C4hVBAtUi42+NXYGkjgx4WD7lGG205ZVtcHo6UMIge8=" crossorigin="anonymous"></script>
{% block scripts %}{% endblock scripts %}
</body>
</html>

View file

@ -2,5 +2,25 @@
{% block content %}
{{table|safe}}
<div>
<button id="deactivateUsersButton" class="btn btn-warning">Deactivate users</button>
</div>
<br>
<form method="post">
<button type="submit" name="registerUser" class="btn btn-primary">Register user</button>
</form>
{% endblock content %}
{% block scripts %}
<script>
var $table = $('#usersTab')
var $button = $('#deactivateUsersButton')
$(function() {
$button.click(function () {
window.location.href = '{{url_for("deactivate_users")}}?json=' + JSON.stringify($table.bootstrapTable('getSelections'))
})
})
</script>
{% endblock scripts %}

View file

@ -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 "<td>" + cellString(cell) + "</td>"
return '<td>' + cellString(cell) + '</td>'
def th(cell):
return '<th data-sortable="true">' + cellString(cell) + '</th>'
return '<th data-sortable="true" data-field="' + titleToTemplate(cell) + '">' + cellString(cell) + '</th>'
table = '''<table
id="''' + tableId + '''"
data-classes="table table-bordered table-striped"
data-toggle="table"
data-thead-classes="table-dark"
data-search="true"
data-show-toggle="true"
data-show-columns="true"
data-click-to-select="true"
data-show-export="true"
data-export-types="['json', 'xml', 'csv', 'txt', 'sql', 'pdf']">
<thead>
<tr>'''
<tr>
<th data-field="state" data-checkbox="true"></th>'''
for i in headerAndDataList:
table += th(i[0])
table += '''</tr>
@ -37,7 +40,7 @@ data-export-types="['json', 'xml', 'csv', 'txt', 'sql', 'pdf']">
<tbody>\n'''
for row in rows:
table += '<tr>'
table += '<tr><td></td>'
for i in headerAndDataList:
table += td(eval(i[1]))