diff --git a/app/comp/bonus_spo.py b/app/comp/bonus_spo.py index 098bd1286..30754bcfc 100644 --- a/app/comp/bonus_spo.py +++ b/app/comp/bonus_spo.py @@ -387,7 +387,7 @@ class BonusBordeaux1(BonusSportMultiplicatif): """ name = "bonus_iutBordeaux1" - displayed_name = "IUT de Bordeaux 1" + displayed_name = "IUT de Bordeaux" classic_use_bonus_ues = True # s'applique aux UEs en DUT et LP seuil_moy_gen = 10.0 amplitude = 0.005 diff --git a/app/comp/moy_ue.py b/app/comp/moy_ue.py index 84a7e2bf1..8b98d2ef4 100644 --- a/app/comp/moy_ue.py +++ b/app/comp/moy_ue.py @@ -218,21 +218,25 @@ def compute_ue_moys_apc( ues: list, modimpl_inscr_df: pd.DataFrame, modimpl_coefs_df: pd.DataFrame, + modimpl_mask: np.array, ) -> pd.DataFrame: """Calcul de la moyenne d'UE en mode APC (BUT). La moyenne d'UE est un nombre (note/20), ou NI ou NA ou ERR NI non inscrit à (au moins un) module de cette UE NA pas de notes disponibles - ERR erreur dans une formule utilisateur. [XXX pas encore gérées ici] + ERR erreur dans une formule utilisateurs (pas gérées ici). sem_cube: notes moyennes aux modules ndarray (etuds x modimpls x UEs) (floats avec des NaN) etuds : liste des étudiants (dim. 0 du cube) - modimpls : liste des modules à considérer (dim. 1 du cube) + modimpls : liste des module_impl (dim. 1 du cube) ues : liste des UE (dim. 2 du cube) modimpl_inscr_df: matrice d'inscription du semestre (etud x modimpl) modimpl_coefs_df: matrice coefficients (UE x modimpl), sans UEs bonus sport + modimpl_mask: liste de booléens, indiquants le module doit être pris ou pas. + (utilisé pour éliminer les bonus, et pourra servir à cacluler + sur des sous-ensembles de modules) Résultat: DataFrame columns UE (sans bonus), rows etudid """ @@ -249,7 +253,8 @@ def compute_ue_moys_apc( assert modimpl_coefs_df.shape[0] == nb_ues_no_bonus assert modimpl_coefs_df.shape[1] == nb_modules modimpl_inscr = modimpl_inscr_df.values - modimpl_coefs = modimpl_coefs_df.values + # Met à zéro tous les coefs des modules non sélectionnés dans le masque: + modimpl_coefs = np.where(modimpl_mask, modimpl_coefs_df.values, 0.0) # Duplique les inscriptions sur les UEs non bonus: modimpl_inscr_stacked = np.stack([modimpl_inscr] * nb_ues_no_bonus, axis=2) diff --git a/app/comp/res_but.py b/app/comp/res_but.py index b74efb105..1d01f4f42 100644 --- a/app/comp/res_but.py +++ b/app/comp/res_but.py @@ -56,14 +56,11 @@ class ResultatsSemestreBUT(NotesTableCompat): # modimpl_coefs_df.columns.get_loc(modimpl.id) # idx de l'UE: modimpl_coefs_df.index.get_loc(ue.id) - # Elimine les coefs des modimpl bonus sports: - modimpls_sport = [ - modimpl + # Masque de tous les modules _sauf_ les bonus (sport) + modimpls_mask = [ + modimpl.module.ue.type != UE_SPORT for modimpl in self.formsemestre.modimpls_sorted - if modimpl.module.ue.type == UE_SPORT ] - for modimpl in modimpls_sport: - self.modimpl_coefs_df[modimpl.id] = 0 self.etud_moy_ue = moy_ue.compute_ue_moys_apc( self.sem_cube, @@ -72,6 +69,7 @@ class ResultatsSemestreBUT(NotesTableCompat): self.ues, self.modimpl_inscr_df, self.modimpl_coefs_df, + modimpls_mask, ) # Les coefficients d'UE ne sont pas utilisés en APC self.etud_coef_ue_df = pd.DataFrame( @@ -85,7 +83,7 @@ class ResultatsSemestreBUT(NotesTableCompat): self.etud_moy_ue -= self.malus # --- Bonus Sport & Culture - if len(modimpls_sport) > 0: + if not all(modimpls_mask): # au moins un module bonus bonus_class = ScoDocSiteConfig.get_bonus_sport_class() if bonus_class is not None: bonus: BonusSport = bonus_class(