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", email = StringField("Email",
validators=[DataRequired(), Email()]) validators=[DataRequired(), Email()])
admin = BooleanField("Admin") admin = BooleanField("Admin")
submit = SubmitField("Sign Up") submit = SubmitField("Register")
def validate_email(self, email): def validate_email(self, email):
user = User.query.filter_by(email=email.data.lower()).first() 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 advlabdb import app, user_datastore
from flask import render_template, request, url_for, flash, redirect, session from flask import render_template, request, url_for, flash, redirect, session
from flask_security import auth_required, roles_required, hash_password, current_user from flask_security import auth_required, roles_required, hash_password, current_user
@ -22,8 +23,8 @@ def util_processor():
if "activeSemesterId" not in session: if "activeSemesterId" not in session:
session["activeSemesterId"] = lastSemesterId session["activeSemesterId"] = lastSemesterId
elif session["activeSemesterId"] != lastSemesterId: elif session["activeSemesterId"] != lastSemesterId:
flash(f"Warning: You are in the old semester {Semester.query.get(session['activeSemesterId']).label}!", flash(f"You are in the old semester {Semester.query.get(session['activeSemesterId']).label}!",
"danger") "warning")
return Semester.query.get(session["activeSemesterId"]).label return Semester.query.get(session["activeSemesterId"]).label
def navbarItems(title): def navbarItems(title):
@ -64,9 +65,7 @@ def util_processor():
@app.route("/") @app.route("/")
def index(): def index():
title = "Index" return render_template("index.html",
return render_template(titleToTemplate(title) + ".html",
title=title,
) )
@ -188,31 +187,47 @@ def groups():
) )
@app.route("/users") @app.route("/users", methods=["GET", "POST"])
@roles_required("admin") @roles_required("admin")
def users(): def users():
headerAndDataList = [["Email", "row.email"], if request.method == 'POST':
["Roles", "[role.name for role in row.roles]"], if "registerUser" in request.form:
["Assistant", "row.assistant"]] 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, table = makeTable(headerAndDataList=headerAndDataList,
rows=User.query.all()) rows=User.query.filter(User.active == True).all(),
tableId="usersTab")
title = "Users" title = "Users"
return render_template(titleToTemplate(title) + ".html", return render_template(titleToTemplate(title) + ".html",
title=title, title=title,
table=table, table=table,
) )
@app.route("/set_semester", methods=["GET"]) @app.route("/deactivate_users", methods=["GET"])
@auth_required() @roles_required("admin")
def set_semester(): def deactivate_users():
session["activeSemesterId"] = int(request.args.get("semester_id")) usersJson = json.loads(request.args.get("json"))
title = "Index" deactivatedUsersEmails = []
return render_template(titleToTemplate(title) + ".html", for userJson in usersJson:
title=title, 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") @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"]) @app.route("/register", methods=["GET", "POST"])
def register(): def register():
form = RegistrationForm() form = RegistrationForm()
@ -241,7 +263,11 @@ def register():
email = form.email.data.lower() email = form.email.data.lower()
admin = form.admin.data 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) user_datastore.create_user(email=email, password=passwordHash, roles=roles)
db.session.commit() 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/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/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> <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> </body>
</html> </html>

View file

@ -2,5 +2,25 @@
{% block content %} {% block content %}
{{table|safe}} {{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 %} {% 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 random import choice
from string import digits, ascii_letters from string import digits, ascii_letters
def makeTable(headerAndDataList, rows): def makeTable(headerAndDataList, rows, tableId="tab"):
def cellString(cell): def cellString(cell):
cell = str(cell) cell = str(cell)
if cell == "[]": if cell == "[]":
@ -14,22 +14,25 @@ def makeTable(headerAndDataList, rows):
return cell return cell
def td(cell): def td(cell):
return "<td>" + cellString(cell) + "</td>" return '<td>' + cellString(cell) + '</td>'
def th(cell): 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 table = '''<table
id="''' + tableId + '''"
data-classes="table table-bordered table-striped" data-classes="table table-bordered table-striped"
data-toggle="table" data-toggle="table"
data-thead-classes="table-dark" data-thead-classes="table-dark"
data-search="true" data-search="true"
data-show-toggle="true" data-show-toggle="true"
data-show-columns="true" data-show-columns="true"
data-click-to-select="true"
data-show-export="true" data-show-export="true"
data-export-types="['json', 'xml', 'csv', 'txt', 'sql', 'pdf']"> data-export-types="['json', 'xml', 'csv', 'txt', 'sql', 'pdf']">
<thead> <thead>
<tr>''' <tr>
<th data-field="state" data-checkbox="true"></th>'''
for i in headerAndDataList: for i in headerAndDataList:
table += th(i[0]) table += th(i[0])
table += '''</tr> table += '''</tr>
@ -37,7 +40,7 @@ data-export-types="['json', 'xml', 'csv', 'txt', 'sql', 'pdf']">
<tbody>\n''' <tbody>\n'''
for row in rows: for row in rows:
table += '<tr>' table += '<tr><td></td>'
for i in headerAndDataList: for i in headerAndDataList:
table += td(eval(i[1])) table += td(eval(i[1]))