forked from ScoDoc/ScoDoc
Calcul moyenne UE BUT progressif (admet modules sans notes)
This commit is contained in:
parent
270d03057f
commit
11b3f64319
@ -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),
|
||||||
|
@ -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
|
||||||
)
|
)
|
||||||
|
@ -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
|
||||||
},
|
},
|
||||||
),
|
),
|
||||||
]
|
]
|
||||||
|
@ -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" '
|
||||||
|
@ -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%;
|
||||||
|
@ -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 : ${dataUE.moyenne?.value || "-"}</div>
|
<div class=moyenne>Moyenn : ${dataUE.moyenne?.value || "-"}</div>
|
||||||
<div class=info>
|
<div class=info>
|
||||||
Bonus : ${dataUE.bonus || 0} -
|
Bonus : ${dataUE.bonus || 0} -
|
||||||
Malus : ${dataUE.malus || 0}
|
Malus : ${dataUE.malus || 0}
|
||||||
|
@ -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
|
||||||
|
Loading…
Reference in New Issue
Block a user