From 7a85ec7466419db036418dc3869870877d6c70cb Mon Sep 17 00:00:00 2001 From: Emmanuel Viennet Date: Fri, 18 Feb 2022 21:18:08 +0100 Subject: [PATCH] Ajout bonus Cachan1, et suppression bonus Annecy --- app/comp/bonus_spo.py | 231 ++++++++++++++++++++++++++++-------------- 1 file changed, 154 insertions(+), 77 deletions(-) diff --git a/app/comp/bonus_spo.py b/app/comp/bonus_spo.py index be2a8730..ed4bf5db 100644 --- a/app/comp/bonus_spo.py +++ b/app/comp/bonus_spo.py @@ -284,6 +284,7 @@ class BonusSportMultiplicatif(BonusSport): class BonusDirect(BonusSportAdditif): """Bonus direct: les points sont directement ajoutés à la moyenne générale. + Les coefficients sont ignorés: tous les points de bonus sont sommés. (rappel: la note est ramenée sur 20 avant application). """ @@ -294,47 +295,49 @@ class BonusDirect(BonusSportAdditif): proportion_point = 1.0 -class BonusAnnecy(BonusSport): - """Calcul bonus modules optionnels (sport), règle IUT d'Annecy. - Il peut y avoir plusieurs modules de bonus. - Prend pour chaque étudiant la meilleure de ses notes bonus et - ajoute à chaque UE : - 0.05 point si >=10, - 0.1 point si >=12, - 0.15 point si >=14, - 0.2 point si >=16, - 0.25 point si >=18. - """ +# Finalement ils n'en veulent pas. +# class BonusAnnecy(BonusSport): +# """Calcul bonus modules optionnels (sport), règle IUT d'Annecy. - name = "bonus_iut_annecy" - displayed_name = "IUT d'Annecy" +# Il peut y avoir plusieurs modules de bonus. +# Prend pour chaque étudiant la meilleure de ses notes bonus et +# ajoute à chaque UE :
+# 0.05 point si >=10,
+# 0.1 point si >=12,
+# 0.15 point si >=14,
+# 0.2 point si >=16,
+# 0.25 point si >=18. +# """ - def compute_bonus(self, sem_modimpl_moys_inscrits, modimpl_coefs_etuds_no_nan): - """calcul du bonus""" - # if math.prod(sem_modimpl_moys_inscrits.shape) == 0: - # return # no etuds or no mod sport - # Prend la note de chaque modimpl, sans considération d'UE - if len(sem_modimpl_moys_inscrits.shape) > 2: # apc - sem_modimpl_moys_inscrits = sem_modimpl_moys_inscrits[:, :, 0] - # ici sem_modimpl_moys_inscrits est nb_etuds x nb_mods_bonus, en APC et en classic - note_bonus_max = np.max(sem_modimpl_moys_inscrits, axis=1) # 1d, nb_etuds - bonus = np.zeros(note_bonus_max.shape) - bonus[note_bonus_max >= 18.0] = 0.25 - bonus[note_bonus_max >= 16.0] = 0.20 - bonus[note_bonus_max >= 14.0] = 0.15 - bonus[note_bonus_max >= 12.0] = 0.10 - bonus[note_bonus_max >= 10.0] = 0.05 +# name = "bonus_iut_annecy" +# displayed_name = "IUT d'Annecy" - # Bonus moyenne générale et sur les UE - self.bonus_moy_gen = pd.Series(bonus, index=self.etuds_idx, dtype=float) - ues_idx = [ue.id for ue in self.formsemestre.query_ues(with_sport=False)] - nb_ues_no_bonus = len(ues_idx) - self.bonus_ues = pd.DataFrame( - np.stack([bonus] * nb_ues_no_bonus, axis=1), - columns=ues_idx, - index=self.etuds_idx, - dtype=float, - ) +# def compute_bonus(self, sem_modimpl_moys_inscrits, modimpl_coefs_etuds_no_nan): +# """calcul du bonus""" +# # if math.prod(sem_modimpl_moys_inscrits.shape) == 0: +# # return # no etuds or no mod sport +# # Prend la note de chaque modimpl, sans considération d'UE +# if len(sem_modimpl_moys_inscrits.shape) > 2: # apc +# sem_modimpl_moys_inscrits = sem_modimpl_moys_inscrits[:, :, 0] +# # ici sem_modimpl_moys_inscrits est nb_etuds x nb_mods_bonus, en APC et en classic +# note_bonus_max = np.max(sem_modimpl_moys_inscrits, axis=1) # 1d, nb_etuds +# bonus = np.zeros(note_bonus_max.shape) +# bonus[note_bonus_max >= 10.0] = 0.05 +# bonus[note_bonus_max >= 12.0] = 0.10 +# bonus[note_bonus_max >= 14.0] = 0.15 +# bonus[note_bonus_max >= 16.0] = 0.20 +# bonus[note_bonus_max >= 18.0] = 0.25 + +# # Bonus moyenne générale et sur les UE +# self.bonus_moy_gen = pd.Series(bonus, index=self.etuds_idx, dtype=float) +# ues_idx = [ue.id for ue in self.formsemestre.query_ues(with_sport=False)] +# nb_ues_no_bonus = len(ues_idx) +# self.bonus_ues = pd.DataFrame( +# np.stack([bonus] * nb_ues_no_bonus, axis=1), +# columns=ues_idx, +# index=self.etuds_idx, +# dtype=float, +# ) class BonusBethune(BonusSportMultiplicatif): @@ -375,15 +378,16 @@ class BonusBezier(BonusSportAdditif): class BonusBordeaux1(BonusSportMultiplicatif): """Calcul bonus modules optionnels (sport, culture), règle IUT Bordeaux 1, sur moyenne générale et UE. - +

Les étudiants de l'IUT peuvent suivre des enseignements optionnels de l'Université Bordeaux 1 (sport, théâtre) non rattachés à une unité d'enseignement. - +

Chaque point au-dessus de 10 sur 20 obtenus dans cet enseignement correspond à un % - qui augmente la moyenne de chaque UE et la moyenne générale. - Formule : le % = points>moyenne / 2 + qui augmente la moyenne de chaque UE et la moyenne générale.
+ Formule : pourcentage = (points au dessus de 10) / 2 +

Par exemple : sport 13/20 : chaque UE sera multipliée par 1+0,015, ainsi que la moyenne générale. - +

""" name = "bonus_iutBordeaux1" @@ -393,6 +397,68 @@ class BonusBordeaux1(BonusSportMultiplicatif): amplitude = 0.005 +class BonusCachan1(BonusSportAdditif): + """Calcul bonus optionnels (sport, culture), règle IUT de Cachan 1. + + + """ + + name = "bonus_cachan1" + displayed_name = "IUT de Cachan 1" + seuil_moy_gen = 10.0 # tous les points sont comptés + proportion_point = 0.05 + classic_use_bonus_ues = True + + def compute_bonus(self, sem_modimpl_moys_inscrits, modimpl_coefs_etuds_no_nan): + """calcul du bonus, avec réglage différent suivant le type de formation""" + # Prend la note de chaque modimpl, sans considération d'UE + if len(sem_modimpl_moys_inscrits.shape) > 2: # apc + sem_modimpl_moys_inscrits = sem_modimpl_moys_inscrits[:, :, 0] + # ici sem_modimpl_moys_inscrits est nb_etuds x nb_mods_bonus, en APC et en classic + note_bonus_max = np.max(sem_modimpl_moys_inscrits, axis=1) # 1d, nb_etuds + ues = self.formsemestre.query_ues(with_sport=False).all() + ues_idx = [ue.id for ue in ues] + + if self.formsemestre.formation.is_apc(): # --- BUT + bonus_moy_arr = np.where( + note_bonus_max > self.seuil_moy_gen, + (note_bonus_max - self.seuil_moy_gen) * self.proportion_point, + 0.0, + ) + self.bonus_ues = pd.DataFrame( + np.stack([bonus_moy_arr] * len(ues)).T, + index=self.etuds_idx, + columns=ues_idx, + dtype=float, + ) + else: # --- DUT + # pareil mais proportion différente et exclusion d'une UE + proportion_point = 0.1 + bonus_moy_arr = np.where( + note_bonus_max > self.seuil_moy_gen, + (note_bonus_max - self.seuil_moy_gen) * proportion_point, + 0.0, + ) + self.bonus_ues = pd.DataFrame( + np.stack([bonus_moy_arr] * len(ues)).T, + index=self.etuds_idx, + columns=ues_idx, + dtype=float, + ) + # Pas de bonus sur la ou les ue de code "UE41_E" + ue_exclues = [ue for ue in ues if ue.ue_code == "UE41_E"] + for ue in ue_exclues: + self.bonus_ues[ue.id] = 0.0 + + class BonusColmar(BonusSportAdditif): """Calcul bonus modules optionnels (sport, culture), règle IUT Colmar. @@ -417,19 +483,21 @@ class BonusColmar(BonusSportAdditif): class BonusGrenobleIUT1(BonusSportMultiplicatif): """Bonus IUT1 de Grenoble +

À compter de sept. 2021: 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 la formule : bonification (en %) = (note-10)*0,5. - - Bonification qui ne s'applique que si la note est >10. - - (Une note de 10 donne donc 0% de bonif ; note de 20 : 5% de bonif) - +

+ La bonification ne s'applique que si la note est supérieure à 10. +

+ (Une note de 10 donne donc 0% de bonif, et une 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_iut1grenoble_2017" @@ -456,9 +524,11 @@ class BonusGrenobleIUT1(BonusSportMultiplicatif): class BonusLaRochelle(BonusSportAdditif): """Calcul bonus modules optionnels (sport, culture), règle IUT de La Rochelle. - Si la note de sport est comprise entre 0 et 10 : pas d'ajout de point. - Si la note de sport est comprise entre 10 et 20 : ajout de 1% de cette - note sur la moyenne générale du semestre (ou sur les UE en BUT). + """ name = "bonus_iutlr" @@ -483,16 +553,17 @@ class BonusLeHavre(BonusSportMultiplicatif): class BonusLeMans(BonusSportAdditif): """Calcul bonus modules optionnels (sport, culture), règle IUT Le Mans. - Les points au-dessus de 10 sur 20 obtenus dans chacune des matières +

Les points au-dessus de 10 sur 20 obtenus dans chacune des matières optionnelles sont cumulés. +

+ +

Dans tous les cas, le bonus est dans la limite de 0,5 point.

""" name = "bonus_iutlemans" @@ -516,12 +587,13 @@ class BonusLeMans(BonusSportAdditif): class BonusLille(BonusSportAdditif): """Calcul bonus modules optionnels (sport, culture), règle IUT Villeneuve d'Ascq - Les étudiants de l'IUT peuvent suivre des enseignements optionnels +

Les étudiants de l'IUT peuvent suivre des enseignements optionnels de l'Université Lille (sports, etc) non rattachés à une unité d'enseignement. - +

Les points au-dessus de 10 sur 20 obtenus dans chacune des matières optionnelles sont cumulés et 4% (2% avant août 2010) de ces points cumulés s'ajoutent à la moyenne générale du semestre déjà obtenue par l'étudiant. +

""" name = "bonus_lille" @@ -573,17 +645,19 @@ class BonusMulhouse(BonusSportAdditif): class BonusNantes(BonusSportAdditif): """IUT de Nantes (Septembre 2018) - Nous avons différents types de bonification +

Nous avons différents types de bonification (sport, culture, engagement citoyen). - +

Nous ajoutons aux moyennes une bonification de 0,2 pour chaque item la bonification totale ne doit pas excéder les 0,5 point. Sur le bulletin nous ne mettons pas une note sur 20 mais directement les bonifications. - - Dans ScoDoc: on a déclarera une UE "sport&culture" dans laquelle on aura des modules - pour chaque activité (Sport, Associations, ...) - avec à chaque fois une note (ScoDoc l'affichera comme une note sur 20, mais en fait ce sera la - valeur de la bonification: entrer 0,1/20 signifiera un bonus de 0,1 point la moyenne générale) +

+ Dans ScoDoc: on a déclarera une UE "sport&culture" dans laquelle on aura + des modules pour chaque activité (Sport, Associations, ...) + avec à chaque fois une note (ScoDoc l'affichera comme une note sur 20, + mais en fait ce sera la valeur de la bonification: entrer 0,1/20 signifiera + un bonus de 0,1 point la moyenne générale). +

""" name = "bonus_nantes" @@ -627,13 +701,14 @@ class BonusStDenis(BonusSportAdditif): class BonusTours(BonusDirect): """Calcul bonus sport & culture IUT Tours. - Les notes des UE bonus (ramenées sur 20) sont sommées +

Les notes des UE bonus (ramenées sur 20) sont sommées et 1/40 (2,5%) est ajouté aux moyennes: soit à la moyenne générale, soit pour le BUT à chaque moyenne d'UE. - - Attention: en GEII, facteur 1/40, ailleurs facteur 1. - +

+ Attention: en GEII, facteur 1/40, ailleurs facteur 1. +

Le bonus total est limité à 1 point. +

""" name = "bonus_tours" @@ -658,11 +733,13 @@ class BonusVilleAvray(BonusSport): Les étudiants de l'IUT peuvent suivre des enseignements optionnels de l'Université Paris 10 (C2I) non rattachés à une unité d'enseignement. - Si la note est >= 10 et < 12, bonus de 0.1 point - Si la note est >= 12 et < 16, bonus de 0.2 point - Si la note est >= 16, bonus de 0.3 point - Ce bonus s'ajoute à la moyenne générale du semestre déjà obtenue par - l'étudiant. + +

Ce bonus s'ajoute à la moyenne générale du semestre déjà obtenue par + l'étudiant.

""" name = "bonus_iutva"