mirror of
https://codeberg.org/Mo8it/AdvLabDB.git
synced 2025-04-16 21:03:42 +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:
parent
263ce65098
commit
15a9c24cf3
5 changed files with 81 additions and 31 deletions
advlabdb
|
@ -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()
|
||||
|
|
|
@ -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()
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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 %}
|
||||
|
|
|
@ -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]))
|
||||
|
|
Loading…
Add table
Reference in a new issue