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:
parent
263ce65098
commit
15a9c24cf3
5 changed files with 81 additions and 31 deletions
|
@ -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()
|
||||||
|
|
|
@ -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,15 +187,20 @@ def groups():
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
@app.route("/users")
|
@app.route("/users", methods=["GET", "POST"])
|
||||||
@roles_required("admin")
|
@roles_required("admin")
|
||||||
def users():
|
def users():
|
||||||
|
if request.method == 'POST':
|
||||||
|
if "registerUser" in request.form:
|
||||||
|
return redirect(url_for("register"))
|
||||||
|
else:
|
||||||
headerAndDataList = [["Email", "row.email"],
|
headerAndDataList = [["Email", "row.email"],
|
||||||
["Roles", "[role.name for role in row.roles]"],
|
["Roles", "[role.name for role in row.roles]"],
|
||||||
["Assistant", "row.assistant"]]
|
["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",
|
||||||
|
@ -205,14 +209,25 @@ def users():
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
@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()
|
||||||
|
|
|
@ -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>
|
||||||
|
|
|
@ -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 %}
|
||||||
|
|
|
@ -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]))
|
||||||
|
|
Loading…
Reference in a new issue