diff --git a/app/comp/moy_mod.py b/app/comp/moy_mod.py index f21e6acd..0caadb9b 100644 --- a/app/comp/moy_mod.py +++ b/app/comp/moy_mod.py @@ -40,6 +40,7 @@ from app import log from app import models from app.models import ModuleImpl, Evaluation, EvaluationUEPoids from app.scodoc import sco_utils as scu +from app.scodoc.sco_exceptions import ScoValueError def df_load_evaluations_poids( @@ -60,7 +61,10 @@ def df_load_evaluations_poids( for eval_poids in EvaluationUEPoids.query.join( EvaluationUEPoids.evaluation ).filter_by(moduleimpl_id=moduleimpl_id): - df[eval_poids.ue_id][eval_poids.evaluation_id] = eval_poids.poids + try: + df[eval_poids.ue_id][eval_poids.evaluation_id] = eval_poids.poids + except KeyError as exc: + pass # poids vers des UE qui n'existent plus ou sont dans un autre semestre... if default_poids is not None: df.fillna(value=default_poids, inplace=True) return df, ues diff --git a/app/models/evaluations.py b/app/models/evaluations.py index 4f06fb75..b4e5f4e2 100644 --- a/app/models/evaluations.py +++ b/app/models/evaluations.py @@ -103,7 +103,16 @@ class Evaluation(db.Model): Note: si les poids ne sont pas initialisés (poids par défaut), ils ne sont pas affichés. """ - return ", ".join([f"{p.ue.acronyme}: {p.poids}" for p in self.ue_poids]) + # restreint aux UE du semestre dans lequel est cette évaluation + # au cas où le module ait changé de semestre et qu'il reste des poids + evaluation_semestre_idx = self.moduleimpl.module.semestre_id + return ", ".join( + [ + f"{p.ue.acronyme}: {p.poids}" + for p in self.ue_poids + if evaluation_semestre_idx == p.ue.semestre_idx + ] + ) class EvaluationUEPoids(db.Model): diff --git a/app/models/formsemestre.py b/app/models/formsemestre.py index 450ea2cc..ca159f0f 100644 --- a/app/models/formsemestre.py +++ b/app/models/formsemestre.py @@ -224,7 +224,7 @@ class FormSemestre(db.Model): self.date_fin.year})""" def titre_num(self) -> str: - """Le titre est le semestre, ex ""DUT Informatique semestre 2"" """ + """Le titre et le semestre, ex ""DUT Informatique semestre 2"" """ if self.semestre_id == sco_codes_parcours.NO_SEMESTRE_ID: return self.titre return f"{self.titre} {self.formation.get_parcours().SESSION_NAME} {self.semestre_id}" diff --git a/app/scodoc/sco_edit_module.py b/app/scodoc/sco_edit_module.py index 25ec3d25..5ebf599d 100644 --- a/app/scodoc/sco_edit_module.py +++ b/app/scodoc/sco_edit_module.py @@ -37,6 +37,7 @@ from app import log from app import models from app.models import APO_CODE_STR_LEN from app.models import Formation, Matiere, Module, UniteEns +from app.models import FormSemestre, ModuleImpl import app.scodoc.notesdb as ndb import app.scodoc.sco_utils as scu @@ -473,16 +474,31 @@ def module_edit(module_id=None): formation_id = module["formation_id"] formation = sco_formations.formation_list(args={"formation_id": formation_id})[0] parcours = sco_codes_parcours.get_parcours_from_code(formation["type_parcours"]) - is_apc = parcours.APC_SAE - ues_matieres = ndb.SimpleDictFetch( - """SELECT ue.acronyme, mat.*, mat.id AS matiere_id - FROM notes_matieres mat, notes_ue ue - WHERE mat.ue_id = ue.id - AND ue.formation_id = %(formation_id)s - ORDER BY ue.numero, mat.numero - """, - {"formation_id": formation_id}, - ) + is_apc = parcours.APC_SAE # BUT + in_use = len(a_module.modimpls.all()) > 0 # il y a des modimpls + if in_use: + # matières du même semestre seulement + ues_matieres = ndb.SimpleDictFetch( + """SELECT ue.acronyme, mat.*, mat.id AS matiere_id + FROM notes_matieres mat, notes_ue ue + WHERE mat.ue_id = ue.id + AND ue.formation_id = %(formation_id)s + AND ue.semestre_idx = %(semestre_idx)s + ORDER BY ue.numero, mat.numero + """, + {"formation_id": formation_id, "semestre_idx": a_module.ue.semestre_idx}, + ) + else: + # matières de la formation + ues_matieres = ndb.SimpleDictFetch( + """SELECT ue.acronyme, mat.*, mat.id AS matiere_id + FROM notes_matieres mat, notes_ue ue + WHERE mat.ue_id = ue.id + AND ue.formation_id = %(formation_id)s + ORDER BY ue.numero, mat.numero + """, + {"formation_id": formation_id}, + ) mat_names = ["%s / %s" % (x["acronyme"], x["titre"]) for x in ues_matieres] ue_mat_ids = ["%s!%s" % (x["ue_id"], x["matiere_id"]) for x in ues_matieres] module["ue_matiere_id"] = "%s!%s" % (module["ue_id"], module["matiere_id"]) @@ -501,12 +517,25 @@ def module_edit(module_id=None): ), """

Modification du module %(titre)s""" % module, """ (formation %(acronyme)s, version %(version)s)

""" % formation, - render_template("scodoc/help/modules.html", is_apc=is_apc), + render_template( + "scodoc/help/modules.html", + is_apc=is_apc, + formsemestres=FormSemestre.query.filter( + ModuleImpl.formsemestre_id == FormSemestre.id, + ModuleImpl.module_id == module_id, + ).all(), + ), ] if not unlocked: H.append( """
Formation verrouillée, seuls certains éléments peuvent être modifiés
""" ) + if in_use: + H.append( + """
Module déjà utilisé dans des semestres, + soyez prudents ! +
""" + ) descr = [ ( @@ -679,6 +708,13 @@ def module_edit(module_id=None): else: # l'UE peut changer tf[2]["ue_id"], tf[2]["matiere_id"] = tf[2]["ue_matiere_id"].split("!") + old_ue_id = a_module.ue.id + new_ue_id = int(tf[2]["ue_id"]) + if (old_ue_id != new_ue_id) and in_use: + # pas changer de semestre un module utilisé ! + raise ScoValueError( + "Module utilisé: il ne peut pas être changé de semestre !" + ) # En APC, force le semestre égal à celui de l'UE if is_apc: selected_ue = UniteEns.query.get(tf[2]["ue_id"]) diff --git a/app/scodoc/sco_evaluation_edit.py b/app/scodoc/sco_evaluation_edit.py index c324a89b..ab178c15 100644 --- a/app/scodoc/sco_evaluation_edit.py +++ b/app/scodoc/sco_evaluation_edit.py @@ -143,6 +143,7 @@ def evaluation_create_form( if vals.get("tf_submitted", False) and "visibulletinlist" not in vals: vals["visibulletinlist"] = [] # + ue_coef_dict = {} if is_apc: # BUT: poids vers les UE ue_coef_dict = ModuleImpl.query.get(moduleimpl_id).module.get_ue_coef_dict() for ue in sem_ues: @@ -290,7 +291,10 @@ def evaluation_create_form( "title": f"Poids {ue.acronyme}", "size": 2, "type": "float", - "explanation": f"{ue.titre}", + "explanation": f""" + {ue_coef_dict.get(ue.id, 0.)} + {ue.titre} + """, "allow_null": False, }, ), diff --git a/app/scodoc/sco_moduleimpl_status.py b/app/scodoc/sco_moduleimpl_status.py index 27de3a69..d44b5235 100644 --- a/app/scodoc/sco_moduleimpl_status.py +++ b/app/scodoc/sco_moduleimpl_status.py @@ -397,7 +397,9 @@ def moduleimpl_status(moduleimpl_id=None, partition_id=None): eval_index = len(mod_evals) - 1 first_eval = True for eval in mod_evals: - evaluation = Evaluation.query.get(eval["evaluation_id"]) # TODO unifier + evaluation: Evaluation = Evaluation.query.get( + eval["evaluation_id"] + ) # TODO unifier etat = sco_evaluations.do_evaluation_etat( eval["evaluation_id"], partition_id=partition_id, diff --git a/app/static/css/scodoc.css b/app/static/css/scodoc.css index 72a918a6..4ff17675 100644 --- a/app/static/css/scodoc.css +++ b/app/static/css/scodoc.css @@ -1491,6 +1491,16 @@ table.moduleimpl_evaluations td.eval_poids { color:rgb(0, 0, 255); } +span.eval_coef_ue { + color:rgb(6, 73, 6); + font-style: normal; + font-size: 80%; + margin-right: 2em; +} +span.eval_coef_ue_titre { + +} + /* Formulaire edition des partitions */ form#editpart table { border: 1px solid gray; diff --git a/app/templates/scodoc/help/modules.html b/app/templates/scodoc/help/modules.html index d01a5d35..cd6e0767 100644 --- a/app/templates/scodoc/help/modules.html +++ b/app/templates/scodoc/help/modules.html @@ -24,4 +24,24 @@ la documentation.

{%endif%} + + {% if formsemestres %} +

+ Ce module est utilisé dans des semestres déjà mis en place, il faut prêter attention + aux conséquences des changements effectués ici: par exemple les coefficients vont modifier + les notes moyennes calculées. Les modules déjà utilisés ne peuvent pas être changés de semestre, ni détruits. + Si vous souhaitez faire cela, allez d'abord modifier les semestres concernés pour déselectionner le module. +

+

Semestres utilisant ce module:

+ + {%endif%} + \ No newline at end of file diff --git a/sco_version.py b/sco_version.py index 5ddad619..36fffe4e 100644 --- a/sco_version.py +++ b/sco_version.py @@ -1,7 +1,7 @@ # -*- mode: python -*- # -*- coding: utf-8 -*- -SCOVERSION = "9.1.28" +SCOVERSION = "9.1.29" SCONAME = "ScoDoc"