From e998839bf15538d398780e10e1d76c9244642c90 Mon Sep 17 00:00:00 2001 From: Mo8it Date: Thu, 19 Aug 2021 01:29:09 +0200 Subject: [PATCH] Added final_part_mark calculation in adminSpace --- advlabdb/adminModelViews.py | 11 +++++++++- advlabdb/models.py | 43 +++++++++++++++++++++++++++++++++++++ 2 files changed, 53 insertions(+), 1 deletion(-) diff --git a/advlabdb/adminModelViews.py b/advlabdb/adminModelViews.py index 4db1f6a..6af09f6 100644 --- a/advlabdb/adminModelViews.py +++ b/advlabdb/adminModelViews.py @@ -344,6 +344,8 @@ class PartStudentView(SecureAdminModelView): form = EditForm + column_list = ["student", "part", "group", "final_part_mark", "experiment_marks"] + column_filters = ["part", "student", "group"] def queryFilter(self): @@ -736,7 +738,14 @@ class ExperimentMarkView(SecureAdminModelView): ): model.edited_by_admin = True - return super().update_model(form, model) + ret = super().update_model(form, model) + + model.part_student.checkThenSetFinalPartMark() + + return ret + else: + # Nothing changed + return True class ProgramView(SecureAdminModelView): diff --git a/advlabdb/models.py b/advlabdb/models.py index 18c19a3..d75ee89 100644 --- a/advlabdb/models.py +++ b/advlabdb/models.py @@ -9,6 +9,7 @@ https://flask-sqlalchemy.palletsprojects.com/en/2.x/models/ # Imports from flask import flash, has_request_context from flask_security.models.fsqla_v2 import FsRoleMixin, FsUserMixin +from decimal import Decimal, ROUND_HALF_UP # Importing the database instance from advlabdb import db @@ -74,6 +75,48 @@ class PartStudent(db.Model): self.group = group self.final_part_mark = final_part_mark + def checkThenSetFinalPartMark(self): + finalWeightingSum = 0 + finalMark = 0 + groupExperiments = [] + + for experimentMark in self.experiment_marks: + if not (experimentMark.oral_mark and experimentMark.protocol_mark): + return + + groupExperiment = experimentMark.group_experiment + groupExperiments.append(groupExperiment) + + experiment = groupExperiment.semester_experiment.experiment + + finalWeighting = experiment.final_weighting + finalWeightingSum += finalWeighting + + finalMark += finalWeighting * ( + experiment.oral_weighting * experimentMark.oral_mark + + experiment.protocol_weighting * experimentMark.protocol_mark + ) + + if set(groupExperiments) != set(self.group.group_experiments): + flash(f"{self} does not have an experiment mark for every group experiment in his group!", "warning") + return + + oldFinalPartMark = self.final_part_mark + + try: + self.final_part_mark = int( + Decimal(finalMark / finalWeightingSum).quantize(Decimal(0), rounding=ROUND_HALF_UP) + ) + + db.session.commit() + except Exception as ex: + flash(str(ex), "error") + + self.session.rollback() + else: + if oldFinalPartMark != self.final_part_mark: + flash(f"Final part mark changed for {self} from {oldFinalPartMark} to {self.final_part_mark}.") + def repr(self): return f"{self.student.repr()} {self.part.repr()}"