diff --git a/app/comp/bonus_spo.py b/app/comp/bonus_spo.py
index 48856771d..7cbac1c79 100644
--- a/app/comp/bonus_spo.py
+++ b/app/comp/bonus_spo.py
@@ -266,6 +266,8 @@ class BonusSportMultiplicatif(BonusSport):
amplitude = 0.005 # multiplie les points au dessus du seuil
# En classique, les bonus multiplicatifs agissent par défaut sur les UE:
classic_use_bonus_ues = True
+ # Facteur multiplicatif max: (bonus = moy_ue*factor)
+ factor_max = 1000.0 # infini
# C'est un bonus "multiplicatif": on l'exprime en additif,
# sur chaque moyenne d'UE m_0
@@ -285,6 +287,8 @@ class BonusSportMultiplicatif(BonusSport):
notes = np.nan_to_num(notes, copy=False)
factor = (notes - self.seuil_moy_gen) * self.amplitude # 5% si note=20
factor[factor <= 0] = 0.0 # note < seuil_moy_gen, pas de bonus
+ # note < seuil_moy_gen, pas de bonus: pas de facteur négatif, ni
+ factor.clip(0.0, self.factor_max, out=factor)
# Ne s'applique qu'aux moyennes d'UE
if len(factor.shape) == 1: # classic
@@ -705,10 +709,11 @@ class BonusGrenobleIUT1(BonusSportMultiplicatif):
class BonusIUTRennes1(BonusSportAdditif):
"""Calcul bonus optionnels (sport, langue vivante, engagement étudiant),
- règle IUT de l'Université de Rennes 1 (Lannion, St Malo).
+ règle IUT de l'Université de Rennes 1 (Lannion, Rennes, St Brieuc, St Malo).
- - Les étudiants peuvent suivre un ou plusieurs activités optionnelles notées.
+
- Les étudiants peuvent suivre un ou plusieurs activités optionnelles notées
+ dans les semestres pairs.
La meilleure des notes obtenue est prise en compte, si elle est supérieure à 10/20.
- Le vingtième des points au dessus de 10 est ajouté à la moyenne de chaque UE
@@ -749,6 +754,19 @@ class BonusIUTRennes1(BonusSportAdditif):
self.bonus_additif(bonus_moy_arr)
+# juste pour compatibilité (nom bonus en base):
+class BonusStBrieuc(BonusIUTRennes1):
+ name = "bonus_iut_stbrieuc"
+ displayed_name = "IUTs de Rennes 1/St-Brieuc"
+ __doc__ = BonusIUTRennes1.__doc__
+
+
+class BonusStMalo(BonusIUTRennes1):
+ name = "bonus_iut_stmalo"
+ displayed_name = "IUTs de Rennes 1/St-Malo"
+ __doc__ = BonusIUTRennes1.__doc__
+
+
class BonusLaRochelle(BonusSportAdditif):
"""Calcul bonus modules optionnels (sport, culture), règle IUT de La Rochelle.
@@ -967,7 +985,7 @@ class BonusNantes(BonusSportAdditif):
class BonusPoitiers(BonusSportAdditif):
"""Calcul bonus optionnels (sport, culture), règle IUT de Poitiers.
- Les deux notes d'option supérieure à 10, bonifies les moyennes de chaque UE.
+ Les deux notes d'option supérieure à 10, bonifient les moyennes de chaque UE.
bonus = (option1 - 10)*5% + (option2 - 10)*5%
"""
@@ -992,27 +1010,6 @@ class BonusRoanne(BonusSportAdditif):
proportion_point = 1
-class BonusStBrieuc(BonusSportAdditif):
- """IUT de Saint Brieuc
-
- Ne s'applique qu'aux semestres pairs (S2, S4, S6), et bonifie les moyennes d'UE:
-
- """
-
- # Utilisé aussi par St Malo, voir plus bas
- name = "bonus_iut_stbrieuc"
- displayed_name = "IUT de Saint-Brieuc"
- proportion_point = 1 / 20.0
- classic_use_bonus_ues = False
-
- def compute_bonus(self, sem_modimpl_moys_inscrits, modimpl_coefs_etuds_no_nan):
- """calcul du bonus"""
- if self.formsemestre.semestre_id % 2 == 0:
- super().compute_bonus(sem_modimpl_moys_inscrits, modimpl_coefs_etuds_no_nan)
-
-
class BonusStEtienne(BonusSportAdditif):
"""IUT de Saint-Etienne.
@@ -1043,17 +1040,31 @@ class BonusStDenis(BonusSportAdditif):
bonus_max = 0.5
-class BonusStMalo(BonusStBrieuc):
- # identique à St Brieux, sauf la doc
- """IUT de Saint Malo
+class BonusStNazaire(BonusSportMultiplicatif):
+ """IUT de Saint-Nazaire
- Ne s'applique qu'aux semestres pairs (S2, S4, S6), et bonifie les moyennes d'UE:
+ Trois bonifications sont possibles : sport, culture et engagement citoyen
+ (qui seront déclarées comme des modules séparés de l'UE bonus).
- - Bonus = (S - 10)/20
+ - Chaque bonus est compris entre 0 et 20 points -> 4pt = 1%
+ (note 4/20: 1%, 8/20: 2%, 12/20: 3%, 16/20: 4%, 20/20: 5%)
+
+ - Le total des 3 bonus ne peut excéder 10%
+ - La somme des bonus s'applique à la moyenne de chaque UE
+ Exemple: une moyenne d'UE de 10/20 avec un total des bonus de 6% donne
+ une moyenne de 10,6.
+ Les bonifications s'appliquent aussi au classement général du semestre
+ et de l'année.
+
"""
- name = "bonus_iut_stmalo"
- displayed_name = "IUT de Saint-Malo"
+
+ name = "bonus_iutSN"
+ displayed_name = "IUT de Saint-Nazaire"
+ classic_use_bonus_ues = True # s'applique aux UEs en DUT et LP
+ seuil_moy_gen = 0.0 # tous les points comptent
+ amplitude = 0.01 / 4 # 4pt => 1%
+ factor_max = 0.1 # 10% max
class BonusTarbes(BonusSportAdditif):
diff --git a/app/scodoc/sco_evaluations.py b/app/scodoc/sco_evaluations.py
index 6152e8810..09bf21024 100644
--- a/app/scodoc/sco_evaluations.py
+++ b/app/scodoc/sco_evaluations.py
@@ -606,12 +606,10 @@ def formsemestre_evaluations_delai_correction(formsemestre_id, format="html"):
# -------------- VIEWS
-def evaluation_describe(evaluation_id="", edit_in_place=True):
+def evaluation_describe(evaluation_id="", edit_in_place=True, link_saisie=True):
"""HTML description of evaluation, for page headers
edit_in_place: allow in-place editing when permitted (not implemented)
"""
- from app.scodoc import sco_saisie_notes
-
E = sco_evaluation_db.do_evaluation_list({"evaluation_id": evaluation_id})[0]
moduleimpl_id = E["moduleimpl_id"]
M = sco_moduleimpl.moduleimpl_list(moduleimpl_id=moduleimpl_id)[0]
@@ -646,7 +644,7 @@ def evaluation_describe(evaluation_id="", edit_in_place=True):
if Mod["module_type"] == ModuleType.MALUS:
etit += ' (points de malus)'
H = [
- 'Evaluation%sModule : %s
'
+ 'Évaluation%sModule : %s
'
% (etit, mod_descr)
]
if Mod["module_type"] == ModuleType.MALUS:
@@ -689,12 +687,16 @@ def evaluation_describe(evaluation_id="", edit_in_place=True):
modifier l'évaluation
-
+ """
+ )
+ if link_saisie:
+ H.append(
+ f"""
saisie des notes
"""
- )
+ )
H.append("")
return '' + "\n".join(H) + "
"
diff --git a/app/scodoc/sco_moduleimpl_status.py b/app/scodoc/sco_moduleimpl_status.py
index c568a7f62..1084314d6 100644
--- a/app/scodoc/sco_moduleimpl_status.py
+++ b/app/scodoc/sco_moduleimpl_status.py
@@ -277,7 +277,11 @@ def moduleimpl_status(moduleimpl_id=None, partition_id=None):
if modimpl.module.is_apc():
H.append(_ue_coefs_html(modimpl.module.ue_coefs_list()))
else:
- H.append(f"Coef. dans le semestre: {modimpl.module.coefficient}")
+ H.append(
+ f"""Coef. dans le semestre: {
+ "non défini" if modimpl.module.coefficient is None else modimpl.module.coefficient
+ }"""
+ )
H.append(""" | """)
# 3ieme ligne: Formation
H.append(
diff --git a/app/scodoc/sco_saisie_notes.py b/app/scodoc/sco_saisie_notes.py
index 733ef1730..e75977359 100644
--- a/app/scodoc/sco_saisie_notes.py
+++ b/app/scodoc/sco_saisie_notes.py
@@ -943,7 +943,9 @@ def saisie_notes(evaluation_id, group_ids=[]):
cssstyles=sco_groups_view.CSSSTYLES,
init_qtip=True,
),
- sco_evaluations.evaluation_describe(evaluation_id=evaluation_id),
+ sco_evaluations.evaluation_describe(
+ evaluation_id=evaluation_id, link_saisie=False
+ ),
'Saisie des notes',
]
H.append("""