from flask import flash from flask_security import current_user from wtforms import BooleanField, Form, RadioField, SelectField, TextField from wtforms.fields.html5 import DateField from flask_admin.contrib.sqla.fields import QuerySelectField, QuerySelectMultipleField from sqlalchemy import and_ from wtforms.validators import NumberRange from advlabdb import assistantSpace, db from advlabdb.customClasses import SecureAssistantModelView from advlabdb.exceptions import DataBaseException, ModelViewException from advlabdb.models import ( Appointment, Assistant, Experiment, ExperimentMark, Group, GroupExperiment, Part, PartStudent, Program, Role, Semester, SemesterExperiment, Student, User, ) from advlabdb.utils import userActiveSemester class AssistantAppointmentView(SecureAssistantModelView): can_export = False can_set_page_size = False can_create = False can_delete = False can_edit = False column_display_actions = False column_list = ["date", "special", "group_experiment"] column_editable_list = ["date", "special"] def queryFilter(self): return and_( Appointment.group_experiment.has( GroupExperiment.semester_experiment.has(SemesterExperiment.semester == userActiveSemester()) ), Appointment.assistant == current_user.assistant, ) class AssistantExperimentMarkView(SecureAssistantModelView): can_export = False can_set_page_size = False can_create = False can_delete = False can_edit = False column_display_actions = False column_editable_list = ["oral_mark", "protocol_mark"] form_args = { "oral_mark": {"validators": [NumberRange(0, 15)]}, "protocol_mark": {"validators": [NumberRange(0, 15)]}, } column_default_sort = [("oral_mark", False), ("protocol_mark", False)] def queryFilter(self): return ExperimentMark.group_experiment.has( GroupExperiment.semester_experiment.has( and_( SemesterExperiment.semester == userActiveSemester(), SemesterExperiment.assistants.any(Assistant.user == current_user), ) ) ) def after_model_change(self, form, model, is_created): if model.oral_mark or model.protocol_mark: try: model.assistant = current_user.assistant self.session.commit() except Exception as ex: flash(str(ex), "error") self.session.rollback() assistantSpace.add_view( AssistantAppointmentView(Appointment, db.session, endpoint="assistant_appointment", url="appointment") ) assistantSpace.add_view( AssistantExperimentMarkView(ExperimentMark, db.session, endpoint="assistant_experimentmark", url="experimentmark") )