1
0
Fork 0
mirror of https://codeberg.org/Mo8it/AdvLabDB.git synced 2024-11-08 21:21:06 +00:00
AdvLabDB/advlabdb/assistantModelViews.py

140 lines
4.4 KiB
Python

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)