From 9ff24059474d7462197d86ba4841503aafe0841c Mon Sep 17 00:00:00 2001 From: Mo8it Date: Sun, 15 May 2022 22:24:49 +0200 Subject: [PATCH] Remove Appointment.customInit --- advlabdb/adminModelViews.py | 52 ++++++++++---------------- advlabdb/database_import.py | 4 +- advlabdb/models.py | 39 +++++++------------ advlabdb/scripts/test/test_database.py | 4 +- 4 files changed, 36 insertions(+), 63 deletions(-) diff --git a/advlabdb/adminModelViews.py b/advlabdb/adminModelViews.py index 6012599..b9076c2 100644 --- a/advlabdb/adminModelViews.py +++ b/advlabdb/adminModelViews.py @@ -224,7 +224,8 @@ class UserView(SecureAdminModelView): self.on_model_change(form, model, True) self.session.commit() except Exception as ex: - flash(str(ex), "error") + if not self.handle_view_exception(ex): + flash(str(ex), "error") self.session.rollback() else: @@ -1059,15 +1060,12 @@ class GroupExperimentView(SecureAdminModelView): def on_model_change(self, form, model, is_created): if is_created: - for date, 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), + for date, special, assistant in ( + (form.appointment1_date.data, form.appointment1_special.data, form.appointment1_assistant.data), + (form.appointment2_date.data, form.appointment2_special.data, form.appointment2_assistant.data), ): - if date: - appointment = Appointment.customInit( - date=date, special=special, group_experiment=model, assistant=assistant - ) + if date is not None: + appointment = Appointment(date=date, special=special, group_experiment=model, assistant=assistant) self.session.add(appointment) @@ -1180,30 +1178,17 @@ class AppointmentView(SecureAdminModelView): ) def customCreateModel(self, form): - return Appointment.customInit( + return Appointment( date=form.date.data, special=form.special.data, group_experiment=form.group_experiment.data, assistant=form.assistant.data, ) - def update_model(self, form, model): - if None in (form.date, form.special): # For editables - return super().update_model(form, model) - - try: - 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() - except Exception as ex: - flash(str(ex), "error") - - self.session.rollback() - return False - else: - self.after_model_change(form, model, False) - return True + def on_model_change(self, form, model, is_created): + if None not in (form.date, form.special): # No need to check or adjust assistant for editables + if not is_created: + model.assistant = Appointment.checkAndGetAssistant(model.group_experiment, model.assistant) class ExperimentMarkView(SecureAdminModelView): @@ -1362,16 +1347,16 @@ class ExperimentMarkView(SecureAdminModelView): return ExperimentMark(part_student=form.part_student.data, group_experiment=form.group_experiment.data) def update_model(self, form, model): - if (form.oral_mark and form.oral_mark.data != model.oral_mark) or ( - form.protocol_mark and form.protocol_mark.data != model.protocol_mark + if (form.oral_mark is not None and form.oral_mark.data != model.oral_mark) or ( + form.protocol_mark is not None and form.protocol_mark.data != model.protocol_mark ): model.admin = current_user.admin - ret = super().update_model(form, model) + updateSuccessful = super().update_model(form, model) model.part_student.checkThenSetFinalPartMark() - return ret + return updateSuccessful # Nothing changed return True @@ -1421,8 +1406,9 @@ class ImportView(SecureAdminBaseView): try: importFromFile(filePath) - except Exception as exc: - flash(str(exc), "error") + except Exception as ex: + if not self.handle_view_exception(ex): + flash(str(ex), "error") return redirect(url_for("index")) diff --git a/advlabdb/database_import.py b/advlabdb/database_import.py index 586d731..4675286 100644 --- a/advlabdb/database_import.py +++ b/advlabdb/database_import.py @@ -257,12 +257,12 @@ def importFromFile(filePath): assistantEmail = appointments["assistant_email"][i] assistant = Assistant.query.filter(Assistant.user.has(User.email == assistantEmail)).first() - if not assistant: + if assistant is None: raise DataBaseImportException( f"Assistant with email {email} does not exist in the database! Please make sure that you create assistants in the web interface." ) - dbAppointment = Appointment.customInit( + dbAppointment = Appointment( date=datetime.strptime(date, "%d.%m.%Y").date(), special=bool(int(appointments["special"][i])), group_experiment=dbGroupExperiments[int(appointments["group_experiment_id"][i])], diff --git a/advlabdb/models.py b/advlabdb/models.py index 71f99a8..f091549 100644 --- a/advlabdb/models.py +++ b/advlabdb/models.py @@ -84,12 +84,6 @@ class PartStudent(db.Model): super().__init__(student=student, part=part, group=group) - def customUpdate(self, group, final_part_mark): - Part.check(group, self.part) - - self.group = group - self.final_part_mark = final_part_mark - def checkThenSetFinalPartMark(self): finalWeightingSum = 0 finalMark = 0 @@ -189,11 +183,6 @@ class Group(db.Model): semester=semester, ) - def customUpdate(self, part_students): - Group.check(part_students, self.program) - - self.part_students = part_students - def repr(self): return f"{self.number} {self.program.repr()} {self.semester.repr()}" @@ -213,7 +202,7 @@ class GroupExperiment(db.Model): __table_args__ = (db.UniqueConstraint(semester_experiment_id, group_id),) - def __init__(self, semester_experiment, group): + def check(semester_experiment, group): for partStudent in group.part_students: student = partStudent.student for partStudent in student.part_students: @@ -223,6 +212,9 @@ class GroupExperiment(db.Model): f"{student} has already done {semester_experiment.experiment} in {partStudent.part} and had {experimentMark}!" ) + def __init__(self, semester_experiment, group): + GroupExperiment.check(semester_experiment, group) + super().__init__(semester_experiment=semester_experiment, group=group) for partStudent in group.part_students: @@ -369,14 +361,14 @@ class Appointment(db.Model): group_experiment_id = db.Column(db.Integer, db.ForeignKey("group_experiment.id"), nullable=False) assistant_id = db.Column(db.Integer, db.ForeignKey("assistant.id"), nullable=False) - def checkAndGetAssistant(assistant, groupExperiment): + def checkAndGetAssistant(groupExperiment, assistant=None): semesterExperiment = groupExperiment.semester_experiment semesterExperimentAssistants = semesterExperiment.assistants if not semesterExperimentAssistants: raise DataBaseException(f"{semesterExperiment} does not have assistants yet!") - if assistant: + if assistant is not None: if assistant not in semesterExperimentAssistants: raise DataBaseException(f"{assistant} not responsible for {semesterExperiment}!") else: @@ -389,24 +381,16 @@ class Appointment(db.Model): return assistant - def customInit(date, special, group_experiment, assistant): - assistant = Appointment.checkAndGetAssistant(assistant, group_experiment) + def __init__(self, date, special, group_experiment, assistant=None): + assistant = Appointment.checkAndGetAssistant(group_experiment, assistant) - return Appointment( + super().__init__( date=date, special=special, group_experiment=group_experiment, assistant=assistant, ) - def customUpdate(self, date, special, assistant, group_experiment): - assistant = Appointment.checkAndGetAssistant(assistant, group_experiment) - - self.date = date - self.special = special - self.assistant = assistant - self.group_experiment = group_experiment - def repr(self): return f"{self.date} {self.group_experiment.repr()}" @@ -528,13 +512,16 @@ class ExperimentMark(db.Model): __table_args__ = (db.UniqueConstraint(part_student_id, group_experiment_id),) - def __init__(self, part_student, group_experiment): + def check(part_student, group_experiment): if not part_student.group: raise DataBaseException("The part student does not have a group yet!") else: if group_experiment not in part_student.group.group_experiments: raise DataBaseException("The group of the part student does not have the given group experiment!") + def __init__(self, part_student, group_experiment): + ExperimentMark(part_student, group_experiment) + super().__init__(part_student=part_student, group_experiment=group_experiment) def updateFinalExperimentMark(self): diff --git a/advlabdb/scripts/test/test_database.py b/advlabdb/scripts/test/test_database.py index 09dd477..184e59c 100644 --- a/advlabdb/scripts/test/test_database.py +++ b/advlabdb/scripts/test/test_database.py @@ -139,8 +139,8 @@ def main(): db.session.add(as1) db.session.add(as2) - ap1 = Appointment.customInit(date=date(2021, 3, 21), special=True, group_experiment=gx1, assistant=as1) - ap2 = Appointment.customInit(date=date(2021, 3, 22), special=True, group_experiment=gx2, assistant=as2) + ap1 = Appointment(date=date(2021, 3, 21), special=True, group_experiment=gx1, assistant=as1) + ap2 = Appointment(date=date(2021, 3, 22), special=True, group_experiment=gx2, assistant=as2) db.session.add(ap1) db.session.add(ap2)