From 5212eb8ee6ddb885c7e8bf56498253506512a10b Mon Sep 17 00:00:00 2001 From: Mo8it Date: Thu, 1 Jul 2021 19:43:59 +0200 Subject: [PATCH] Added create_model to GroupExperiment --- README.md | 1 + advlabdb/modelViews.py | 51 +++++++++++++++++++++++++++++++++++++++--- advlabdb/models.py | 9 +++++--- testDB.py | 4 ++-- 4 files changed, 57 insertions(+), 8 deletions(-) diff --git a/README.md b/README.md index f97ce05..97197c4 100644 --- a/README.md +++ b/README.md @@ -52,6 +52,7 @@ This URL leads to the home page where you can login with this testing admin acco # To-Do: - Rest of admin model views - Assistants space +- Deactivate assistants account after a while if not assigned to experiments - Homepage text changeable - Email integration? - 2FA? diff --git a/advlabdb/modelViews.py b/advlabdb/modelViews.py index d3ce28d..dfe3d43 100644 --- a/advlabdb/modelViews.py +++ b/advlabdb/modelViews.py @@ -160,7 +160,7 @@ class SemesterView(SecureModelView): setUserActiveSemester(model.id) if form.transfer_parts.data: - model.transferParts(oldSemester) + model.transferPartsFrom(oldSemester) if form.transfer_semester_experiments.data: try: @@ -403,7 +403,7 @@ class GroupExperimentView(SecureModelView): assistantBlankText = "Auto assign if experiment has only one assistant" - appointment1 = DateField("Appointment-1") + appointment1_date = DateField("Appointment-1 Date", validators=[Optional()]) appointment1_special = BooleanField("Appointment-1 special", default=False) appointment1_assistant = QuerySelectField( "Appointment-1 Assistant", @@ -412,7 +412,7 @@ class GroupExperimentView(SecureModelView): blank_text=assistantBlankText, ) - appointment2 = DateField("Appointment-2") + appointment2_date = DateField("Appointment-2 Date", validators=[Optional()]) appointment2_special = BooleanField("Appointment-2 special", default=False) appointment2_assistant = QuerySelectField( "Appointment-2 Assistant", @@ -427,6 +427,50 @@ class GroupExperimentView(SecureModelView): column_list = ["group", "semester_experiment", "appointments", "experiment_marks"] column_filters = ["group", "semester_experiment.experiment", "appointments"] + def create_model(self, form): + try: + model = GroupExperiment(semester_experiment=form.semester_experiment.data, group=form.group.data) + + self.session.add(model) + + for appointmentDate, special, assistant in zip( + [form.appointment1_date.data, form.appointment2_date.data], + [form.appointment1_special.data, form.appointment2_special.data], + [form.appointment1_assistant.data, form.appointment2_assistant.data], + ): + if appointmentDate: + if assistant: + if assistant not in form.semester_experiment.data.assistants: + raise Exception(f"{assistant} not responsible for {form.semester_experiment.data}!") + else: + if len(form.semester_experiment.data.assistants) != 1: + raise Exception( + f"Experiment {form.semester_experiment.data} has more than one assistant. You have to assign one of these assistants: {form.semester_experiment.data.assistants}" + ) + + assistant = form.semester_experiment.data.assistants[0] + + appointment = Appointment( + date=appointmentDate, + special=special, + group_experiment=model, + assistant=assistant, + ) + + self.session.add(appointment) + + self.on_model_change(form, model, True) + self.session.commit() + except Exception as ex: + flash(ex, "error") + + self.session.rollback() + else: + flash(f"Appointments {model.appointments} added.", "success") + + self.after_model_change(form, model, True) + return model + def get_query(self): return ( super() @@ -479,6 +523,7 @@ class ExperimentMarkView(SecureModelView): "part_student.student", "group_experiment.semester_experiment.semester", "group_experiment.semester_experiment.experiment", + "assistant", ] diff --git a/advlabdb/models.py b/advlabdb/models.py index 9c66913..183f286 100644 --- a/advlabdb/models.py +++ b/advlabdb/models.py @@ -7,7 +7,7 @@ https://flask-sqlalchemy.palletsprojects.com/en/2.x/models/ """ # Imports -from flask import flash +from flask import flash, has_request_context from flask_security.models.fsqla_v2 import FsRoleMixin, FsUserMixin # Importing the database instance @@ -148,7 +148,7 @@ class Semester(db.Model): def __repr__(self): return f"<{self.label}>" - def transferParts(self, oldSemester): + def transferPartsFrom(self, oldSemester): try: if oldSemester: partLabels = [part.label for part in oldSemester.parts] @@ -160,7 +160,10 @@ class Semester(db.Model): db.session.commit() except Exception as ex: - flash(ex, "error") + if has_request_context(): + flash(ex, "error") + else: + print(ex) db.session.rollback() diff --git a/testDB.py b/testDB.py index 2f8a295..247f448 100644 --- a/testDB.py +++ b/testDB.py @@ -15,8 +15,8 @@ with app.app_context(): db.session.add(sem1) db.session.add(sem2) - sem1.transferParts(None) - sem2.transferParts(None) + sem1.transferPartsFrom(None) + sem2.transferPartsFrom(None) parta1 = sem2.parts[0] partb2 = sem2.parts[1]