From b9621345d7d4affdbac10f673c45b9d63749960e Mon Sep 17 00:00:00 2001 From: Mo8it Date: Fri, 30 Jul 2021 23:50:10 +0200 Subject: [PATCH] Added Appointment and ExperimentMark views in assistantSpace --- advlabdb/adminModelViews.py | 10 ++--- advlabdb/assistantModelViews.py | 77 +++++++++++++++++++++++++-------- advlabdb/models.py | 6 --- 3 files changed, 64 insertions(+), 29 deletions(-) diff --git a/advlabdb/adminModelViews.py b/advlabdb/adminModelViews.py index e9d9808..50af5ed 100644 --- a/advlabdb/adminModelViews.py +++ b/advlabdb/adminModelViews.py @@ -572,13 +572,11 @@ class AppointmentView(SecureAdminModelView): ) def update_model(self, form, model): + if not form.date or not form.special: # For editables + return super().update_model(form, model) + try: - if not form.date: - model.customUpdateSpecial(form.special.data) - elif not form.special: - model.customUpdateDate(form.date.data) - else: - model.customUpdate(form.date.data, form.special.data, form.assistant.data, form.group_experiment.data) + model.customUpdate(form.date.data, form.special.data, form.assistant.data, form.group_experiment.data) self.on_model_change(form, model, False) self.session.commit() diff --git a/advlabdb/assistantModelViews.py b/advlabdb/assistantModelViews.py index d9b941b..e00b443 100644 --- a/advlabdb/assistantModelViews.py +++ b/advlabdb/assistantModelViews.py @@ -1,4 +1,10 @@ +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 @@ -22,32 +28,69 @@ from advlabdb.models import ( from advlabdb.utils import userActiveSemester -class AssistantGroupExperimentView(SecureAssistantModelView): +class AssistantAppointmentView(SecureAssistantModelView): + can_export = False + can_set_page_size = False + can_create = False - can_edit = False can_delete = False + can_edit = False column_display_actions = False - column_list = ["group", "semester_experiment", "appointments", "experiment_marks"] - column_filters = ["group", "semester_experiment.experiment", "appointments"] + column_list = ["date", "special", "group_experiment"] + column_editable_list = ["date", "special"] - def queryFilter1(self): - return GroupExperiment.group.has(Group.semester == userActiveSemester()) - - def queryFilter2(self): - return GroupExperiment.semester_experiment.has( - SemesterExperiment.assistants.any(Assistant.user == current_user) + def queryFilter(self): + return and_( + Appointment.group_experiment.has( + GroupExperiment.semester_experiment.has(SemesterExperiment.semester == userActiveSemester()) + ), + Appointment.assistant == current_user.assistant, ) - def get_query(self): - return super().get_query().filter(self.queryFilter1()).filter(self.queryFilter2()) - def get_count_query(self): - return super().get_count_query().filter(self.queryFilter1()).filter(self.queryFilter2()) +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( - AssistantGroupExperimentView( - GroupExperiment, db.session, endpoint="assistant_groupexperiment", url="groupexperiment" - ) + AssistantAppointmentView(Appointment, db.session, endpoint="assistant_appointment", url="appointment") +) +assistantSpace.add_view( + AssistantExperimentMarkView(ExperimentMark, db.session, endpoint="assistant_experimentmark", url="experimentmark") ) diff --git a/advlabdb/models.py b/advlabdb/models.py index e6f5cac..125b8eb 100644 --- a/advlabdb/models.py +++ b/advlabdb/models.py @@ -313,12 +313,6 @@ class Appointment(db.Model): self.assistant = assistant self.group_experiment = group_experiment - def customUpdateDate(self, date): - self.date = date - - def customUpdateSpecial(self, special): - self.special = special - def repr(self): return f"{self.date} {self.group_experiment.repr()}"