Calcul moyenne UE BUT progressif (admet modules sans notes)

This commit is contained in:
Emmanuel Viennet 2021-12-08 21:49:13 +01:00
parent 270d03057f
commit 11b3f64319
7 changed files with 117 additions and 108 deletions

View File

@ -120,8 +120,13 @@ class ResultatsSemestreBUT:
"total": ue.ects, "total": ue.ects,
}, },
"competence": None, # XXX TODO lien avec référentiel "competence": None, # XXX TODO lien avec référentiel
"moyenne": fmt_note(self.etud_moy_ue[ue.id].mean()), "moyenne": {
"bonus": None, # XXX TODO "value": fmt_note(self.etud_moy_ue[ue.id][etud.id]),
"min": fmt_note(self.etud_moy_ue[ue.id].min()),
"max": fmt_note(self.etud_moy_ue[ue.id].max()),
"moy": fmt_note(self.etud_moy_ue[ue.id].mean()),
},
"bonus": 17.8, # None, # XXX TODO
"malus": None, # XXX TODO voir ce qui est ici "malus": None, # XXX TODO voir ce qui est ici
"capitalise": None, # "AAAA-MM-JJ" TODO "capitalise": None, # "AAAA-MM-JJ" TODO
"ressources": self.etud_ue_mod_results(etud, ue, self.ressources), "ressources": self.etud_ue_mod_results(etud, ue, self.ressources),

View File

@ -186,25 +186,25 @@ def compute_ue_moys(
modimpl_coefs = modimpl_coefs_df.values modimpl_coefs = modimpl_coefs_df.values
# Duplique les inscriptions sur les UEs: # Duplique les inscriptions sur les UEs:
modimpl_inscr_stacked = np.stack([modimpl_inscr] * nb_ues, axis=2) modimpl_inscr_stacked = np.stack([modimpl_inscr] * nb_ues, axis=2)
# Enlève les NaN du numérateur: # Enlève les NaN du numérateur:
# si on veut prendre en compte les module avec notes neutralisées ? # si on veut prendre en compte les modules avec notes neutralisées ?
# sem_cube_no_nan = np.nan_to_num(sem_cube, nan=0.0) sem_cube_no_nan = np.nan_to_num(sem_cube, nan=0.0)
# Ne prend pas en compte les notes des étudiants non inscrits au module: # Ne prend pas en compte les notes des étudiants non inscrits au module:
# Annule les notes: # Annule les notes:
sem_cube_inscrits = np.where(modimpl_inscr_stacked, sem_cube, 0.0) sem_cube_inscrits = np.where(modimpl_inscr_stacked, sem_cube_no_nan, 0.0)
# Annule les coefs des modules où l'étudiant n'est pas inscrit: # Annule les coefs des modules où l'étudiant n'est pas inscrit:
modimpl_coefs_etuds = np.where( modimpl_coefs_etuds = np.where(
modimpl_inscr_stacked, np.stack([modimpl_coefs.T] * nb_etuds), 0.0 modimpl_inscr_stacked, np.stack([modimpl_coefs.T] * nb_etuds), 0.0
) )
# Annule les coefs des modules NaN
modimpl_coefs_etuds_no_nan = np.where(np.isnan(sem_cube), 0.0, modimpl_coefs_etuds)
# #
# Version vectorisée # Version vectorisée
# #
etud_moy_ue = np.sum(modimpl_coefs_etuds * sem_cube_inscrits, axis=1) / np.sum( etud_moy_ue = np.sum(
modimpl_coefs_etuds, axis=1 modimpl_coefs_etuds_no_nan * sem_cube_inscrits, axis=1
) ) / np.sum(modimpl_coefs_etuds_no_nan, axis=1)
return pd.DataFrame( return pd.DataFrame(
etud_moy_ue, index=modimpl_inscr_df.index, columns=modimpl_coefs_df.index etud_moy_ue, index=modimpl_inscr_df.index, columns=modimpl_coefs_df.index
) )

View File

@ -528,18 +528,15 @@ def module_edit(module_id=None):
("formation_id", {"input_type": "hidden"}), ("formation_id", {"input_type": "hidden"}),
("ue_id", {"input_type": "hidden"}), ("ue_id", {"input_type": "hidden"}),
("module_id", {"input_type": "hidden"}), ("module_id", {"input_type": "hidden"}),
]
if not is_apc:
descr += [
( (
"ue_matiere_id", "ue_matiere_id",
{ {
"input_type": "menu", "input_type": "menu" if not is_apc else "hidden",
"title": "Matière", "title": "Matière",
"explanation": "un module appartient à une seule matière.", "explanation": "un module appartient à une seule matière.",
"labels": mat_names, "labels": mat_names,
"allowed_values": ue_mat_ids, "allowed_values": ue_mat_ids,
"enabled": unlocked, "enabled": unlocked and not is_apc, # pas d'édition des matieres en BUT
}, },
), ),
] ]

View File

@ -816,7 +816,7 @@ def _add_apc_columns(
etuds_moy_module = moy_mod.compute_module_moy( etuds_moy_module = moy_mod.compute_module_moy(
evals_notes, evals_poids, evaluations, evaluations_completes evals_notes, evals_poids, evaluations, evaluations_completes
) )
ue_coefs = models.ModuleImpl.query.get(moduleimpl_id).module.ue_coefs
for row in rows: for row in rows:
for ue in ues: for ue in ues:
moy_ue = etuds_moy_module[ue.id].get(row["etudid"], "?") moy_ue = etuds_moy_module[ue.id].get(row["etudid"], "?")
@ -826,4 +826,7 @@ def _add_apc_columns(
col_id = f"moy_ue_{ue.id}" col_id = f"moy_ue_{ue.id}"
titles[col_id] = ue.acronyme titles[col_id] = ue.acronyme
columns_ids.append(col_id) columns_ids.append(col_id)
row_coefs[f"moy_ue_{ue.id}"] = "m" row_coefs[f"moy_ue_{ue.id}"] = [uc for uc in ue_coefs if uc.ue_id == ue.id][
0
].coef
row_coefs[f"_moy_ue_{ue.id}_td_attrs"] = ' class="coef_mod_ue" '

View File

@ -1066,6 +1066,12 @@ table.notes_evaluation td.moy_ue {
color:rgb(1, 116, 96); color:rgb(1, 116, 96);
} }
td.coef_mod_ue {
font-style: normal;
font-weight: bold;
color: rgb(1, 116, 96);
}
h2.formsemestre, #gtrcontent h2 { h2.formsemestre, #gtrcontent h2 {
margin-top: 2px; margin-top: 2px;
font-size: 130%; font-size: 130%;

View File

@ -115,7 +115,7 @@ function showSynthese(data) {
${(dataUE.competence) ? dataUE.competence + " - " : ""}${ue} ${(dataUE.competence) ? dataUE.competence + " - " : ""}${ue}
</h3> </h3>
<div> <div>
<div class=moyenne>Moyenne&nbsp;:&nbsp;${dataUE.moyenne?.value || "-"}</div> <div class=moyenne>Moyenn&nbsp;:&nbsp;${dataUE.moyenne?.value || "-"}</div>
<div class=info> <div class=info>
Bonus&nbsp;:&nbsp;${dataUE.bonus || 0}&nbsp;- Bonus&nbsp;:&nbsp;${dataUE.bonus || 0}&nbsp;-
Malus&nbsp;:&nbsp;${dataUE.malus || 0} Malus&nbsp;:&nbsp;${dataUE.malus || 0}

View File

@ -94,9 +94,7 @@ def test_ue_moy(test_client):
# EXC à un module # EXC à un module
n1, n2 = 5.0, NOTES_NEUTRALISE n1, n2 = 5.0, NOTES_NEUTRALISE
etud_moy_ue = change_notes(n1, n2) etud_moy_ue = change_notes(n1, n2)
# Pour le moment, une note NEUTRALISE va entrainer le non-calcul assert (etud_moy_ue.values == n1).all()
# des moyennes.
assert np.isnan(etud_moy_ue.values).all()
# Désinscrit l'étudiant du module 2: # Désinscrit l'étudiant du module 2:
inscr = ModuleImplInscription.query.filter_by( inscr = ModuleImplInscription.query.filter_by(
moduleimpl_id=evaluation2.moduleimpl.id, etudid=etudid moduleimpl_id=evaluation2.moduleimpl.id, etudid=etudid