evaluation_listenotes: petite optim

This commit is contained in:
Emmanuel Viennet 2021-11-20 17:21:51 +01:00
parent 780a117fbd
commit 504b12cadb
6 changed files with 40 additions and 43 deletions

View File

@ -33,7 +33,6 @@ token_auth = HTTPTokenAuth()
@basic_auth.verify_password @basic_auth.verify_password
def verify_password(username, password): def verify_password(username, password):
# breakpoint()
user = User.query.filter_by(user_name=username).first() user = User.query.filter_by(user_name=username).first()
if user and user.check_password(password): if user and user.check_password(password):
return user return user

View File

@ -657,8 +657,8 @@ def log_unknown_etud():
def get_etud_info(etudid=False, code_nip=False, filled=False) -> list: def get_etud_info(etudid=False, code_nip=False, filled=False) -> list:
"""infos sur un etudiant (API). If not found, returns empty list. """infos sur un etudiant (API). If not found, returns empty list.
On peut specifier etudid ou code_nip On peut spécifier etudid ou code_nip
ou bien cherche dans les argumenst de la requête courante: ou bien cherche dans les arguments de la requête courante:
etudid, code_nip, code_ine (dans cet ordre). etudid, code_nip, code_ine (dans cet ordre).
""" """
if etudid is None: if etudid is None:

View File

@ -1424,6 +1424,8 @@ def do_evaluation_listeetuds_groups(
evaluation. evaluation.
Si include_dems, compte aussi les etudiants démissionnaires Si include_dems, compte aussi les etudiants démissionnaires
(sinon, par défaut, seulement les 'I') (sinon, par défaut, seulement les 'I')
Résultat: [ (etudid, etat) ], etat='I', 'D', 'DEF'
""" """
# nb: pour notes_table / do_evaluation_etat, getallstudents est vrai et include_dems faux # nb: pour notes_table / do_evaluation_etat, getallstudents est vrai et include_dems faux
fromtables = [ fromtables = [
@ -1448,7 +1450,7 @@ def do_evaluation_listeetuds_groups(
# requete complete # requete complete
req = ( req = (
"SELECT distinct Im.etudid FROM " "SELECT distinct Im.etudid, Isem.etat FROM "
+ ", ".join(fromtables) + ", ".join(fromtables)
+ """ WHERE Isem.etudid = Im.etudid + """ WHERE Isem.etudid = Im.etudid
and Im.moduleimpl_id = M.id and Im.moduleimpl_id = M.id
@ -1463,7 +1465,7 @@ def do_evaluation_listeetuds_groups(
cnx = ndb.GetDBConnexion() cnx = ndb.GetDBConnexion()
cursor = cnx.cursor() cursor = cnx.cursor()
cursor.execute(req, {"evaluation_id": evaluation_id}) cursor.execute(req, {"evaluation_id": evaluation_id})
return [x[0] for x in cursor] return cursor.fetchall()
def do_evaluation_listegroupes(evaluation_id, include_default=False): def do_evaluation_listegroupes(evaluation_id, include_default=False):

View File

@ -222,7 +222,7 @@ def _make_table_notes(
with_emails=False, with_emails=False,
group_ids=[], group_ids=[],
): ):
"""Generate table for evaluations marks""" """Table liste notes (une seule évaluation ou toutes celles d'un module)"""
if not evals: if not evals:
return "<p>Aucune évaluation !</p>" return "<p>Aucune évaluation !</p>"
E = evals[0] E = evals[0]
@ -247,7 +247,7 @@ def _make_table_notes(
gr_title = sco_groups.listgroups_abbrev(groups) gr_title = sco_groups.listgroups_abbrev(groups)
gr_title_filename = sco_groups.listgroups_filename(groups) gr_title_filename = sco_groups.listgroups_filename(groups)
etudids = sco_groups.do_evaluation_listeetuds_groups( etudid_etats = sco_groups.do_evaluation_listeetuds_groups(
E["evaluation_id"], groups, include_dems=True E["evaluation_id"], groups, include_dems=True
) )
@ -285,24 +285,20 @@ def _make_table_notes(
return str(r) return str(r)
K = keymgr() K = keymgr()
for etudid in etudids: for etudid, etat in etudid_etats:
css_row_class = None css_row_class = None
# infos identite etudiant # infos identite etudiant
etud = sco_etud.get_etud_info(etudid=etudid, filled=True)[0] etud = sco_etud.get_etud_info(etudid=etudid, filled=True)[0]
# infos inscription
inscr = sco_formsemestre_inscriptions.do_formsemestre_inscription_list(
{"etudid": etudid, "formsemestre_id": M["formsemestre_id"]}
)[0]
if inscr["etat"] == "I": # si inscrit, indique groupe if etat == "I": # si inscrit, indique groupe
groups = sco_groups.get_etud_groups(etudid, sem) groups = sco_groups.get_etud_groups(etudid, sem)
grc = sco_groups.listgroups_abbrev(groups) grc = sco_groups.listgroups_abbrev(groups)
else: else:
if inscr["etat"] == "D": if etat == "D":
grc = "DEM" # attention: ce code est re-ecrit plus bas, ne pas le changer (?) grc = "DEM" # attention: ce code est re-ecrit plus bas, ne pas le changer (?)
css_row_class = "etuddem" css_row_class = "etuddem"
else: else:
grc = inscr["etat"] grc = etat
code = "" # code pour listings anonyme, à la place du nom code = "" # code pour listings anonyme, à la place du nom
if sco_preferences.get_preference("anonymous_lst_code") == "INE": if sco_preferences.get_preference("anonymous_lst_code") == "INE":
@ -435,7 +431,7 @@ def _make_table_notes(
gl = "&with_emails%3Alist=yes" + gl gl = "&with_emails%3Alist=yes" + gl
if len(evals) == 1: if len(evals) == 1:
evalname = "%s-%s" % (Mod["code"], ndb.DateDMYtoISO(E["jour"])) evalname = "%s-%s" % (Mod["code"], ndb.DateDMYtoISO(E["jour"]))
hh = "%s, %s (%d étudiants)" % (E["description"], gr_title, len(etudids)) hh = "%s, %s (%d étudiants)" % (E["description"], gr_title, len(etudid_etats))
filename = scu.make_filename("notes_%s_%s" % (evalname, gr_title_filename)) filename = scu.make_filename("notes_%s_%s" % (evalname, gr_title_filename))
caption = hh caption = hh
pdf_title = "%(description)s (%(jour)s)" % e pdf_title = "%(description)s (%(jour)s)" % e
@ -713,10 +709,6 @@ def evaluation_check_absences(evaluation_id):
if not E["jour"]: if not E["jour"]:
return [], [], [], [], [] # evaluation sans date return [], [], [], [], [] # evaluation sans date
etudids = sco_groups.do_evaluation_listeetuds_groups(
evaluation_id, getallstudents=True
)
am, pm, demijournee = _eval_demijournee(E) am, pm, demijournee = _eval_demijournee(E)
# Liste les absences à ce moment: # Liste les absences à ce moment:
@ -736,7 +728,9 @@ def evaluation_check_absences(evaluation_id):
ExcNonSignalee = [] # note EXC mais pas noté absent ExcNonSignalee = [] # note EXC mais pas noté absent
ExcNonJust = [] # note EXC mais absent non justifie ExcNonJust = [] # note EXC mais absent non justifie
AbsButExc = [] # note ABS mais justifié AbsButExc = [] # note ABS mais justifié
for etudid in etudids: for etudid, _ in sco_groups.do_evaluation_listeetuds_groups(
evaluation_id, getallstudents=True
):
if etudid in NotesDB: if etudid in NotesDB:
val = NotesDB[etudid]["value"] val = NotesDB[etudid]["value"]
if ( if (
@ -761,7 +755,7 @@ def evaluation_check_absences(evaluation_id):
def evaluation_check_absences_html(evaluation_id, with_header=True, show_ok=True): def evaluation_check_absences_html(evaluation_id, with_header=True, show_ok=True):
"""Affiche etat verification absences d'une evaluation""" """Affiche état vérification absences d'une évaluation"""
E = sco_evaluation_db.do_evaluation_list({"evaluation_id": evaluation_id})[0] E = sco_evaluation_db.do_evaluation_list({"evaluation_id": evaluation_id})[0]
am, pm, demijournee = _eval_demijournee(E) am, pm, demijournee = _eval_demijournee(E)

View File

@ -303,24 +303,17 @@ class PlacementRunner:
get_all_students = None in [ get_all_students = None in [
g["group_name"] for g in self.groups g["group_name"] for g in self.groups
] # tous les etudiants ] # tous les etudiants
etudids = sco_groups.do_evaluation_listeetuds_groups( etudid_etats = sco_groups.do_evaluation_listeetuds_groups(
self.evaluation_id, self.evaluation_id,
self.groups, self.groups,
getallstudents=get_all_students, getallstudents=get_all_students,
include_dems=True, include_dems=True,
) )
listetud = [] # liste de couples (nom,prenom) listetud = [] # liste de couples (nom,prenom)
for etudid in etudids: for etudid, etat in etudid_etats:
# infos identite etudiant (xxx sous-optimal: 1/select par etudiant) # infos identite etudiant (xxx sous-optimal: 1/select par etudiant)
ident = sco_etud.etudident_list(ndb.GetDBConnexion(), {"etudid": etudid})[0] ident = sco_etud.etudident_list(ndb.GetDBConnexion(), {"etudid": etudid})[0]
# infos inscription if etat != "D":
inscr = sco_formsemestre_inscriptions.do_formsemestre_inscription_list(
{
"etudid": etudid,
"formsemestre_id": self.moduleimpl_data["formsemestre_id"],
}
)[0]
if inscr["etat"] != "D":
nom = ident["nom"].upper() nom = ident["nom"].upper()
prenom = ident["prenom"].lower().capitalize() prenom = ident["prenom"].lower().capitalize()
etudid = ident["etudid"] etudid = ident["etudid"]

View File

@ -309,11 +309,11 @@ def do_evaluation_set_missing(evaluation_id, value, dialog_confirmed=False):
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) NotesDB = sco_evaluation_db.do_evaluation_get_all_notes(evaluation_id)
etudids = sco_groups.do_evaluation_listeetuds_groups( etudid_etats = sco_groups.do_evaluation_listeetuds_groups(
evaluation_id, getallstudents=True, include_dems=False evaluation_id, getallstudents=True, include_dems=False
) )
notes = [] notes = []
for etudid in etudids: # 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 NotesDB: # pas de note
notes.append((etudid, value)) notes.append((etudid, value))
# Check value # Check value
@ -468,12 +468,15 @@ def _notes_add(user, evaluation_id: int, notes: list, comment=None, do_it=True):
*time.localtime()[:6] *time.localtime()[:6]
) # datetime.datetime.now().isoformat() ) # datetime.datetime.now().isoformat()
# Verifie inscription et valeur note # Verifie inscription et valeur note
_ = {}.fromkeys( inscrits = {
sco_groups.do_evaluation_listeetuds_groups( x[0]
for x in sco_groups.do_evaluation_listeetuds_groups(
evaluation_id, getallstudents=True, include_dems=True evaluation_id, getallstudents=True, include_dems=True
) )
) }
for (etudid, value) in notes: for (etudid, value) in notes:
if etudid not in inscrits:
raise NoteProcessError("etudiant non inscrit dans ce module")
if not ((value is None) or (type(value) == type(1.0))): if not ((value is None) or (type(value) == type(1.0))):
raise NoteProcessError( raise NoteProcessError(
"etudiant %s: valeur de note invalide (%s)" % (etudid, value) "etudiant %s: valeur de note invalide (%s)" % (etudid, value)
@ -816,9 +819,12 @@ def feuille_saisie_notes(evaluation_id, group_ids=[]):
gr_title_filename = "tous" gr_title_filename = "tous"
else: else:
getallstudents = False getallstudents = False
etudids = sco_groups.do_evaluation_listeetuds_groups( etudids = [
x[0]
for x in sco_groups.do_evaluation_listeetuds_groups(
evaluation_id, groups, getallstudents=getallstudents, include_dems=True evaluation_id, groups, getallstudents=getallstudents, include_dems=True
) )
]
# une liste de liste de chaines: lignes de la feuille de calcul # une liste de liste de chaines: lignes de la feuille de calcul
L = [] L = []
@ -1059,9 +1065,12 @@ def _form_saisie_notes(E, M, group_ids, destination=""):
evaluation_id = E["evaluation_id"] evaluation_id = E["evaluation_id"]
formsemestre_id = M["formsemestre_id"] formsemestre_id = M["formsemestre_id"]
etudids = sco_groups.do_evaluation_listeetuds_groups( etudids = [
x[0]
for x in sco_groups.do_evaluation_listeetuds_groups(
evaluation_id, getallstudents=True, include_dems=True evaluation_id, getallstudents=True, include_dems=True
) )
]
if not etudids: if not etudids:
return '<div class="ue_warning"><span>Aucun étudiant sélectionné !</span></div>' return '<div class="ue_warning"><span>Aucun étudiant sélectionné !</span></div>'