from flask import flash from flask_admin.contrib.sqla.fields import QuerySelectField, QuerySelectMultipleField from flask_security import current_user from sqlalchemy import and_ from wtforms import BooleanField, Form, RadioField, SelectField, TextField from wtforms.fields.html5 import DateField 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 initActiveSemesterMenuLinks, 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.semester_experiment.experiment", "group_experiment.group", "group_experiment.group.part_students", ] column_labels = { "group_experiment.semester_experiment.experiment": "Experiment", "group_experiment.group": "Group", "group_experiment.group.part_students": "Students", } column_editable_list = ["date"] 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_list = [ "oral_mark", "protocol_mark", "group_experiment.semester_experiment.experiment", "part_student.student.first_name", "part_student.student.last_name", "part_student.group", "part_student.student.uni_email", "part_student.student.contact_email", "part_student.part", "assistant", "edited_by_admin", ] column_labels = { "group_experiment.semester_experiment.experiment": "Experiment", "part_student.student.first_name": "First Name", "part_student.student.last_name": "Last Name", "part_student.group": "Group", "part_student.student.uni_email": "Uni Email", "part_student.student.contact_email": "Contact Email", "part_student.part": "Part", } column_descriptions = { "oral_mark": "Between 0 and 15", "protocol_mark": "Between 0 and 15", "part_student.student.contact_email": "The preferred contact email address if entered by the student", "assistant": "The assistant who assigned the mark", "edited_by_admin": "If the mark was edited by an admin", } 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") ) initActiveSemesterMenuLinks(assistantSpace)