From ffcbda905d5286a1c3e579675969ea90bb28d224 Mon Sep 17 00:00:00 2001 From: Mo8it Date: Sat, 24 Sep 2022 16:16:48 +0200 Subject: [PATCH] Add deactivate assistants action --- advlabdb/actions.py | 43 +++++++++++++++++++++++++++ advlabdb/adminModelViews.py | 23 +++++++++----- advlabdb/templates/actions.jinja.html | 15 ++++++++-- 3 files changed, 71 insertions(+), 10 deletions(-) create mode 100644 advlabdb/actions.py diff --git a/advlabdb/actions.py b/advlabdb/actions.py new file mode 100644 index 0000000..4ea7c1a --- /dev/null +++ b/advlabdb/actions.py @@ -0,0 +1,43 @@ +from flask import flash +from flask_login import current_user +from sqlalchemy import select + +from .models import Assistant, Semester, User, db + + +def update_final_experiment_and_part_marks(): + for semesterExperiment in current_user.active_semester.semester_experiments: + semesterExperiment.updateFinalExperimentAndPartMarks() + + flash("Manually updated all final experiment and part marks.", "success") + + +def deactivate_assistants(): + user_ids_to_deactivate = db.session.scalars( + select(Assistant.user_id) + .join(User) + .where(User.active == True) + .except_( + select(Assistant.user_id).join(Assistant.semester_experiments).join(Semester).where(Semester.done == False) + ) + ) + + no_users_deactivated = True + + try: + for user_id in user_ids_to_deactivate: + user = db.session.get(User, user_id) + user.active = False + + flash(f"User {user} deactivated!", "warning") + no_users_deactivated = False + + db.session.commit() + except Exception as ex: + flash(str(ex), "danger") + + db.session.rollback() + no_users_deactivated = True + + if no_users_deactivated: + flash("No users to deactivate.", "info") diff --git a/advlabdb/adminModelViews.py b/advlabdb/adminModelViews.py index ba0992f..36ad78a 100644 --- a/advlabdb/adminModelViews.py +++ b/advlabdb/adminModelViews.py @@ -32,6 +32,7 @@ from wtforms.validators import URL, DataRequired, Email, NumberRange, Optional from wtforms.widgets import NumberInput from . import data_dir, user_datastore +from .actions import deactivate_assistants, update_final_experiment_and_part_marks from .admin_link_formatters import ( admin_formatter, appointment_date_formatter, @@ -1343,8 +1344,15 @@ class ImportView(SecureAdminBaseView): class ActionsView(SecureAdminBaseView): class ActionsForm(FlaskForm): - manualUpdateFinalExperimentAndPartMarksSubmit = SubmitField( - label="Manually update final experiment and part marks", + update_final_experiment_and_part_marks = BooleanField( + label="Manually update all final experiment and part marks in the active semester", + ) + deactivate_assistants = BooleanField( + label="Deactivate assistants that do not have experiments in a semester that is not set as done", + ) + submit = SubmitField( + label="Submit", + render_kw={"class": "btn btn-primary btn-block"}, ) @expose("/", methods=("GET", "POST")) @@ -1352,13 +1360,12 @@ class ActionsView(SecureAdminBaseView): form = ActionsView.ActionsForm() if form.validate_on_submit(): - if form.manualUpdateFinalExperimentAndPartMarksSubmit.data: - for semesterExperiment in current_user.active_semester.semester_experiments: - semesterExperiment.updateFinalExperimentAndPartMarks() + if form.update_final_experiment_and_part_marks.data: + update_final_experiment_and_part_marks() + if form.deactivate_assistants.data: + deactivate_assistants() - flash("Manually updated all final experiment and part marks", "success") - - return redirect(url_for("main.index")) + return redirect(self.url) return self.render("actions.jinja.html", form=form) diff --git a/advlabdb/templates/actions.jinja.html b/advlabdb/templates/actions.jinja.html index 4d61545..2e82037 100644 --- a/advlabdb/templates/actions.jinja.html +++ b/advlabdb/templates/actions.jinja.html @@ -7,8 +7,19 @@
- {{ form.csrf_token }} - {{ form.manualUpdateFinalExperimentAndPartMarksSubmit }} + {% for field in form %} + {% if field.widget.input_type == "checkbox" %} +
+ {{ field(class="form-check-input") }} + + +
+ {% else %} + {{ field() }} + {% endif %} + {% endfor %}
{{ footer|safe }}