From fa5fcc8f571d274fb92d80b194a566edda899a62 Mon Sep 17 00:00:00 2001
From: Emmanuel Viennet
Date: Thu, 20 Jan 2022 13:00:25 +0100
Subject: [PATCH] =?UTF-8?q?Edition=20modules:=20interdit=20changement=20de?=
=?UTF-8?q?=20semestre=20si=20utilis=C3=A9s.=20+=20doc=20+=20bug=20poids?=
=?UTF-8?q?=20vers=20UE=20d'autres=20semestres?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
app/comp/moy_mod.py | 6 ++-
app/models/evaluations.py | 11 ++++-
app/models/formsemestre.py | 2 +-
app/scodoc/sco_edit_module.py | 58 +++++++++++++++++++++-----
app/scodoc/sco_evaluation_edit.py | 6 ++-
app/scodoc/sco_moduleimpl_status.py | 4 +-
app/static/css/scodoc.css | 10 +++++
app/templates/scodoc/help/modules.html | 20 +++++++++
sco_version.py | 2 +-
9 files changed, 102 insertions(+), 17 deletions(-)
diff --git a/app/comp/moy_mod.py b/app/comp/moy_mod.py
index f21e6acdd..0caadb9b5 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 4f06fb75f..b4e5f4e2f 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 450ea2ccf..ca159f0fd 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 25ec3d25f..5ebf599df 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 c324a89be..ab178c150 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 27de3a699..d44b52352 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 72a918a69..4ff176753 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 d01a5d351..cd6e0767b 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 5ddad6197..36fffe4e4 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"