Traitement erreur config bonus + complété bonus Grenoble

This commit is contained in:
Emmanuel Viennet 2022-01-26 22:52:56 +01:00
parent 3c36acd194
commit d146d5f554
3 changed files with 34 additions and 20 deletions

View File

@ -18,12 +18,12 @@ Flask, SQLAlchemy, au lien de Python2/Zope dans les versions précédentes).
### État actuel (4 dec 21) ### État actuel (26 jan 22)
- 9.0 (master) reproduit l'ensemble des fonctions de ScoDoc 7 (donc pas de BUT), sauf: - 9.1 (master) reproduit l'ensemble des fonctions de ScoDoc 7 (donc pas de BUT), sauf:
- ancien module "Entreprises" (obsolète) - ancien module "Entreprises" (obsolète) et ajoute la gestion du BUT.
- 9.1 (branche "PNBUT") est la version de développement. - 9.2 (branche refactor_nt) est la version de développement.
### Lignes de commandes ### Lignes de commandes

View File

@ -338,7 +338,7 @@ def bonus_iut1grenoble_2017(notes_sport, coefs, infos=None):
Calcul ici du bonus sur moyenne générale Calcul ici du bonus sur moyenne générale
""" """
# les coefs sont ignorés # les coefs sont ignorés
# notes de 0 à 5 # notes de 0 à 5/20
points = sum([x for x in notes_sport]) points = sum([x for x in notes_sport])
factor = (points / 4.0) / 100.0 factor = (points / 4.0) / 100.0
bonus = infos["moy"] * factor bonus = infos["moy"] * factor
@ -347,7 +347,9 @@ def bonus_iut1grenoble_2017(notes_sport, coefs, infos=None):
class BonusGrenobleIUT1(BonusSport): class BonusGrenobleIUT1(BonusSport):
""" """Bonus IUT1 de Grenoble
À compter de sept. 2021:
La note de sport est sur 20, et on calcule une bonification (en %) La note de sport est sur 20, et on calcule une bonification (en %)
qui va s'appliquer à la moyenne de chaque UE du semestre en appliquant qui va s'appliquer à la moyenne de chaque UE du semestre en appliquant
la formule : bonification (en %) = (note-10)*0,5. la formule : bonification (en %) = (note-10)*0,5.
@ -356,11 +358,16 @@ class BonusGrenobleIUT1(BonusSport):
(Une note de 10 donne donc 0% de bonif ; note de 20 : 5% de bonif) (Une note de 10 donne donc 0% de bonif ; note de 20 : 5% de bonif)
Avant sept. 2021, la note de sport allait de 0 à 5 points (sur 20).
Chaque point correspondait à 0.25% d'augmentation de la moyenne
générale.
Par exemple : note de sport 2/5 : la moyenne générale était augmentée de 0.5%.
""" """
name = "bonus_grenoble_iut1_2020" name = "bonus_iut1grenoble_2017"
# C'est un bonus "multiplicatif": on l'exprime en additif, # C'est un bonus "multiplicatif": on l'exprime en additif,
# sur chaque moyenne d'UE m_0 # sur chaque moyenne d'UE m_0
# Augmenter de 5% correspond à multiplier par a=1.05
# m_1 = a . m_0 # m_1 = a . m_0
# m_1 = m_0 + bonus # m_1 = m_0 + bonus
# bonus = m_0 (a - 1) # bonus = m_0 (a - 1)
@ -371,16 +378,21 @@ class BonusGrenobleIUT1(BonusSport):
sem_modimpl_moys_inscrits * modimpl_coefs_etuds_no_nan, axis=1 sem_modimpl_moys_inscrits * modimpl_coefs_etuds_no_nan, axis=1
) / np.sum(modimpl_coefs_etuds_no_nan, axis=1) ) / np.sum(modimpl_coefs_etuds_no_nan, axis=1)
notes = np.nan_to_num(notes, copy=False) notes = np.nan_to_num(notes, copy=False)
a = (notes - 10.0) * 0.005
a[a <= 0] = 1.0 # note < 10, pas de bonus if self.formsemestre.date_debut > datetime.date(2021, 7, 15):
if self.formsemestre.formation.is_apc(): factor = (notes - 10.0) * 0.005 # 5% si note=20
# ne s'applique qu'aux moyennes d'UE factor[factor <= 0] = 0.0 # note < 10, pas de bonus
b = self.etud_moy_ue * (a - 1) else: # anciens semestres
self.bonus_ues = b # DataFrame factor = notes / 400.0
else: factor[factor <= 0] = 0.0 # facteur 1 si bonus nul
# ne s'applique qu'à la moyenne générale
b = self.etud_moy_gen * (a - 1) # S'applique qu'aux moyennes d'UE
self.bonus_moy_gen = b bonus = self.etud_moy_ue * factor
self.bonus_ues = bonus # DataFrame
if not self.formsemestre.formation.is_apc():
# s'applique à la moyenne générale
self.bonus_moy_gen = bonus
class BonusVilleAvray(BonusSport): class BonusVilleAvray(BonusSport):

View File

@ -3,6 +3,7 @@
"""Model : site config WORK IN PROGRESS #WIP """Model : site config WORK IN PROGRESS #WIP
""" """
from flask import flash
from app import db, log from app import db, log
from app.comp import bonus_spo from app.comp import bonus_spo
from app.scodoc.sco_exceptions import ScoValueError from app.scodoc.sco_exceptions import ScoValueError
@ -120,7 +121,8 @@ class ScoDocSiteConfig(db.Model):
"""returns bonus class with specified name. """returns bonus class with specified name.
If name not specified, return the configured function. If name not specified, return the configured function.
None if no bonus function configured. None if no bonus function configured.
Raises ScoValueError if class_name not found in module bonus_sport. If class_name not found in module bonus_sport, returns None
and flash a warning.
""" """
if class_name is None: if class_name is None:
c = ScoDocSiteConfig.query.filter_by(name=cls.BONUS_SPORT).first() c = ScoDocSiteConfig.query.filter_by(name=cls.BONUS_SPORT).first()
@ -131,9 +133,9 @@ class ScoDocSiteConfig(db.Model):
return None return None
klass = bonus_spo.get_bonus_class_dict().get(class_name) klass = bonus_spo.get_bonus_class_dict().get(class_name)
if klass is None: if klass is None:
raise ScoValueError( flash(
f"""Fonction de calcul bonus sport inexistante: {class_name}. f"""Fonction de calcul bonus sport inexistante: {class_name}.
(contacter votre administrateur local).""" Changez ou contactez votre administrateur local."""
) )
return klass return klass