forked from ScoDoc/DocScoDoc
Merge branch 'master' of https://scodoc.org/git/viennet/ScoDoc into refactor_nt
This commit is contained in:
commit
54b1ce7bfb
@ -131,8 +131,7 @@ def notes_sem_assemble_cube(modimpls_notes: list[pd.DataFrame]) -> np.ndarray:
|
|||||||
(DataFrames rendus par compute_module_moy, (etud x UE))
|
(DataFrames rendus par compute_module_moy, (etud x UE))
|
||||||
Resultat: ndarray (etud x module x UE)
|
Resultat: ndarray (etud x module x UE)
|
||||||
"""
|
"""
|
||||||
if len(modimpls_notes) == 0:
|
assert len(modimpls_notes)
|
||||||
return np.zeros((0, 0, 0), dtype=float)
|
|
||||||
modimpls_notes_arr = [df.values for df in modimpls_notes]
|
modimpls_notes_arr = [df.values for df in modimpls_notes]
|
||||||
modimpls_notes = np.stack(modimpls_notes_arr)
|
modimpls_notes = np.stack(modimpls_notes_arr)
|
||||||
# passe de (mod x etud x ue) à (etud x mod x UE)
|
# passe de (mod x etud x ue) à (etud x mod x UE)
|
||||||
@ -162,8 +161,13 @@ def notes_sem_load_cube(formsemestre: FormSemestre) -> tuple:
|
|||||||
etuds_moy_module = mod_results.compute_module_moy(evals_poids)
|
etuds_moy_module = mod_results.compute_module_moy(evals_poids)
|
||||||
modimpls_results[modimpl.id] = mod_results
|
modimpls_results[modimpl.id] = mod_results
|
||||||
modimpls_notes.append(etuds_moy_module)
|
modimpls_notes.append(etuds_moy_module)
|
||||||
|
if len(modimpls_notes):
|
||||||
|
cube = notes_sem_assemble_cube(modimpls_notes)
|
||||||
|
else:
|
||||||
|
nb_etuds = formsemestre.etuds.count()
|
||||||
|
cube = np.zeros((nb_etuds, 0, 0), dtype=float)
|
||||||
return (
|
return (
|
||||||
notes_sem_assemble_cube(modimpls_notes),
|
cube,
|
||||||
modimpls_evals_poids,
|
modimpls_evals_poids,
|
||||||
modimpls_results,
|
modimpls_results,
|
||||||
)
|
)
|
||||||
@ -195,8 +199,12 @@ def compute_ue_moys_apc(
|
|||||||
Resultat: DataFrame columns UE, rows etudid
|
Resultat: DataFrame columns UE, rows etudid
|
||||||
"""
|
"""
|
||||||
nb_etuds, nb_modules, nb_ues = sem_cube.shape
|
nb_etuds, nb_modules, nb_ues = sem_cube.shape
|
||||||
assert len(etuds) == nb_etuds
|
|
||||||
assert len(modimpls) == nb_modules
|
assert len(modimpls) == nb_modules
|
||||||
|
if nb_modules == 0 or nb_etuds == 0:
|
||||||
|
return pd.DataFrame(
|
||||||
|
index=modimpl_inscr_df.index, columns=modimpl_coefs_df.index
|
||||||
|
)
|
||||||
|
assert len(etuds) == nb_etuds
|
||||||
assert len(ues) == nb_ues
|
assert len(ues) == nb_ues
|
||||||
assert modimpl_inscr_df.shape[0] == nb_etuds
|
assert modimpl_inscr_df.shape[0] == nb_etuds
|
||||||
assert modimpl_inscr_df.shape[1] == nb_modules
|
assert modimpl_inscr_df.shape[1] == nb_modules
|
||||||
@ -204,10 +212,6 @@ def compute_ue_moys_apc(
|
|||||||
assert modimpl_coefs_df.shape[1] == nb_modules
|
assert modimpl_coefs_df.shape[1] == nb_modules
|
||||||
modimpl_inscr = modimpl_inscr_df.values
|
modimpl_inscr = modimpl_inscr_df.values
|
||||||
modimpl_coefs = modimpl_coefs_df.values
|
modimpl_coefs = modimpl_coefs_df.values
|
||||||
if nb_etuds == 0:
|
|
||||||
return pd.DataFrame(
|
|
||||||
index=modimpl_inscr_df.index, columns=modimpl_coefs_df.index
|
|
||||||
)
|
|
||||||
# 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:
|
||||||
|
@ -191,6 +191,7 @@ def compute_user_formula(
|
|||||||
return user_moy
|
return user_moy
|
||||||
|
|
||||||
|
|
||||||
|
# XXX OBSOLETE
|
||||||
def compute_moduleimpl_moyennes(nt, modimpl):
|
def compute_moduleimpl_moyennes(nt, modimpl):
|
||||||
"""Retourne dict { etudid : note_moyenne } pour tous les etuds inscrits
|
"""Retourne dict { etudid : note_moyenne } pour tous les etuds inscrits
|
||||||
au moduleimpl mod, la liste des evaluations "valides" (toutes notes entrées
|
au moduleimpl mod, la liste des evaluations "valides" (toutes notes entrées
|
||||||
@ -228,22 +229,23 @@ def compute_moduleimpl_moyennes(nt, modimpl):
|
|||||||
|
|
||||||
user_expr = moduleimpl_has_expression(modimpl)
|
user_expr = moduleimpl_has_expression(modimpl)
|
||||||
attente = False
|
attente = False
|
||||||
# recupere les notes de toutes les evaluations
|
# récupere les notes de toutes les evaluations
|
||||||
eval_rattr = None
|
eval_rattr = None
|
||||||
for e in evals:
|
for e in evals:
|
||||||
e["nb_inscrits"] = e["etat"]["nb_inscrits"]
|
e["nb_inscrits"] = e["etat"]["nb_inscrits"]
|
||||||
NotesDB = sco_evaluation_db.do_evaluation_get_all_notes(
|
# XXX OBSOLETE
|
||||||
|
notes_db = sco_evaluation_db.do_evaluation_get_all_notes(
|
||||||
e["evaluation_id"]
|
e["evaluation_id"]
|
||||||
) # toutes, y compris demissions
|
) # toutes, y compris demissions
|
||||||
# restreint aux étudiants encore inscrits à ce module
|
# restreint aux étudiants encore inscrits à ce module
|
||||||
notes = [
|
notes = [
|
||||||
NotesDB[etudid]["value"] for etudid in NotesDB if (etudid in insmod_set)
|
notes_db[etudid]["value"] for etudid in notes_db if (etudid in insmod_set)
|
||||||
]
|
]
|
||||||
e["nb_notes"] = len(notes)
|
e["nb_notes"] = len(notes)
|
||||||
e["nb_abs"] = len([x for x in notes if x is None])
|
e["nb_abs"] = len([x for x in notes if x is None])
|
||||||
e["nb_neutre"] = len([x for x in notes if x == NOTES_NEUTRALISE])
|
e["nb_neutre"] = len([x for x in notes if x == NOTES_NEUTRALISE])
|
||||||
e["nb_att"] = len([x for x in notes if x == NOTES_ATTENTE])
|
e["nb_att"] = len([x for x in notes if x == NOTES_ATTENTE])
|
||||||
e["notes"] = NotesDB
|
e["notes"] = notes_db
|
||||||
|
|
||||||
if e["etat"]["evalattente"]:
|
if e["etat"]["evalattente"]:
|
||||||
attente = True
|
attente = True
|
||||||
|
@ -85,7 +85,7 @@ def evaluation_check_absences(evaluation_id):
|
|||||||
Justs = set([x["etudid"] for x in Just]) # ensemble des etudiants avec justif
|
Justs = set([x["etudid"] for x in Just]) # ensemble des etudiants avec justif
|
||||||
|
|
||||||
# Les notes:
|
# Les notes:
|
||||||
NotesDB = sco_evaluation_db.do_evaluation_get_all_notes(evaluation_id)
|
notes_db = sco_evaluation_db.do_evaluation_get_all_notes(evaluation_id)
|
||||||
ValButAbs = [] # une note mais noté absent
|
ValButAbs = [] # une note mais noté absent
|
||||||
AbsNonSignalee = [] # note ABS mais pas noté absent
|
AbsNonSignalee = [] # note ABS mais pas noté absent
|
||||||
ExcNonSignalee = [] # note EXC mais pas noté absent
|
ExcNonSignalee = [] # note EXC mais pas noté absent
|
||||||
@ -94,8 +94,8 @@ def evaluation_check_absences(evaluation_id):
|
|||||||
for etudid, _ in sco_groups.do_evaluation_listeetuds_groups(
|
for etudid, _ in sco_groups.do_evaluation_listeetuds_groups(
|
||||||
evaluation_id, getallstudents=True
|
evaluation_id, getallstudents=True
|
||||||
):
|
):
|
||||||
if etudid in NotesDB:
|
if etudid in notes_db:
|
||||||
val = NotesDB[etudid]["value"]
|
val = notes_db[etudid]["value"]
|
||||||
if (
|
if (
|
||||||
val != None and val != scu.NOTES_NEUTRALISE and val != scu.NOTES_ATTENTE
|
val != None and val != scu.NOTES_NEUTRALISE and val != scu.NOTES_ATTENTE
|
||||||
) and etudid in As:
|
) and etudid in As:
|
||||||
|
@ -306,8 +306,8 @@ def do_evaluation_delete(evaluation_id):
|
|||||||
raise AccessDenied(
|
raise AccessDenied(
|
||||||
"Modification évaluation impossible pour %s" % current_user.get_nomplogin()
|
"Modification évaluation impossible pour %s" % current_user.get_nomplogin()
|
||||||
)
|
)
|
||||||
NotesDB = do_evaluation_get_all_notes(evaluation_id) # { etudid : value }
|
notes_db = do_evaluation_get_all_notes(evaluation_id) # { etudid : value }
|
||||||
notes = [x["value"] for x in NotesDB.values()]
|
notes = [x["value"] for x in notes_db.values()]
|
||||||
if notes:
|
if notes:
|
||||||
raise ScoValueError(
|
raise ScoValueError(
|
||||||
"Impossible de supprimer cette évaluation: il reste des notes"
|
"Impossible de supprimer cette évaluation: il reste des notes"
|
||||||
|
@ -653,11 +653,11 @@ def _add_eval_columns(
|
|||||||
notes = [] # liste des notes numeriques, pour calcul histogramme uniquement
|
notes = [] # liste des notes numeriques, pour calcul histogramme uniquement
|
||||||
evaluation_id = e["evaluation_id"]
|
evaluation_id = e["evaluation_id"]
|
||||||
e_o = Evaluation.query.get(evaluation_id) # XXX en attendant ré-écriture
|
e_o = Evaluation.query.get(evaluation_id) # XXX en attendant ré-écriture
|
||||||
NotesDB = sco_evaluation_db.do_evaluation_get_all_notes(evaluation_id)
|
notes_db = sco_evaluation_db.do_evaluation_get_all_notes(evaluation_id)
|
||||||
for row in rows:
|
for row in rows:
|
||||||
etudid = row["etudid"]
|
etudid = row["etudid"]
|
||||||
if etudid in NotesDB:
|
if etudid in notes_db:
|
||||||
val = NotesDB[etudid]["value"]
|
val = notes_db[etudid]["value"]
|
||||||
if val is None:
|
if val is None:
|
||||||
nb_abs += 1
|
nb_abs += 1
|
||||||
if val == scu.NOTES_ATTENTE:
|
if val == scu.NOTES_ATTENTE:
|
||||||
@ -674,12 +674,12 @@ def _add_eval_columns(
|
|||||||
nb_notes = nb_notes + 1
|
nb_notes = nb_notes + 1
|
||||||
sum_notes += val
|
sum_notes += val
|
||||||
val_fmt = scu.fmt_note(val, keep_numeric=keep_numeric)
|
val_fmt = scu.fmt_note(val, keep_numeric=keep_numeric)
|
||||||
comment = NotesDB[etudid]["comment"]
|
comment = notes_db[etudid]["comment"]
|
||||||
if comment is None:
|
if comment is None:
|
||||||
comment = ""
|
comment = ""
|
||||||
explanation = "%s (%s) %s" % (
|
explanation = "%s (%s) %s" % (
|
||||||
NotesDB[etudid]["date"].strftime("%d/%m/%y %Hh%M"),
|
notes_db[etudid]["date"].strftime("%d/%m/%y %Hh%M"),
|
||||||
sco_users.user_info(NotesDB[etudid]["uid"])["nomcomplet"],
|
sco_users.user_info(notes_db[etudid]["uid"])["nomcomplet"],
|
||||||
comment,
|
comment,
|
||||||
)
|
)
|
||||||
else:
|
else:
|
||||||
|
@ -308,13 +308,13 @@ def do_evaluation_set_missing(evaluation_id, value, dialog_confirmed=False):
|
|||||||
# XXX imaginer un redirect + msg erreur
|
# XXX imaginer un redirect + msg erreur
|
||||||
raise AccessDenied("Modification des notes impossible pour %s" % current_user)
|
raise AccessDenied("Modification des notes impossible pour %s" % current_user)
|
||||||
#
|
#
|
||||||
NotesDB = sco_evaluation_db.do_evaluation_get_all_notes(evaluation_id)
|
notes_db = sco_evaluation_db.do_evaluation_get_all_notes(evaluation_id)
|
||||||
etudid_etats = sco_groups.do_evaluation_listeetuds_groups(
|
etudid_etats = sco_groups.do_evaluation_listeetuds_groups(
|
||||||
evaluation_id, getallstudents=True, include_demdef=False
|
evaluation_id, getallstudents=True, include_demdef=False
|
||||||
)
|
)
|
||||||
notes = []
|
notes = []
|
||||||
for etudid, _ in etudid_etats: # pour tous les inscrits
|
for etudid, _ in etudid_etats: # pour tous les inscrits
|
||||||
if etudid not in NotesDB: # pas de note
|
if etudid not in notes_db: # pas de note
|
||||||
notes.append((etudid, value))
|
notes.append((etudid, value))
|
||||||
# Check value
|
# Check value
|
||||||
L, invalids, _, _, _ = _check_notes(notes, E, M["module"])
|
L, invalids, _, _, _ = _check_notes(notes, E, M["module"])
|
||||||
@ -393,18 +393,18 @@ def evaluation_suppress_alln(evaluation_id, dialog_confirmed=False):
|
|||||||
):
|
):
|
||||||
# On a le droit de modifier toutes les notes
|
# On a le droit de modifier toutes les notes
|
||||||
# recupere les etuds ayant une note
|
# recupere les etuds ayant une note
|
||||||
NotesDB = sco_evaluation_db.do_evaluation_get_all_notes(evaluation_id)
|
notes_db = sco_evaluation_db.do_evaluation_get_all_notes(evaluation_id)
|
||||||
elif sco_permissions_check.can_edit_notes(
|
elif sco_permissions_check.can_edit_notes(
|
||||||
current_user, E["moduleimpl_id"], allow_ens=True
|
current_user, E["moduleimpl_id"], allow_ens=True
|
||||||
):
|
):
|
||||||
# Enseignant associé au module: ne peut supprimer que les notes qu'il a saisi
|
# Enseignant associé au module: ne peut supprimer que les notes qu'il a saisi
|
||||||
NotesDB = sco_evaluation_db.do_evaluation_get_all_notes(
|
notes_db = sco_evaluation_db.do_evaluation_get_all_notes(
|
||||||
evaluation_id, by_uid=current_user.id
|
evaluation_id, by_uid=current_user.id
|
||||||
)
|
)
|
||||||
else:
|
else:
|
||||||
raise AccessDenied("Modification des notes impossible pour %s" % current_user)
|
raise AccessDenied("Modification des notes impossible pour %s" % current_user)
|
||||||
|
|
||||||
notes = [(etudid, scu.NOTES_SUPPRESS) for etudid in NotesDB.keys()]
|
notes = [(etudid, scu.NOTES_SUPPRESS) for etudid in notes_db.keys()]
|
||||||
|
|
||||||
if not dialog_confirmed:
|
if not dialog_confirmed:
|
||||||
nb_changed, nb_suppress, existing_decisions = notes_add(
|
nb_changed, nb_suppress, existing_decisions = notes_add(
|
||||||
@ -493,7 +493,7 @@ def notes_add(
|
|||||||
"etudiant %s: valeur de note invalide (%s)" % (etudid, value)
|
"etudiant %s: valeur de note invalide (%s)" % (etudid, value)
|
||||||
)
|
)
|
||||||
# Recherche notes existantes
|
# Recherche notes existantes
|
||||||
NotesDB = sco_evaluation_db.do_evaluation_get_all_notes(evaluation_id)
|
notes_db = sco_evaluation_db.do_evaluation_get_all_notes(evaluation_id)
|
||||||
# Met a jour la base
|
# Met a jour la base
|
||||||
cnx = ndb.GetDBConnexion()
|
cnx = ndb.GetDBConnexion()
|
||||||
cursor = cnx.cursor(cursor_factory=ndb.ScoDocCursor)
|
cursor = cnx.cursor(cursor_factory=ndb.ScoDocCursor)
|
||||||
@ -507,7 +507,7 @@ def notes_add(
|
|||||||
try:
|
try:
|
||||||
for (etudid, value) in notes:
|
for (etudid, value) in notes:
|
||||||
changed = False
|
changed = False
|
||||||
if etudid not in NotesDB:
|
if etudid not in notes_db:
|
||||||
# nouvelle note
|
# nouvelle note
|
||||||
if value != scu.NOTES_SUPPRESS:
|
if value != scu.NOTES_SUPPRESS:
|
||||||
if do_it:
|
if do_it:
|
||||||
@ -530,7 +530,7 @@ def notes_add(
|
|||||||
changed = True
|
changed = True
|
||||||
else:
|
else:
|
||||||
# il y a deja une note
|
# il y a deja une note
|
||||||
oldval = NotesDB[etudid]["value"]
|
oldval = notes_db[etudid]["value"]
|
||||||
if type(value) != type(oldval):
|
if type(value) != type(oldval):
|
||||||
changed = True
|
changed = True
|
||||||
elif type(value) == type(1.0) and (
|
elif type(value) == type(1.0) and (
|
||||||
|
Loading…
Reference in New Issue
Block a user