From e8e3423193bcec7f0cfdae1df3c2f092dcba5b27 Mon Sep 17 00:00:00 2001 From: Emmanuel Viennet Date: Fri, 15 Oct 2021 14:00:51 +0200 Subject: [PATCH] Un peu de nettoyage de d'optimisation (gain ~ 30-40% sur calcul NT). --- README.md | 6 +-- app/api/sco_api.py | 2 +- app/scodoc/notes_table.py | 6 +-- app/scodoc/sco_abs.py | 2 +- app/scodoc/sco_abs_views.py | 6 +-- app/scodoc/sco_cache.py | 2 +- app/scodoc/sco_compute_moy.py | 8 ++-- app/scodoc/sco_cost_formation.py | 4 +- app/scodoc/sco_edit_module.py | 4 +- app/scodoc/sco_evaluations.py | 25 +++++------ app/scodoc/sco_formsemestre_edit.py | 14 +++--- app/scodoc/sco_formsemestre_inscriptions.py | 8 ++-- app/scodoc/sco_formsemestre_status.py | 14 +++--- app/scodoc/sco_groups.py | 18 ++++---- app/scodoc/sco_groups_view.py | 2 +- app/scodoc/sco_liste_notes.py | 6 +-- app/scodoc/sco_moduleimpl.py | 44 +++++++++++------- app/scodoc/sco_moduleimpl_inscriptions.py | 6 +-- app/scodoc/sco_moduleimpl_status.py | 4 +- app/scodoc/sco_news.py | 2 +- app/scodoc/sco_permissions_check.py | 6 +-- app/scodoc/sco_placement.py | 2 +- app/scodoc/sco_saisie_notes.py | 26 +++++------ app/scodoc/sco_undo_notes.py | 2 +- app/views/notes.py | 27 ++++++----- bench.py | 13 ++++++ misc/example-api-1.py | 2 +- tests/bench/notes_table.py | 50 +++++++++++++++++++++ tests/unit/sco_fake_gen.py | 2 +- tests/unit/test_formations.py | 28 +++++------- 30 files changed, 194 insertions(+), 147 deletions(-) create mode 100644 bench.py create mode 100644 tests/bench/notes_table.py diff --git a/README.md b/README.md index a757f17e48..e28a92aacf 100644 --- a/README.md +++ b/README.md @@ -130,12 +130,12 @@ base de données (tous les départements, et les utilisateurs) avant de commence On utilise SQLAlchemy avec Alembic et Flask-Migrate. - flask db migrate -m "ScoDoc 9.0.x: ..." # ajuster le message ! + flask db migrate -m "message explicatif....." flask db upgrade -Ne pas oublier de commiter les migrations (`git add migrations` ...). +Ne pas oublier de d'ajouter le script de migration à git (`git add migrations/...`). -Mémo pour développeurs: séquence re-création d'une base (vérifiez votre `.env` +**Mémo**: séquence re-création d'une base (vérifiez votre `.env` ou variables d'environnement pour interroger la bonne base !). dropdb SCODOC_DEV diff --git a/app/api/sco_api.py b/app/api/sco_api.py index 46be85a7a2..e2619a0b0d 100644 --- a/app/api/sco_api.py +++ b/app/api/sco_api.py @@ -29,7 +29,7 @@ """ # PAS ENCORE IMPLEMENTEE, juste un essai # Pour P. Bouron, il faudrait en priorité l'équivalent de -# Scolarite/Notes/do_moduleimpl_withmodule_list +# Scolarite/Notes/moduleimpl_withmodule_list (alias scodoc7 do_moduleimpl_withmodule_list) # Scolarite/Notes/evaluation_create # Scolarite/Notes/evaluation_delete # Scolarite/Notes/formation_list diff --git a/app/scodoc/notes_table.py b/app/scodoc/notes_table.py index a06c2ccd5d..5e8f2f1901 100644 --- a/app/scodoc/notes_table.py +++ b/app/scodoc/notes_table.py @@ -102,7 +102,7 @@ def get_sem_ues_modimpls(formsemestre_id, modimpls=None): (utilisé quand on ne peut pas construire nt et faire nt.get_ues()) """ if modimpls is None: - modimpls = sco_moduleimpl.do_moduleimpl_list(formsemestre_id=formsemestre_id) + modimpls = sco_moduleimpl.moduleimpl_list(formsemestre_id=formsemestre_id) uedict = {} for modimpl in modimpls: mod = sco_edit_module.do_module_list(args={"module_id": modimpl["module_id"]})[ @@ -212,7 +212,7 @@ class NotesTable(object): valid_evals, mods_att, self.expr_diagnostics, - ) = sco_compute_moy.do_formsemestre_moyennes(self, formsemestre_id) + ) = sco_compute_moy.compute_modimpls_moyennes(self, formsemestre_id) self._mods_att = mods_att # liste des modules avec des notes en attente self._matmoys = {} # moyennes par matieres self._valid_evals = {} # { evaluation_id : eval } @@ -221,7 +221,7 @@ class NotesTable(object): uedict = {} # public member: { ue_id : ue } self.uedict = uedict for modimpl in self._modimpls: - mod = modimpl["module"] # has been added here by do_formsemestre_moyennes + mod = modimpl["module"] # has been added here by compute_modimpls_moyennes if not mod["ue_id"] in uedict: ue = sco_edit_ue.do_ue_list(args={"ue_id": mod["ue_id"]})[0] uedict[ue["ue_id"]] = ue diff --git a/app/scodoc/sco_abs.py b/app/scodoc/sco_abs.py index 5eb7f7f4de..7d5e7976ea 100644 --- a/app/scodoc/sco_abs.py +++ b/app/scodoc/sco_abs.py @@ -474,7 +474,7 @@ def _get_abs_description(a, cursor=None): desc = a["description"] if a["moduleimpl_id"] and a["moduleimpl_id"] != "NULL": # Trouver le nom du module - Mlist = sco_moduleimpl.do_moduleimpl_withmodule_list( + Mlist = sco_moduleimpl.moduleimpl_withmodule_list( moduleimpl_id=a["moduleimpl_id"] ) if Mlist: diff --git a/app/scodoc/sco_abs_views.py b/app/scodoc/sco_abs_views.py index d4632bbc18..50984e04eb 100644 --- a/app/scodoc/sco_abs_views.py +++ b/app/scodoc/sco_abs_views.py @@ -115,7 +115,7 @@ def doSignaleAbsence( J = "NON " M = "" if moduleimpl_id and moduleimpl_id != "NULL": - mod = sco_moduleimpl.do_moduleimpl_list(moduleimpl_id=moduleimpl_id)[0] + mod = sco_moduleimpl.moduleimpl_list(moduleimpl_id=moduleimpl_id)[0] formsemestre_id = mod["formsemestre_id"] nt = sco_cache.NotesTableCache.get(formsemestre_id) ues = nt.get_ues(etudid=etudid) @@ -939,7 +939,7 @@ def _tables_abs_etud( return "" ex = [] for ev in a["evals"]: - mod = sco_moduleimpl.do_moduleimpl_withmodule_list( + mod = sco_moduleimpl.moduleimpl_withmodule_list( moduleimpl_id=ev["moduleimpl_id"] )[0] if format == "html": @@ -957,7 +957,7 @@ def _tables_abs_etud( def descr_abs(a): ex = [] for ev in a.get("absent", []): - mod = sco_moduleimpl.do_moduleimpl_withmodule_list( + mod = sco_moduleimpl.moduleimpl_withmodule_list( moduleimpl_id=ev["moduleimpl_id"] )[0] if format == "html": diff --git a/app/scodoc/sco_cache.py b/app/scodoc/sco_cache.py index 043104ed47..53a26d7781 100644 --- a/app/scodoc/sco_cache.py +++ b/app/scodoc/sco_cache.py @@ -292,7 +292,7 @@ def invalidate_formsemestre( # was inval_cache(formsemestre_id=None, pdfonly=Fa class DefferedSemCacheManager: - """Experimental: pour effectuer des opérations indépendantes dans la + """Contexte pour effectuer des opérations indépendantes dans la même requete qui invalident le cache. Par exemple, quand on inscrit des étudiants un par un à un semestre, chaque inscription va invalider le cache, et la suivante va le reconstruire... pour l'invalider juste après. diff --git a/app/scodoc/sco_compute_moy.py b/app/scodoc/sco_compute_moy.py index 94d1f1f36d..86ce3bd1be 100644 --- a/app/scodoc/sco_compute_moy.py +++ b/app/scodoc/sco_compute_moy.py @@ -79,7 +79,7 @@ def formsemestre_expressions_use_abscounts(formsemestre_id): if expr and expr[0] != "#" and ab in expr: return True # 2- moyennes de modules - for mod in sco_moduleimpl.do_moduleimpl_list(formsemestre_id=formsemestre_id): + for mod in sco_moduleimpl.moduleimpl_list(formsemestre_id=formsemestre_id): if moduleimpl_has_expression(mod) and ab in mod["computation_expr"]: return True return False @@ -199,7 +199,7 @@ def do_moduleimpl_moyennes(nt, mod): moduleimpl_id = mod["moduleimpl_id"] is_malus = mod["module"]["module_type"] == scu.MODULE_MALUS sem = sco_formsemestre.get_formsemestre(mod["formsemestre_id"]) - etudids = sco_moduleimpl.do_moduleimpl_listeetuds( + etudids = sco_moduleimpl.moduleimpl_listeetuds( moduleimpl_id ) # tous, y compris demissions # Inscrits au semestre (pour traiter les demissions): @@ -365,7 +365,7 @@ def do_moduleimpl_moyennes(nt, mod): return R, valid_evals, attente, diag_info -def do_formsemestre_moyennes(nt, formsemestre_id): +def compute_modimpls_moyennes(nt, formsemestre_id): """retourne dict { moduleimpl_id : { etudid, note_moyenne_dans_ce_module } }, la liste des moduleimpls, la liste des evaluations valides, liste des moduleimpls avec notes en attente. @@ -375,7 +375,7 @@ def do_formsemestre_moyennes(nt, formsemestre_id): # args={"formsemestre_id": formsemestre_id} # ) # etudids = [x["etudid"] for x in inscr] - modimpls = sco_moduleimpl.do_moduleimpl_list(formsemestre_id=formsemestre_id) + modimpls = sco_moduleimpl.moduleimpl_list(formsemestre_id=formsemestre_id) # recupere les moyennes des etudiants de tous les modules D = {} valid_evals = [] diff --git a/app/scodoc/sco_cost_formation.py b/app/scodoc/sco_cost_formation.py index 1c28ed4f18..d53d38619a 100644 --- a/app/scodoc/sco_cost_formation.py +++ b/app/scodoc/sco_cost_formation.py @@ -59,9 +59,7 @@ def formsemestre_table_estim_cost( """ sem = sco_formsemestre.get_formsemestre(formsemestre_id) sco_formsemestre_status.fill_formsemestre(sem) - Mlist = sco_moduleimpl.do_moduleimpl_withmodule_list( - formsemestre_id=formsemestre_id - ) + Mlist = sco_moduleimpl.moduleimpl_withmodule_list(formsemestre_id=formsemestre_id) T = [] for M in Mlist: Mod = M["module"] diff --git a/app/scodoc/sco_edit_module.py b/app/scodoc/sco_edit_module.py index 6ec8bce3ee..1aeb20df66 100644 --- a/app/scodoc/sco_edit_module.py +++ b/app/scodoc/sco_edit_module.py @@ -257,7 +257,7 @@ def do_module_delete(oid): raise ScoLockedFormError() # S'il y a des moduleimpls, on ne peut pas detruire le module ! - mods = sco_moduleimpl.do_moduleimpl_list(module_id=oid) + mods = sco_moduleimpl.moduleimpl_list(module_id=oid) if mods: err_page = f"""

Destruction du module impossible car il est utilisé dans des semestres existants !

Il faut d'abord supprimer le semestre. Mais il est peut être préférable de @@ -580,7 +580,7 @@ def module_is_locked(module_id): def module_count_moduleimpls(module_id): "Number of moduleimpls using this module" - mods = sco_moduleimpl.do_moduleimpl_list(module_id=module_id) + mods = sco_moduleimpl.moduleimpl_list(module_id=module_id) return len(mods) diff --git a/app/scodoc/sco_evaluations.py b/app/scodoc/sco_evaluations.py index e2faf71b94..cf6be3f13a 100644 --- a/app/scodoc/sco_evaluations.py +++ b/app/scodoc/sco_evaluations.py @@ -179,7 +179,7 @@ def do_evaluation_list(args, sortkey=None): def do_evaluation_list_in_formsemestre(formsemestre_id): "list evaluations in this formsemestre" - mods = sco_moduleimpl.do_moduleimpl_list(formsemestre_id=formsemestre_id) + mods = sco_moduleimpl.moduleimpl_list(formsemestre_id=formsemestre_id) evals = [] for mod in mods: evals += do_evaluation_list(args={"moduleimpl_id": mod["moduleimpl_id"]}) @@ -213,7 +213,7 @@ def _check_evaluation_args(args): jour = args.get("jour", None) args["jour"] = jour if jour: - M = sco_moduleimpl.do_moduleimpl_list(moduleimpl_id=moduleimpl_id)[0] + M = sco_moduleimpl.moduleimpl_list(moduleimpl_id=moduleimpl_id)[0] sem = sco_formsemestre.get_formsemestre(M["formsemestre_id"]) d, m, y = [int(x) for x in sem["date_debut"].split("/")] date_debut = datetime.date(y, m, d) @@ -301,7 +301,7 @@ def do_evaluation_create( r = _evaluationEditor.create(cnx, args) # news - M = sco_moduleimpl.do_moduleimpl_list(moduleimpl_id=moduleimpl_id)[0] + M = sco_moduleimpl.moduleimpl_list(moduleimpl_id=moduleimpl_id)[0] mod = sco_edit_module.do_module_list(args={"module_id": M["module_id"]})[0] mod["moduleimpl_id"] = M["moduleimpl_id"] mod["url"] = "Notes/moduleimpl_status?moduleimpl_id=%(moduleimpl_id)s" % mod @@ -332,7 +332,7 @@ def do_evaluation_edit(args): cnx = ndb.GetDBConnexion() _evaluationEditor.edit(cnx, args) # inval cache pour ce semestre - M = sco_moduleimpl.do_moduleimpl_list(moduleimpl_id=moduleimpl_id)[0] + M = sco_moduleimpl.moduleimpl_list(moduleimpl_id=moduleimpl_id)[0] sco_cache.invalidate_formsemestre(formsemestre_id=M["formsemestre_id"]) @@ -357,7 +357,7 @@ def do_evaluation_delete(evaluation_id): _evaluationEditor.delete(cnx, evaluation_id) # inval cache pour ce semestre - M = sco_moduleimpl.do_moduleimpl_list(moduleimpl_id=moduleimpl_id)[0] + M = sco_moduleimpl.moduleimpl_list(moduleimpl_id=moduleimpl_id)[0] sco_cache.invalidate_formsemestre(formsemestre_id=M["formsemestre_id"]) # news mod = sco_edit_module.do_module_list(args={"module_id": M["module_id"]})[0] @@ -373,9 +373,6 @@ def do_evaluation_delete(evaluation_id): ) -_DEE_TOT = 0 - - def do_evaluation_etat(evaluation_id, partition_id=None, select_first_partition=False): """donne infos sur l'etat du evaluation { nb_inscrits, nb_notes, nb_abs, nb_neutre, nb_att, @@ -412,7 +409,7 @@ def do_evaluation_etat(evaluation_id, partition_id=None, select_first_partition= last_modif = None # ---- Liste des groupes complets et incomplets E = do_evaluation_list(args={"evaluation_id": evaluation_id})[0] - M = sco_moduleimpl.do_moduleimpl_list(moduleimpl_id=E["moduleimpl_id"])[0] + M = sco_moduleimpl.moduleimpl_list(moduleimpl_id=E["moduleimpl_id"])[0] Mod = sco_edit_module.do_module_list(args={"module_id": M["module_id"]})[0] is_malus = Mod["module_type"] == scu.MODULE_MALUS # True si module de malus formsemestre_id = M["formsemestre_id"] @@ -735,7 +732,7 @@ def formsemestre_evaluations_cal(formsemestre_id): if not e["jour"]: continue day = e["jour"].strftime("%Y-%m-%d") - mod = sco_moduleimpl.do_moduleimpl_withmodule_list( + mod = sco_moduleimpl.moduleimpl_withmodule_list( moduleimpl_id=e["moduleimpl_id"] )[0] txt = mod["module"]["code"] or mod["module"]["abbrev"] or "eval" @@ -812,7 +809,7 @@ def evaluation_date_first_completion(evaluation_id): # (pour avoir l'etat et le groupe) et aussi les inscriptions # au module (pour gerer les modules optionnels correctement) # E = do_evaluation_list(args={"evaluation_id": evaluation_id})[0] - # M = sco_moduleimpl.do_moduleimpl_list(moduleimpl_id=E["moduleimpl_id"])[0] + # M = sco_moduleimpl.moduleimpl_list(moduleimpl_id=E["moduleimpl_id"])[0] # formsemestre_id = M["formsemestre_id"] # insem = sco_formsemestre_inscriptions.do_formsemestre_inscription_listinscrits( formsemestre_id) # insmod = sco_moduleimpl.do_moduleimpl_inscription_list(moduleimpl_id=E["moduleimpl_id"]) @@ -854,7 +851,7 @@ def formsemestre_evaluations_delai_correction(formsemestre_id, format="html"): evals = nt.get_sem_evaluation_etat_list() T = [] for e in evals: - M = sco_moduleimpl.do_moduleimpl_list(moduleimpl_id=e["moduleimpl_id"])[0] + M = sco_moduleimpl.moduleimpl_list(moduleimpl_id=e["moduleimpl_id"])[0] Mod = sco_edit_module.do_module_list(args={"module_id": M["module_id"]})[0] if (e["evaluation_type"] != scu.EVALUATION_NORMALE) or ( Mod["module_type"] == scu.MODULE_MALUS @@ -1035,7 +1032,7 @@ def evaluation_describe(evaluation_id="", edit_in_place=True): E = do_evaluation_list({"evaluation_id": evaluation_id})[0] moduleimpl_id = E["moduleimpl_id"] - M = sco_moduleimpl.do_moduleimpl_list(moduleimpl_id=moduleimpl_id)[0] + M = sco_moduleimpl.moduleimpl_list(moduleimpl_id=moduleimpl_id)[0] Mod = sco_edit_module.do_module_list(args={"module_id": M["module_id"]})[0] formsemestre_id = M["formsemestre_id"] u = sco_users.user_info(M["responsable_id"]) @@ -1115,7 +1112,7 @@ def evaluation_create_form( the_eval = do_evaluation_list({"evaluation_id": evaluation_id})[0] moduleimpl_id = the_eval["moduleimpl_id"] # - M = sco_moduleimpl.do_moduleimpl_withmodule_list(moduleimpl_id=moduleimpl_id)[0] + M = sco_moduleimpl.moduleimpl_withmodule_list(moduleimpl_id=moduleimpl_id)[0] is_malus = M["module"]["module_type"] == scu.MODULE_MALUS # True si module de malus formsemestre_id = M["formsemestre_id"] min_note_max = scu.NOTES_PRECISION # le plus petit bareme possible diff --git a/app/scodoc/sco_formsemestre_edit.py b/app/scodoc/sco_formsemestre_edit.py index fb6c6a54b1..bcfdddb70e 100644 --- a/app/scodoc/sco_formsemestre_edit.py +++ b/app/scodoc/sco_formsemestre_edit.py @@ -171,7 +171,7 @@ def do_formsemestre_createwithmodules(edit=False): initvalues = sem semestre_id = initvalues["semestre_id"] # add associated modules to tf-checked: - ams = sco_moduleimpl.do_moduleimpl_list(formsemestre_id=formsemestre_id) + ams = sco_moduleimpl.moduleimpl_list(formsemestre_id=formsemestre_id) sem_module_ids = set([x["module_id"] for x in ams]) initvalues["tf-checked"] = ["MI" + str(x["module_id"]) for x in ams] for x in ams: @@ -751,7 +751,7 @@ def do_formsemestre_createwithmodules(edit=False): # (retire le "MI" du début du nom de champs) checkedmods = [int(x[2:]) for x in tf[2]["tf-checked"]] sco_formsemestre.do_formsemestre_edit(tf[2]) - ams = sco_moduleimpl.do_moduleimpl_list(formsemestre_id=formsemestre_id) + ams = sco_moduleimpl.moduleimpl_list(formsemestre_id=formsemestre_id) existingmods = [x["module_id"] for x in ams] mods_tocreate = [x for x in checkedmods if not x in existingmods] # modules a existants a modifier @@ -801,7 +801,7 @@ def do_formsemestre_createwithmodules(edit=False): ok, diag = formsemestre_delete_moduleimpls(formsemestre_id, mods_todelete) msg += diag for module_id in mods_toedit: - moduleimpl_id = sco_moduleimpl.do_moduleimpl_list( + moduleimpl_id = sco_moduleimpl.moduleimpl_list( formsemestre_id=formsemestre_id, module_id=module_id )[0]["moduleimpl_id"] modargs = { @@ -846,7 +846,7 @@ def formsemestre_delete_moduleimpls(formsemestre_id, module_ids_to_del): msg = [] for module_id in module_ids_to_del: # get id - moduleimpl_id = sco_moduleimpl.do_moduleimpl_list( + moduleimpl_id = sco_moduleimpl.moduleimpl_list( formsemestre_id=formsemestre_id, module_id=module_id )[0]["moduleimpl_id"] mod = sco_edit_module.do_module_list({"module_id": module_id})[0] @@ -1015,7 +1015,7 @@ def do_formsemestre_clone( formsemestre_id = sco_formsemestre.do_formsemestre_create(args) log("created formsemestre %s" % formsemestre_id) # 2- create moduleimpls - mods_orig = sco_moduleimpl.do_moduleimpl_list(formsemestre_id=orig_formsemestre_id) + mods_orig = sco_moduleimpl.moduleimpl_list(formsemestre_id=orig_formsemestre_id) for mod_orig in mods_orig: args = mod_orig.copy() args["formsemestre_id"] = formsemestre_id @@ -1191,7 +1191,7 @@ def _reassociate_moduleimpls(cnx, formsemestre_id, ues_old2new, modules_old2new) et met à jour les décisions de jury (validations d'UE). """ # re-associate moduleimpls to new modules: - modimpls = sco_moduleimpl.do_moduleimpl_list(formsemestre_id=formsemestre_id) + modimpls = sco_moduleimpl.moduleimpl_list(formsemestre_id=formsemestre_id) for mod in modimpls: mod["module_id"] = modules_old2new[mod["module_id"]] sco_moduleimpl.do_moduleimpl_edit(mod, formsemestre_id=formsemestre_id) @@ -1308,7 +1308,7 @@ def do_formsemestre_delete(formsemestre_id): sco_cache.EvaluationCache.invalidate_sem(formsemestre_id) # --- Destruction des modules de ce semestre - mods = sco_moduleimpl.do_moduleimpl_list(formsemestre_id=formsemestre_id) + mods = sco_moduleimpl.moduleimpl_list(formsemestre_id=formsemestre_id) for mod in mods: # evaluations evals = sco_evaluations.do_evaluation_list( diff --git a/app/scodoc/sco_formsemestre_inscriptions.py b/app/scodoc/sco_formsemestre_inscriptions.py index c6bd3fab0f..bbfb81b953 100644 --- a/app/scodoc/sco_formsemestre_inscriptions.py +++ b/app/scodoc/sco_formsemestre_inscriptions.py @@ -237,7 +237,7 @@ def do_formsemestre_inscription_with_modules( gdone[group_id] = 1 # inscription a tous les modules de ce semestre - modimpls = sco_moduleimpl.do_moduleimpl_withmodule_list( + modimpls = sco_moduleimpl.moduleimpl_withmodule_list( formsemestre_id=formsemestre_id ) for mod in modimpls: @@ -448,7 +448,7 @@ def formsemestre_inscription_option(etudid, formsemestre_id): ] # Cherche les moduleimpls et les inscriptions - mods = sco_moduleimpl.do_moduleimpl_withmodule_list(formsemestre_id=formsemestre_id) + mods = sco_moduleimpl.moduleimpl_withmodule_list(formsemestre_id=formsemestre_id) inscr = sco_moduleimpl.do_moduleimpl_inscription_list(etudid=etudid) # Formulaire modimpls_by_ue_ids = scu.DictDefault(defaultvalue=[]) # ue_id : [ moduleimpl_id ] @@ -680,7 +680,7 @@ def do_moduleimpl_incription_options( # inscriptions for moduleimpl_id in a_inscrire: # verifie que ce module existe bien - mods = sco_moduleimpl.do_moduleimpl_list(moduleimpl_id=moduleimpl_id) + mods = sco_moduleimpl.moduleimpl_list(moduleimpl_id=moduleimpl_id) if len(mods) != 1: raise ScoValueError( "inscription: invalid moduleimpl_id: %s" % moduleimpl_id @@ -693,7 +693,7 @@ def do_moduleimpl_incription_options( # desinscriptions for moduleimpl_id in a_desinscrire: # verifie que ce module existe bien - mods = sco_moduleimpl.do_moduleimpl_list(moduleimpl_id=moduleimpl_id) + mods = sco_moduleimpl.moduleimpl_list(moduleimpl_id=moduleimpl_id) if len(mods) != 1: raise ScoValueError( "desinscription: invalid moduleimpl_id: %s" % moduleimpl_id diff --git a/app/scodoc/sco_formsemestre_status.py b/app/scodoc/sco_formsemestre_status.py index 5aa948e432..d2b8609c49 100644 --- a/app/scodoc/sco_formsemestre_status.py +++ b/app/scodoc/sco_formsemestre_status.py @@ -453,7 +453,7 @@ def retreive_formsemestre_from_request() -> int: if "formsemestre_id" in args: formsemestre_id = args["formsemestre_id"] elif "moduleimpl_id" in args and args["moduleimpl_id"]: - modimpl = sco_moduleimpl.do_moduleimpl_list(moduleimpl_id=args["moduleimpl_id"]) + modimpl = sco_moduleimpl.moduleimpl_list(moduleimpl_id=args["moduleimpl_id"]) if not modimpl: return None # suppressed ? modimpl = modimpl[0] @@ -463,7 +463,7 @@ def retreive_formsemestre_from_request() -> int: if not E: return None # evaluation suppressed ? E = E[0] - modimpl = sco_moduleimpl.do_moduleimpl_list(moduleimpl_id=E["moduleimpl_id"])[0] + modimpl = sco_moduleimpl.moduleimpl_list(moduleimpl_id=E["moduleimpl_id"])[0] formsemestre_id = modimpl["formsemestre_id"] elif "group_id" in args: group = sco_groups.get_group(args["group_id"]) @@ -593,9 +593,7 @@ def formsemestre_description_table(formsemestre_id, with_evals=False): use_ue_coefs = sco_preferences.get_preference("use_ue_coefs", formsemestre_id) F = sco_formations.formation_list(args={"formation_id": sem["formation_id"]})[0] parcours = sco_codes_parcours.get_parcours_from_code(F["type_parcours"]) - Mlist = sco_moduleimpl.do_moduleimpl_withmodule_list( - formsemestre_id=formsemestre_id - ) + Mlist = sco_moduleimpl.moduleimpl_withmodule_list(formsemestre_id=formsemestre_id) R = [] sum_coef = 0 @@ -885,7 +883,7 @@ def html_expr_diagnostic(diagnostics): last_id, last_msg = None, None for diag in diagnostics: if "moduleimpl_id" in diag: - mod = sco_moduleimpl.do_moduleimpl_withmodule_list( + mod = sco_moduleimpl.moduleimpl_withmodule_list( moduleimpl_id=diag["moduleimpl_id"] )[0] H.append( @@ -982,9 +980,7 @@ def formsemestre_status(formsemestre_id=None): # porté du DTML cnx = ndb.GetDBConnexion() sem = sco_formsemestre.get_formsemestre(formsemestre_id, raise_soft_exc=True) - Mlist = sco_moduleimpl.do_moduleimpl_withmodule_list( - formsemestre_id=formsemestre_id - ) + Mlist = sco_moduleimpl.moduleimpl_withmodule_list(formsemestre_id=formsemestre_id) # inscrits = sco_formsemestre_inscriptions.do_formsemestre_inscription_list( # args={"formsemestre_id": formsemestre_id} # ) diff --git a/app/scodoc/sco_groups.py b/app/scodoc/sco_groups.py index dd1de1f33a..668bbbebd9 100644 --- a/app/scodoc/sco_groups.py +++ b/app/scodoc/sco_groups.py @@ -47,7 +47,7 @@ from flask import url_for, make_response import app.scodoc.sco_utils as scu import app.scodoc.notesdb as ndb -from app import log +from app import log, cache from app.scodoc.scolog import logdb from app.scodoc import html_sco_header from app.scodoc import sco_codes_parcours @@ -438,6 +438,7 @@ def etud_add_group_infos(etud, sem, sep=" "): return etud +@cache.memoize(timeout=50) # seconds def get_etud_groups_in_partition(partition_id): """Returns { etudid : group }, with all students in this partition""" infos = ndb.SimpleDictFetch( @@ -1391,6 +1392,7 @@ def do_evaluation_listeetuds_groups( Si include_dems, compte aussi les etudiants démissionnaires (sinon, par défaut, seulement les 'I') """ + # nb: pour notes_table / do_evaluation_etat, getallstudents est vrai et include_dems faux fromtables = [ "notes_moduleimpl_inscription Im", "notes_formsemestre_inscription Isem", @@ -1402,7 +1404,7 @@ def do_evaluation_listeetuds_groups( if not groups: return [] # no groups, so no students rg = ["gm.group_id = '%(group_id)s'" % g for g in groups] - rq = """and Isem.etudid = gm.etudid + rq = """and Isem.etudid = gm.etudid and gd.partition_id = p.id and p.formsemestre_id = Isem.formsemestre_id """ @@ -1415,7 +1417,7 @@ def do_evaluation_listeetuds_groups( req = ( "SELECT distinct Im.etudid FROM " + ", ".join(fromtables) - + """ WHERE Isem.etudid = Im.etudid + + """ WHERE Isem.etudid = Im.etudid and Im.moduleimpl_id = M.id and Isem.formsemestre_id = M.formsemestre_id and E.moduleimpl_id = M.id @@ -1426,10 +1428,9 @@ def do_evaluation_listeetuds_groups( req += " and Isem.etat='I'" req += r cnx = ndb.GetDBConnexion() - cursor = cnx.cursor(cursor_factory=ndb.ScoDocCursor) + cursor = cnx.cursor() cursor.execute(req, {"evaluation_id": evaluation_id}) - res = cursor.fetchall() - return [x[0] for x in res] + return [x[0] for x in cursor] def do_evaluation_listegroupes(evaluation_id, include_default=False): @@ -1443,7 +1444,7 @@ def do_evaluation_listegroupes(evaluation_id, include_default=False): else: c = " AND p.partition_name is not NULL" cnx = ndb.GetDBConnexion() - cursor = cnx.cursor(cursor_factory=ndb.ScoDocCursor) + cursor = cnx.cursor() cursor.execute( """SELECT DISTINCT gd.id AS group_id FROM group_descr gd, group_membership gm, partition p, @@ -1457,8 +1458,7 @@ def do_evaluation_listegroupes(evaluation_id, include_default=False): + c, {"evaluation_id": evaluation_id}, ) - res = cursor.fetchall() - group_ids = [x[0] for x in res] + group_ids = [x[0] for x in cursor] return listgroups(group_ids) diff --git a/app/scodoc/sco_groups_view.py b/app/scodoc/sco_groups_view.py index 914447299f..4fd4e7d629 100644 --- a/app/scodoc/sco_groups_view.py +++ b/app/scodoc/sco_groups_view.py @@ -304,7 +304,7 @@ class DisplayedGroupsInfos(object): else: group_ids = [int(g) for g in group_ids] if not formsemestre_id and moduleimpl_id: - mods = sco_moduleimpl.do_moduleimpl_list(moduleimpl_id=moduleimpl_id) + mods = sco_moduleimpl.moduleimpl_list(moduleimpl_id=moduleimpl_id) if len(mods) != 1: raise ValueError("invalid moduleimpl_id") formsemestre_id = mods[0]["formsemestre_id"] diff --git a/app/scodoc/sco_liste_notes.py b/app/scodoc/sco_liste_notes.py index a9ea6ce846..04f94fff8e 100644 --- a/app/scodoc/sco_liste_notes.py +++ b/app/scodoc/sco_liste_notes.py @@ -228,7 +228,7 @@ def _make_table_notes( return "

Aucune évaluation !

" E = evals[0] moduleimpl_id = E["moduleimpl_id"] - M = sco_moduleimpl.do_moduleimpl_list(moduleimpl_id=moduleimpl_id)[0] + M = sco_moduleimpl.moduleimpl_list(moduleimpl_id=moduleimpl_id)[0] Mod = sco_edit_module.do_module_list(args={"module_id": M["module_id"]})[0] sem = sco_formsemestre.get_formsemestre(M["formsemestre_id"]) # (debug) check that all evals are in same module: @@ -872,9 +872,7 @@ def formsemestre_check_absences_html(formsemestre_id):

""", ] # Modules, dans l'ordre - Mlist = sco_moduleimpl.do_moduleimpl_withmodule_list( - formsemestre_id=formsemestre_id - ) + Mlist = sco_moduleimpl.moduleimpl_withmodule_list(formsemestre_id=formsemestre_id) for M in Mlist: evals = sco_evaluations.do_evaluation_list( {"moduleimpl_id": M["moduleimpl_id"]} diff --git a/app/scodoc/sco_moduleimpl.py b/app/scodoc/sco_moduleimpl.py index b1d0ea474a..87a11bf7cb 100644 --- a/app/scodoc/sco_moduleimpl.py +++ b/app/scodoc/sco_moduleimpl.py @@ -100,7 +100,7 @@ def do_moduleimpl_delete(oid, formsemestre_id=None): ) # > moduleimpl_delete -def do_moduleimpl_list(moduleimpl_id=None, formsemestre_id=None, module_id=None): +def moduleimpl_list(moduleimpl_id=None, formsemestre_id=None, module_id=None): "list moduleimpls" args = locals() cnx = ndb.GetDBConnexion() @@ -122,10 +122,11 @@ def do_moduleimpl_edit(args, formsemestre_id=None, cnx=None): ) # > modif moduleimpl -def do_moduleimpl_withmodule_list( +def moduleimpl_withmodule_list( moduleimpl_id=None, formsemestre_id=None, module_id=None ): - """Liste les moduleimpls et ajoute dans chacun le module correspondant + """Liste les moduleimpls et ajoute dans chacun + l'UE, la matière et le module auxquels ils appartiennent. Tri la liste par semestre/UE/numero_matiere/numero_module. Attention: Cette fonction fait partie de l'API ScoDoc 7 et est publiée. @@ -134,22 +135,33 @@ def do_moduleimpl_withmodule_list( from app.scodoc import sco_edit_matiere from app.scodoc import sco_edit_module - args = locals() - modimpls = do_moduleimpl_list( + modimpls = moduleimpl_list( **{ "moduleimpl_id": moduleimpl_id, "formsemestre_id": formsemestre_id, "module_id": module_id, } ) - for mo in modimpls: - mo["module"] = sco_edit_module.do_module_list( - args={"module_id": mo["module_id"]} - )[0] - mo["ue"] = sco_edit_ue.do_ue_list(args={"ue_id": mo["module"]["ue_id"]})[0] - mo["matiere"] = sco_edit_matiere.do_matiere_list( - args={"matiere_id": mo["module"]["matiere_id"]} - )[0] + ues = {} + matieres = {} + modules = {} + for mi in modimpls: + module_id = mi["module_id"] + if not mi["module_id"] in modules: + modules[module_id] = sco_edit_module.do_module_list( + args={"module_id": module_id} + )[0] + mi["module"] = modules[module_id] + ue_id = mi["module"]["ue_id"] + if not ue_id in ues: + ues[ue_id] = sco_edit_ue.do_ue_list(args={"ue_id": ue_id})[0] + mi["ue"] = ues[ue_id] + matiere_id = mi["module"]["matiere_id"] + if not matiere_id in matieres: + matieres[matiere_id] = sco_edit_matiere.do_matiere_list( + args={"matiere_id": matiere_id} + )[0] + mi["matiere"] = matieres[matiere_id] # tri par semestre/UE/numero_matiere/numero_module modimpls.sort( @@ -173,7 +185,7 @@ def do_moduleimpl_inscription_list(moduleimpl_id=None, etudid=None): return _moduleimpl_inscriptionEditor.list(cnx, args) -def do_moduleimpl_listeetuds(moduleimpl_id): +def moduleimpl_listeetuds(moduleimpl_id): "retourne liste des etudids inscrits a ce module" req = """SELECT DISTINCT Im.etudid FROM notes_moduleimpl_inscription Im, @@ -306,7 +318,7 @@ def can_change_module_resp(moduleimpl_id): """Check if current user can modify module resp. (raise exception if not). = Admin, et dir des etud. (si option l'y autorise) """ - M = do_moduleimpl_withmodule_list(moduleimpl_id=moduleimpl_id)[0] + M = moduleimpl_withmodule_list(moduleimpl_id=moduleimpl_id)[0] # -- check lock sem = sco_formsemestre.get_formsemestre(M["formsemestre_id"]) if not sem["etat"]: @@ -322,7 +334,7 @@ def can_change_module_resp(moduleimpl_id): def can_change_ens(moduleimpl_id, raise_exc=True): "check if current user can modify ens list (raise exception if not)" - M = do_moduleimpl_withmodule_list(moduleimpl_id=moduleimpl_id)[0] + M = moduleimpl_withmodule_list(moduleimpl_id=moduleimpl_id)[0] # -- check lock sem = sco_formsemestre.get_formsemestre(M["formsemestre_id"]) if not sem["etat"]: diff --git a/app/scodoc/sco_moduleimpl_inscriptions.py b/app/scodoc/sco_moduleimpl_inscriptions.py index 93d420d0e0..1517e62686 100644 --- a/app/scodoc/sco_moduleimpl_inscriptions.py +++ b/app/scodoc/sco_moduleimpl_inscriptions.py @@ -63,7 +63,7 @@ def moduleimpl_inscriptions_edit(moduleimpl_id, etuds=[], submitted=False): * Si pas les droits: idem en readonly """ - M = sco_moduleimpl.do_moduleimpl_list(moduleimpl_id=moduleimpl_id)[0] + M = sco_moduleimpl.moduleimpl_list(moduleimpl_id=moduleimpl_id)[0] formsemestre_id = M["formsemestre_id"] mod = sco_edit_module.do_module_list(args={"module_id": M["module_id"]})[0] sem = sco_formsemestre.get_formsemestre(formsemestre_id) @@ -263,9 +263,7 @@ def moduleimpl_inscriptions_stats(formsemestre_id): can_change = authuser.has_permission(Permission.ScoEtudInscrit) and sem["etat"] # Liste des modules - Mlist = sco_moduleimpl.do_moduleimpl_withmodule_list( - formsemestre_id=formsemestre_id - ) + Mlist = sco_moduleimpl.moduleimpl_withmodule_list(formsemestre_id=formsemestre_id) # Decrit les inscriptions aux modules: commons = [] # modules communs a tous les etuds du semestre options = [] # modules ou seuls quelques etudiants sont inscrits diff --git a/app/scodoc/sco_moduleimpl_status.py b/app/scodoc/sco_moduleimpl_status.py index c358b25c04..a54a0e431e 100644 --- a/app/scodoc/sco_moduleimpl_status.py +++ b/app/scodoc/sco_moduleimpl_status.py @@ -58,7 +58,7 @@ from app.scodoc import sco_users def moduleimpl_evaluation_menu(evaluation_id, nbnotes=0): "Menu avec actions sur une evaluation" E = sco_evaluations.do_evaluation_list({"evaluation_id": evaluation_id})[0] - modimpl = sco_moduleimpl.do_moduleimpl_list(moduleimpl_id=E["moduleimpl_id"])[0] + modimpl = sco_moduleimpl.moduleimpl_list(moduleimpl_id=E["moduleimpl_id"])[0] group_id = sco_groups.get_default_group(modimpl["formsemestre_id"]) @@ -156,7 +156,7 @@ def moduleimpl_evaluation_menu(evaluation_id, nbnotes=0): def moduleimpl_status(moduleimpl_id=None, partition_id=None): """Tableau de bord module (liste des evaluations etc)""" - M = sco_moduleimpl.do_moduleimpl_list(moduleimpl_id=moduleimpl_id)[0] + M = sco_moduleimpl.moduleimpl_list(moduleimpl_id=moduleimpl_id)[0] formsemestre_id = M["formsemestre_id"] Mod = sco_edit_module.do_module_list(args={"module_id": M["module_id"]})[0] sem = sco_formsemestre.get_formsemestre(formsemestre_id) diff --git a/app/scodoc/sco_news.py b/app/scodoc/sco_news.py index f2c19cf4cd..e063a81dc7 100644 --- a/app/scodoc/sco_news.py +++ b/app/scodoc/sco_news.py @@ -174,7 +174,7 @@ def _get_formsemestre_infos_from_news(n): elif n["type"] == NEWS_NOTE: moduleimpl_id = n["object"] if n["object"]: - mods = sco_moduleimpl.do_moduleimpl_list(moduleimpl_id=moduleimpl_id) + mods = sco_moduleimpl.moduleimpl_list(moduleimpl_id=moduleimpl_id) if not mods: return {} # module does not exists anymore return {} # pas d'indication du module diff --git a/app/scodoc/sco_permissions_check.py b/app/scodoc/sco_permissions_check.py index 0bf77b3907..5c166dbe3a 100644 --- a/app/scodoc/sco_permissions_check.py +++ b/app/scodoc/sco_permissions_check.py @@ -26,7 +26,7 @@ def can_edit_notes(authuser, moduleimpl_id, allow_ens=True): from app.scodoc import sco_formsemestre from app.scodoc import sco_parcours_dut - M = sco_moduleimpl.do_moduleimpl_list(moduleimpl_id=moduleimpl_id)[0] + M = sco_moduleimpl.moduleimpl_list(moduleimpl_id=moduleimpl_id)[0] sem = sco_formsemestre.get_formsemestre(M["formsemestre_id"]) if not sem["etat"]: return False # semestre verrouillé @@ -64,7 +64,7 @@ def can_edit_evaluation(moduleimpl_id=None): # acces pour resp. moduleimpl et resp. form semestre (dir etud) if moduleimpl_id is None: raise ValueError("no moduleimpl specified") # bug - M = sco_moduleimpl.do_moduleimpl_list(moduleimpl_id=moduleimpl_id)[0] + M = sco_moduleimpl.moduleimpl_list(moduleimpl_id=moduleimpl_id)[0] sem = sco_formsemestre.get_formsemestre(M["formsemestre_id"]) if ( @@ -200,4 +200,4 @@ def can_handle_passwd(user, allow_admindepts=False): if (current_user.dept == user.dept) or allow_admindepts: return True else: - return False \ No newline at end of file + return False diff --git a/app/scodoc/sco_placement.py b/app/scodoc/sco_placement.py index c2ef9d937d..e09df0e88b 100644 --- a/app/scodoc/sco_placement.py +++ b/app/scodoc/sco_placement.py @@ -244,7 +244,7 @@ class PlacementRunner: # gr_title = sco_groups.listgroups_abbrev(d['groups']) self.current_user = current_user self.moduleimpl_id = self.eval_data["moduleimpl_id"] - self.moduleimpl_data = sco_moduleimpl.do_moduleimpl_list( + self.moduleimpl_data = sco_moduleimpl.moduleimpl_list( moduleimpl_id=self.moduleimpl_id )[0] self.module_data = sco_edit_module.do_module_list( diff --git a/app/scodoc/sco_saisie_notes.py b/app/scodoc/sco_saisie_notes.py index 90dec73078..6c6638cd12 100644 --- a/app/scodoc/sco_saisie_notes.py +++ b/app/scodoc/sco_saisie_notes.py @@ -177,9 +177,7 @@ def do_evaluation_upload_xls(): evaluation_id = int(vals["evaluation_id"]) comment = vals["comment"] E = sco_evaluations.do_evaluation_list({"evaluation_id": evaluation_id})[0] - M = sco_moduleimpl.do_moduleimpl_withmodule_list(moduleimpl_id=E["moduleimpl_id"])[ - 0 - ] + M = sco_moduleimpl.moduleimpl_withmodule_list(moduleimpl_id=E["moduleimpl_id"])[0] # Check access # (admin, respformation, and responsable_id) if not sco_permissions_check.can_edit_notes(authuser, E["moduleimpl_id"]): @@ -253,7 +251,7 @@ def do_evaluation_upload_xls(): ) # news E = sco_evaluations.do_evaluation_list({"evaluation_id": evaluation_id})[0] - M = sco_moduleimpl.do_moduleimpl_list(moduleimpl_id=E["moduleimpl_id"])[0] + M = sco_moduleimpl.moduleimpl_list(moduleimpl_id=E["moduleimpl_id"])[0] mod = sco_edit_module.do_module_list(args={"module_id": M["module_id"]})[0] mod["moduleimpl_id"] = M["moduleimpl_id"] mod["url"] = url_for( @@ -292,9 +290,7 @@ def do_evaluation_upload_xls(): def do_evaluation_set_missing(evaluation_id, value, dialog_confirmed=False): """Initialisation des notes manquantes""" E = sco_evaluations.do_evaluation_list({"evaluation_id": evaluation_id})[0] - M = sco_moduleimpl.do_moduleimpl_withmodule_list(moduleimpl_id=E["moduleimpl_id"])[ - 0 - ] + M = sco_moduleimpl.moduleimpl_withmodule_list(moduleimpl_id=E["moduleimpl_id"])[0] # Check access # (admin, respformation, and responsable_id) if not sco_permissions_check.can_edit_notes(current_user, E["moduleimpl_id"]): @@ -340,7 +336,7 @@ def do_evaluation_set_missing(evaluation_id, value, dialog_confirmed=False): comment = "Initialisation notes manquantes" nb_changed, _, _ = _notes_add(current_user, evaluation_id, L, comment) # news - M = sco_moduleimpl.do_moduleimpl_list(moduleimpl_id=E["moduleimpl_id"])[0] + M = sco_moduleimpl.moduleimpl_list(moduleimpl_id=E["moduleimpl_id"])[0] mod = sco_edit_module.do_module_list(args={"module_id": M["module_id"]})[0] mod["moduleimpl_id"] = M["moduleimpl_id"] mod["url"] = url_for( @@ -429,7 +425,7 @@ def evaluation_suppress_alln(evaluation_id, dialog_confirmed=False): % E["moduleimpl_id"] ] # news - M = sco_moduleimpl.do_moduleimpl_list(moduleimpl_id=E["moduleimpl_id"])[0] + M = sco_moduleimpl.moduleimpl_list(moduleimpl_id=E["moduleimpl_id"])[0] mod = sco_edit_module.do_module_list(args={"module_id": M["module_id"]})[0] mod["moduleimpl_id"] = M["moduleimpl_id"] mod["url"] = "Notes/moduleimpl_status?moduleimpl_id=%(moduleimpl_id)s" % mod @@ -476,7 +472,7 @@ def _notes_add(user, evaluation_id: int, notes: list, comment=None, do_it=True): nb_changed = 0 nb_suppress = 0 E = sco_evaluations.do_evaluation_list({"evaluation_id": evaluation_id})[0] - M = sco_moduleimpl.do_moduleimpl_list(moduleimpl_id=E["moduleimpl_id"])[0] + M = sco_moduleimpl.moduleimpl_list(moduleimpl_id=E["moduleimpl_id"])[0] existing_decisions = ( [] ) # etudids pour lesquels il y a une decision de jury et que la note change @@ -598,7 +594,7 @@ def saisie_notes_tableur(evaluation_id, group_ids=()): if not evals: raise ScoValueError("invalid evaluation_id") E = evals[0] - M = sco_moduleimpl.do_moduleimpl_list(moduleimpl_id=E["moduleimpl_id"])[0] + M = sco_moduleimpl.moduleimpl_list(moduleimpl_id=E["moduleimpl_id"])[0] formsemestre_id = M["formsemestre_id"] if not sco_permissions_check.can_edit_notes(current_user, E["moduleimpl_id"]): return ( @@ -769,7 +765,7 @@ def feuille_saisie_notes(evaluation_id, group_ids=[]): if not evals: raise ScoValueError("invalid evaluation_id") E = evals[0] - M = sco_moduleimpl.do_moduleimpl_list(moduleimpl_id=E["moduleimpl_id"])[0] + M = sco_moduleimpl.moduleimpl_list(moduleimpl_id=E["moduleimpl_id"])[0] formsemestre_id = M["formsemestre_id"] Mod = sco_edit_module.do_module_list(args={"module_id": M["module_id"]})[0] sem = sco_formsemestre.get_formsemestre(M["formsemestre_id"]) @@ -868,9 +864,7 @@ def saisie_notes(evaluation_id, group_ids=[]): if not evals: raise ScoValueError("invalid evaluation_id") E = evals[0] - M = sco_moduleimpl.do_moduleimpl_withmodule_list(moduleimpl_id=E["moduleimpl_id"])[ - 0 - ] + M = sco_moduleimpl.moduleimpl_withmodule_list(moduleimpl_id=E["moduleimpl_id"])[0] formsemestre_id = M["formsemestre_id"] # Check access # (admin, respformation, and responsable_id) @@ -1230,7 +1224,7 @@ def save_note(etudid=None, evaluation_id=None, value=None, comment=""): % (evaluation_id, etudid, authuser, value) ) E = sco_evaluations.do_evaluation_list({"evaluation_id": evaluation_id})[0] - M = sco_moduleimpl.do_moduleimpl_list(moduleimpl_id=E["moduleimpl_id"])[0] + M = sco_moduleimpl.moduleimpl_list(moduleimpl_id=E["moduleimpl_id"])[0] Mod = sco_edit_module.do_module_list(args={"module_id": M["module_id"]})[0] Mod["url"] = url_for( "notes.moduleimpl_status", diff --git a/app/scodoc/sco_undo_notes.py b/app/scodoc/sco_undo_notes.py index add8757240..1f410c7048 100644 --- a/app/scodoc/sco_undo_notes.py +++ b/app/scodoc/sco_undo_notes.py @@ -149,7 +149,7 @@ def list_operations(evaluation_id): def evaluation_list_operations(evaluation_id): """Page listing operations on evaluation""" E = sco_evaluations.do_evaluation_list({"evaluation_id": evaluation_id})[0] - M = sco_moduleimpl.do_moduleimpl_list(moduleimpl_id=E["moduleimpl_id"])[0] + M = sco_moduleimpl.moduleimpl_list(moduleimpl_id=E["moduleimpl_id"])[0] Ops = list_operations(evaluation_id) diff --git a/app/views/notes.py b/app/views/notes.py index ad2d82f05e..ece1029ee5 100644 --- a/app/views/notes.py +++ b/app/views/notes.py @@ -1059,11 +1059,11 @@ def edit_moduleimpl_expr(moduleimpl_id): @scodoc7func def view_module_abs(moduleimpl_id, format="html"): """Visualisation des absences a un module""" - M = sco_moduleimpl.do_moduleimpl_withmodule_list(moduleimpl_id=moduleimpl_id)[0] + M = sco_moduleimpl.moduleimpl_withmodule_list(moduleimpl_id=moduleimpl_id)[0] sem = sco_formsemestre.get_formsemestre(M["formsemestre_id"]) debut_sem = ndb.DateDMYtoISO(sem["date_debut"]) fin_sem = ndb.DateDMYtoISO(sem["date_fin"]) - list_insc = sco_moduleimpl.do_moduleimpl_listeetuds(moduleimpl_id) + list_insc = sco_moduleimpl.moduleimpl_listeetuds(moduleimpl_id) T = [] for etudid in list_insc: @@ -1213,7 +1213,7 @@ def formsemestre_enseignants_list(formsemestre_id, format="html"): """ sem = sco_formsemestre.get_formsemestre(formsemestre_id) # resp. de modules: - mods = sco_moduleimpl.do_moduleimpl_withmodule_list(formsemestre_id=formsemestre_id) + mods = sco_moduleimpl.moduleimpl_withmodule_list(formsemestre_id=formsemestre_id) sem_ens = {} for mod in mods: if not mod["responsable_id"] in sem_ens: @@ -1527,7 +1527,7 @@ def evaluation_delete(evaluation_id): if not El: raise ValueError("Evalution inexistante ! (%s)" % evaluation_id) E = El[0] - M = sco_moduleimpl.do_moduleimpl_list(moduleimpl_id=E["moduleimpl_id"])[0] + M = sco_moduleimpl.moduleimpl_list(moduleimpl_id=E["moduleimpl_id"])[0] Mod = sco_edit_module.do_module_list(args={"module_id": M["module_id"]})[0] tit = "Suppression de l'évaluation %(description)s (%(jour)s)" % E etat = sco_evaluations.do_evaluation_etat(evaluation_id) @@ -2424,7 +2424,7 @@ def check_sem_integrity(formsemestre_id, fix=False): """ sem = sco_formsemestre.get_formsemestre(formsemestre_id) - modimpls = sco_moduleimpl.do_moduleimpl_list(formsemestre_id=formsemestre_id) + modimpls = sco_moduleimpl.moduleimpl_list(formsemestre_id=formsemestre_id) bad_ue = [] bad_sem = [] formations_set = set() # les formations mentionnées dans les UE et modules @@ -2534,9 +2534,7 @@ def check_formsemestre_integrity(formsemestre_id): # de formations diag = [] - Mlist = sco_moduleimpl.do_moduleimpl_withmodule_list( - formsemestre_id=formsemestre_id - ) + Mlist = sco_moduleimpl.moduleimpl_withmodule_list(formsemestre_id=formsemestre_id) for mod in Mlist: if mod["module"]["ue_id"] != mod["matiere"]["ue_id"]: diag.append( @@ -2593,14 +2591,14 @@ def check_integrity_all(): # -------------------------------------------------------------------- # Support for legacy ScoDoc 7 API # -------------------------------------------------------------------- -@bp.route("/do_moduleimpl_list") +@bp.route("/moduleimpl_list") @scodoc @permission_required(Permission.ScoView) @scodoc7func -def do_moduleimpl_list( +def moduleimpl_list( moduleimpl_id=None, formsemestre_id=None, module_id=None, format="json" ): - data = sco_moduleimpl.do_moduleimpl_list( + data = sco_moduleimpl.moduleimpl_list( moduleimpl_id=moduleimpl_id, formsemestre_id=formsemestre_id, module_id=module_id, @@ -2608,15 +2606,16 @@ def do_moduleimpl_list( return scu.sendResult(data, format=format) -@bp.route("/do_moduleimpl_withmodule_list") +@bp.route("/do_moduleimpl_withmodule_list") # ancien nom +@bp.route("/moduleimpl_withmodule_list") @scodoc @permission_required(Permission.ScoView) @scodoc7func -def do_moduleimpl_withmodule_list( +def moduleimpl_withmodule_list( moduleimpl_id=None, formsemestre_id=None, module_id=None ): """API ScoDoc 7""" - data = sco_moduleimpl.do_moduleimpl_withmodule_list( + data = sco_moduleimpl.moduleimpl_withmodule_list( moduleimpl_id=moduleimpl_id, formsemestre_id=formsemestre_id, module_id=module_id, diff --git a/bench.py b/bench.py new file mode 100644 index 0000000000..79fe77d85e --- /dev/null +++ b/bench.py @@ -0,0 +1,13 @@ +"""Script pour faciliter le lancement de benchmarks +""" + +from tests.bench.notes_table import bench_notes_table + +BENCH_DEPT = "RT" +BENCH_FORMSEMESTRE_IDS = ( + 149, # RT S1 2020-21 + 145, # RT S2 2021 + 119, # RT S1 2029 +) + +bench_notes_table(BENCH_DEPT, BENCH_FORMSEMESTRE_IDS) diff --git a/misc/example-api-1.py b/misc/example-api-1.py index e79b329a33..37a06c56f9 100644 --- a/misc/example-api-1.py +++ b/misc/example-api-1.py @@ -78,7 +78,7 @@ pp(sem) # semdescr = GET(s, f"Notes/formsemestre_description?formsemestre_id={sem['formsemestre_id']}&with_evals=0&format=json" ) # ---- Liste les modules et prend le premier -mods = GET(s, f"/Notes/do_moduleimpl_list?formsemestre_id={sem['formsemestre_id']}") +mods = GET(s, f"/Notes/moduleimpl_list?formsemestre_id={sem['formsemestre_id']}") print(f"{len(mods)} modules dans le semestre {sem['titre']}") mod = mods[0] diff --git a/tests/bench/notes_table.py b/tests/bench/notes_table.py new file mode 100644 index 0000000000..0803be6eb0 --- /dev/null +++ b/tests/bench/notes_table.py @@ -0,0 +1,50 @@ +# Simple benchmark +# mesure temps execution NotesTable + +import time + +from flask import g +from flask_login import login_user + +from config import RunningConfig as BenchConfig +import app +from app import db, create_app +from app import clear_scodoc_cache +from app.auth.models import get_super_admin +from app.scodoc import notesdb as ndb +from app.scodoc import notes_table + + +def setup_generator(dept: str): + # Setup + apptest = create_app(BenchConfig) + # Run tests: + with apptest.test_client() as client: + with apptest.app_context(): + with apptest.test_request_context(): + # Clear application cache: + print("clearing cache...") + clear_scodoc_cache() + # initialize scodoc "g": + g.stored_get_formsemestre = {} + # Loge l'utilisateur super-admin + admin_user = get_super_admin() + login_user(admin_user) + app.set_sco_dept(dept) # set db connection + yield client + ndb.close_db_connection() + # Teardown: + db.session.commit() + db.session.remove() + + +def bench_notes_table(dept: str, formsemestre_ids: list[int]) -> float: + for client in setup_generator(dept): + tot_time = 0.0 + for formsemestre_id in formsemestre_ids: + print(f"building sem {formsemestre_id}...") + t0 = time.time() + nt = notes_table.NotesTable(formsemestre_id) + tot_time += time.time() - t0 + print(f"Total time: {tot_time}") + return tot_time diff --git a/tests/unit/sco_fake_gen.py b/tests/unit/sco_fake_gen.py index 0ad1453b81..1daf142b9c 100644 --- a/tests/unit/sco_fake_gen.py +++ b/tests/unit/sco_fake_gen.py @@ -251,7 +251,7 @@ class ScoFake(object): if not responsable_id: responsable_id = self.default_user.id oid = sco_moduleimpl.do_moduleimpl_create(locals()) - oids = sco_moduleimpl.do_moduleimpl_list(moduleimpl_id=oid) # API inconsistency + oids = sco_moduleimpl.moduleimpl_list(moduleimpl_id=oid) # API inconsistency if not oids: raise ScoValueError("moduleimpl not created !") return oids[0] diff --git a/tests/unit/test_formations.py b/tests/unit/test_formations.py index 8859b3ca84..36cb673674 100644 --- a/tests/unit/test_formations.py +++ b/tests/unit/test_formations.py @@ -30,7 +30,7 @@ # - formation_list # - formation_export # - formsemestre_list -# - do_moduleimpl_list +# - moduleimpl_list # - do_module_impl_with_module_list # - do_formsemestre_delete # - do_module_list @@ -231,28 +231,24 @@ def test_formations(test_client): # --- Liste des modules - lim_sem1 = sco_moduleimpl.do_moduleimpl_list( - formsemestre_id=sem1["formsemestre_id"] - ) + lim_sem1 = sco_moduleimpl.moduleimpl_list(formsemestre_id=sem1["formsemestre_id"]) assert len(lim_sem1) == 2 assert mod["module_id"] in (lim_sem1[0]["module_id"], lim_sem1[1]["module_id"]) assert mod2["module_id"] in (lim_sem1[0]["module_id"], lim_sem1[1]["module_id"]) - lim_modid = sco_moduleimpl.do_moduleimpl_list(module_id=mod["module_id"]) + lim_modid = sco_moduleimpl.moduleimpl_list(module_id=mod["module_id"]) assert len(lim_modid) == 1 - lim_modimpl_id = sco_moduleimpl.do_moduleimpl_list( - moduleimpl_id=mi["moduleimpl_id"] - ) + lim_modimpl_id = sco_moduleimpl.moduleimpl_list(moduleimpl_id=mi["moduleimpl_id"]) # print(lim_modimpl_id) - # ---- Test de do_moduleimpl_withmodule_list + # ---- Test de moduleimpl_withmodule_list assert lim_modid == lim_modimpl_id # doit etre le meme resultat - liimp_sem1 = sco_moduleimpl.do_moduleimpl_withmodule_list( + liimp_sem1 = sco_moduleimpl.moduleimpl_withmodule_list( formsemestre_id=sem1["formsemestre_id"] ) @@ -262,16 +258,14 @@ def test_formations(test_client): liimp_sem1[0]["module_id"], liimp_sem1[1]["module_id"], ) - liimp_sem2 = sco_moduleimpl.do_moduleimpl_withmodule_list( + liimp_sem2 = sco_moduleimpl.moduleimpl_withmodule_list( formsemestre_id=sem2["formsemestre_id"] ) assert modt["module_id"] == liimp_sem2[0]["module_id"] - liimp_modid = sco_moduleimpl.do_moduleimpl_withmodule_list( - module_id=mod["module_id"] - ) + liimp_modid = sco_moduleimpl.moduleimpl_withmodule_list(module_id=mod["module_id"]) assert len(liimp_modid) == 1 - liimp_modimplid = sco_moduleimpl.do_moduleimpl_withmodule_list( + liimp_modimplid = sco_moduleimpl.moduleimpl_withmodule_list( moduleimpl_id=mi["moduleimpl_id"] ) @@ -305,9 +299,7 @@ def test_formations(test_client): assert len(li_module2) == 3 # verification de la suppression du module - lim_sem2 = sco_moduleimpl.do_moduleimpl_list( - formsemestre_id=sem2["formsemestre_id"] - ) + lim_sem2 = sco_moduleimpl.moduleimpl_list(formsemestre_id=sem2["formsemestre_id"]) assert len(lim_sem2) == 0 # deuxieme vérification si le module s'est bien sup