From c2917aa3fea1a2c26c765ffe55bdf88513448a8a Mon Sep 17 00:00:00 2001 From: Mo8it Date: Thu, 10 Jun 2021 03:14:30 +0200 Subject: [PATCH] Added persistent semester filters --- advlabdb/modelViews.py | 39 ++++++++++++++++++++++++++++++++++++++- advlabdb/models.py | 1 + advlabdb/routes.py | 4 ++-- advlabdb/utils.py | 1 - 4 files changed, 41 insertions(+), 4 deletions(-) diff --git a/advlabdb/modelViews.py b/advlabdb/modelViews.py index d6aa8cf..21f1f6a 100644 --- a/advlabdb/modelViews.py +++ b/advlabdb/modelViews.py @@ -4,6 +4,7 @@ from flask_admin.menu import MenuLink from flask_security import current_user, hash_password from wtforms import BooleanField, SelectField, TextField from wtforms.validators import DataRequired, Email +from sqlalchemy import func from advlabdb import admin, app, db, user_datastore from advlabdb.configUtils import getConfig @@ -146,6 +147,16 @@ class PartModelView(SecureModelView): partLabels = getConfig("partLabels") form_choices = {"label": list(zip(partLabels, partLabels))} + def get_query(self): + return super().get_query().filter(Part.id.in_([part.id for part in userActiveSemester().parts])) + + def get_count_query(self): + return ( + self.session.query(func.count("*")) + .select_from(self.model) + .filter(Part.id.in_([part.id for part in userActiveSemester().parts])) + ) + class StudentModelView(SecureModelView): can_view_details = True @@ -171,24 +182,30 @@ class StudentModelView(SecureModelView): if request.method == "POST": partLabel = form.new_part_student_part.data groupNumber = form.new_part_student_group_number.data + if (partLabel != self.partChoices[0] and groupNumber == "") or ( partLabel == self.partChoices[0] and groupNumber != "" ): flash("You have to assign both part and group if you want to add a part student!", "danger") return False + if partLabel != self.partChoices[0] and not partFromLabelInUserActiveSemester(partLabel): flash(f"Part {partLabel} is not created in {str(userActiveSemester())} yet!", "danger") return False + if groupNumber != "": message = "The group number has to be an integer > 0 !" + try: groupNumber = int(groupNumber) - except: + except Exception: flash(message, "danger") return False + if groupNumber < 1: flash(message, "danger") return False + return super().validate_form(form) def after_model_change(self, form, model, is_created): @@ -246,6 +263,16 @@ class PartStudentModelView(SecureModelView): form_excluded_columns = ["experiment_marks"] + def get_query(self): + return super().get_query().filter(PartStudent.part_id.in_([part.id for part in userActiveSemester().parts])) + + def get_count_query(self): + return ( + self.session.query(func.count("*")) + .select_from(self.model) + .filter(PartStudent.part_id.in_([part.id for part in userActiveSemester().parts])) + ) + class GroupModelView(SecureModelView): partLabels = getConfig("partLabels") @@ -264,6 +291,16 @@ class GroupModelView(SecureModelView): return False return super().validate_form(form) + def get_query(self): + return super().get_query().filter(Group.part_id.in_([part.id for part in userActiveSemester().parts])) + + def get_count_query(self): + return ( + self.session.query(func.count("*")) + .select_from(self.model) + .filter(Group.part_id.in_([part.id for part in userActiveSemester().parts])) + ) + admin.add_view(StudentModelView(Student, db.session)) admin.add_view(PartStudentModelView(PartStudent, db.session)) diff --git a/advlabdb/models.py b/advlabdb/models.py index 16b5d5b..2116b7c 100644 --- a/advlabdb/models.py +++ b/advlabdb/models.py @@ -7,6 +7,7 @@ https://flask-sqlalchemy.palletsprojects.com/en/2.x/models/ """ # Imports +from flask import flash from flask_security.models.fsqla_v2 import FsRoleMixin, FsUserMixin # Importing the database instance diff --git a/advlabdb/routes.py b/advlabdb/routes.py index 397c2c7..3792669 100644 --- a/advlabdb/routes.py +++ b/advlabdb/routes.py @@ -1,7 +1,7 @@ -from flask import flash, redirect, render_template, request, url_for +from flask import redirect, render_template, request, url_for from flask_security import auth_required, current_user -from advlabdb import app, db +from advlabdb import app from advlabdb.models import Semester from advlabdb.utils import setActiveSemester, titleToTemplate, userActiveSemester diff --git a/advlabdb/utils.py b/advlabdb/utils.py index 124556e..6acdb12 100644 --- a/advlabdb/utils.py +++ b/advlabdb/utils.py @@ -104,7 +104,6 @@ def partFromLabelInUserActiveSemester(partLabel): def setActiveSemester(semesterId): try: current_user.active_semester_id = Semester.query.get(int(semesterId)).id - print(Semester.query.get(int(semesterId))) except Exception as err: flash(str(err)) return False