diff --git a/advlabdb/modelViews.py b/advlabdb/modelViews.py index 10af424..662bdc3 100644 --- a/advlabdb/modelViews.py +++ b/advlabdb/modelViews.py @@ -3,7 +3,7 @@ from flask_admin.contrib.sqla.filters import BaseSQLAFilter from flask_admin.menu import MenuLink from flask_admin.model.template import EndpointLinkRowAction from flask_security import current_user, hash_password, admin_change_password -from sqlalchemy import func +from sqlalchemy import func, or_ from wtforms import Form, BooleanField, SelectField, TextField, RadioField from wtforms.validators import DataRequired, Email, Optional, URL from flask_admin.contrib.sqla.fields import QuerySelectMultipleField, QuerySelectField @@ -297,17 +297,28 @@ class PartStudentView(SecureModelView): return super().update_model(form, model) -def partStudentsQueryFactory(): +def partStudentQueryFactory(): return PartStudent.query.filter(PartStudent.part_id.in_([part.id for part in userActiveSemester().parts])) class GroupView(SecureModelView): - class CreateForm(Form): - part_students = QuerySelectMultipleField( - "Part Students", query_factory=partStudentsQueryFactory, validators=[DataRequired()] - ) + def formFactory(create, group): + if create: - form = CreateForm + def query_factory(): + return partStudentQueryFactory().filter(PartStudent.group == None) + + else: + + def query_factory(): + return partStudentQueryFactory().filter(or_(PartStudent.group == None, PartStudent.group == group)) + + class CustomForm(Form): + part_students = QuerySelectMultipleField( + "Part Students", query_factory=query_factory, validators=[DataRequired()] + ) + + return CustomForm column_list = ["number", "semester", "program", "part_students", "group_experiments"] column_filters = ["number", "semester", "program"] @@ -338,6 +349,14 @@ class GroupView(SecureModelView): else: return super().update_model(form, model) + def create_form(self, obj=None): + form = GroupView.formFactory(create=True, group=None) + return form(get_form_data(), obj=obj) + + def edit_form(self, obj=None): + form = GroupView.formFactory(create=False, group=obj) + return form(get_form_data(), obj=obj) + class ExperimentView(SecureModelView): can_view_details = True @@ -623,7 +642,7 @@ class ExperimentMarkView(SecureModelView): class CreateForm(Form): part_student = QuerySelectField( "Part Student", - query_factory=partStudentsQueryFactory, + query_factory=partStudentQueryFactory, validators=[DataRequired()], allow_blank=True, blank_text="-",