diff --git a/app/__init__.py b/app/__init__.py index 65707c26..41875f33 100644 --- a/app/__init__.py +++ b/app/__init__.py @@ -317,6 +317,8 @@ def set_sco_dept(scodoc_dept: str): g.scodoc_dept_id = dept.id # l'id if not hasattr(g, "db_conn"): ndb.open_db_connection() + if not hasattr(g, "stored_get_formsemestre"): + g.stored_get_formsemestre = {} def user_db_init(): diff --git a/app/scodoc/notes_table.py b/app/scodoc/notes_table.py index 5e8f2f19..136a2d89 100644 --- a/app/scodoc/notes_table.py +++ b/app/scodoc/notes_table.py @@ -105,9 +105,7 @@ def get_sem_ues_modimpls(formsemestre_id, modimpls=None): 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"]})[ - 0 - ] + mod = sco_edit_module.module_list(args={"module_id": modimpl["module_id"]})[0] modimpl["module"] = mod if not mod["ue_id"] in uedict: ue = sco_edit_ue.do_ue_list(args={"ue_id": mod["ue_id"]})[0] @@ -212,16 +210,19 @@ class NotesTable(object): valid_evals, mods_att, self.expr_diagnostics, - ) = sco_compute_moy.compute_modimpls_moyennes(self, formsemestre_id) + ) = sco_compute_moy.formsemestre_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 } for e in valid_evals: self._valid_evals[e["evaluation_id"]] = e # Liste des modules et UE uedict = {} # public member: { ue_id : ue } - self.uedict = uedict + self.uedict = uedict # les ues qui ont un modimpl dans ce semestre for modimpl in self._modimpls: - mod = modimpl["module"] # has been added here by compute_modimpls_moyennes + # module has been added by formsemestre_compute_modimpls_moyennes + mod = modimpl["module"] 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_compute_moy.py b/app/scodoc/sco_compute_moy.py index 86ce3bd1..4d46f065 100644 --- a/app/scodoc/sco_compute_moy.py +++ b/app/scodoc/sco_compute_moy.py @@ -27,10 +27,10 @@ """Calcul des moyennes de module """ - -import traceback import pprint +import traceback +from flask import url_for, g import app.scodoc.sco_utils as scu import app.scodoc.notesdb as ndb from app.scodoc.sco_utils import ( @@ -40,7 +40,7 @@ from app.scodoc.sco_utils import ( EVALUATION_RATTRAPAGE, EVALUATION_SESSION2, ) -from app.scodoc.sco_exceptions import ScoException +from app.scodoc.sco_exceptions import ScoValueError from app import log from app.scodoc import sco_abs from app.scodoc import sco_edit_module @@ -65,7 +65,8 @@ def moduleimpl_has_expression(mod): def formsemestre_expressions_use_abscounts(formsemestre_id): """True si les notes de ce semestre dépendent des compteurs d'absences. - Cela n'est normalement pas le cas, sauf si des formules utilisateur utilisent ces compteurs. + Cela n'est normalement pas le cas, sauf si des formules utilisateur + utilisent ces compteurs. """ # check presence of 'nbabs' in expressions ab = "nb_abs" # chaine recherchée @@ -128,7 +129,7 @@ def compute_user_formula( coefs, coefs_mask, formula, - diag_info={}, # infos supplementaires a placer ds messages d'erreur + diag_info=None, # infos supplementaires a placer ds messages d'erreur use_abs=True, ): """Calcul moyenne a partir des notes et coefs, en utilisant la formule utilisateur (une chaine). @@ -164,9 +165,14 @@ def compute_user_formula( if (user_moy > 20) or (user_moy < 0): etud = sco_etud.get_etud_info(etudid=etudid, filled=True)[0] - raise ScoException( - """valeur moyenne %s hors limite pour %s""" - % (user_moy, sem["formsemestre_id"], etudid, etud["nomprenom"]) + raise ScoValueError( + f""" + Valeur moyenne {user_moy} hors limite pour + {etud["nomprenom"]}""" ) except: log( @@ -183,7 +189,7 @@ def compute_user_formula( return user_moy -def do_moduleimpl_moyennes(nt, mod): +def compute_moduleimpl_moyennes(nt, modimpl): """Retourne dict { etudid : note_moyenne } pour tous les etuds inscrits au moduleimpl mod, la liste des evaluations "valides" (toutes notes entrées ou en attente), et att (vrai s'il y a des notes en attente dans ce module). @@ -193,12 +199,12 @@ def do_moduleimpl_moyennes(nt, mod): S'il manque des notes et que le coef n'est pas nul, la moyenne n'est pas calculée: NA Ne prend en compte que les evaluations où toutes les notes sont entrées. - Le résultat est une note sur 20. + Le résultat note_moyenne est une note sur 20. """ diag_info = {} # message d'erreur formule - moduleimpl_id = mod["moduleimpl_id"] - is_malus = mod["module"]["module_type"] == scu.MODULE_MALUS - sem = sco_formsemestre.get_formsemestre(mod["formsemestre_id"]) + moduleimpl_id = modimpl["moduleimpl_id"] + is_malus = modimpl["module"]["module_type"] == scu.MODULE_MALUS + sem = sco_formsemestre.get_formsemestre(modimpl["formsemestre_id"]) etudids = sco_moduleimpl.moduleimpl_listeetuds( moduleimpl_id ) # tous, y compris demissions @@ -207,7 +213,7 @@ def do_moduleimpl_moyennes(nt, mod): [ x["etudid"] for x in sco_formsemestre_inscriptions.do_formsemestre_inscription_listinscrits( - mod["formsemestre_id"] + modimpl["formsemestre_id"] ) ] ) @@ -218,7 +224,7 @@ def do_moduleimpl_moyennes(nt, mod): key=lambda x: (x["numero"], x["jour"], x["heure_debut"]) ) # la plus ancienne en tête - user_expr = moduleimpl_has_expression(mod) + user_expr = moduleimpl_has_expression(modimpl) attente = False # recupere les notes de toutes les evaluations eval_rattr = None @@ -268,7 +274,7 @@ def do_moduleimpl_moyennes(nt, mod): ] # R = {} - formula = scu.unescape_html(mod["computation_expr"]) + formula = scu.unescape_html(modimpl["computation_expr"]) formula_use_abs = "abs" in formula for etudid in insmod_set: # inscrits au semestre et au module @@ -365,7 +371,7 @@ def do_moduleimpl_moyennes(nt, mod): return R, valid_evals, attente, diag_info -def compute_modimpls_moyennes(nt, formsemestre_id): +def formsemestre_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. @@ -383,15 +389,16 @@ def compute_modimpls_moyennes(nt, formsemestre_id): mods_att = [] expr_diags = [] for modimpl in modimpls: - mod = sco_edit_module.do_module_list(args={"module_id": modimpl["module_id"]})[ - 0 - ] + mod = sco_edit_module.module_list(args={"module_id": modimpl["module_id"]})[0] modimpl["module"] = mod # add module dict to moduleimpl (used by nt) moduleimpl_id = modimpl["moduleimpl_id"] assert moduleimpl_id not in D - D[moduleimpl_id], valid_evals_mod, attente, expr_diag = do_moduleimpl_moyennes( - nt, modimpl - ) + ( + D[moduleimpl_id], + valid_evals_mod, + attente, + expr_diag, + ) = compute_moduleimpl_moyennes(nt, modimpl) valid_evals_per_mod[moduleimpl_id] = valid_evals_mod valid_evals += valid_evals_mod if attente: diff --git a/app/scodoc/sco_edit_formation.py b/app/scodoc/sco_edit_formation.py index ec97d908..362f2312 100644 --- a/app/scodoc/sco_edit_formation.py +++ b/app/scodoc/sco_edit_formation.py @@ -313,13 +313,13 @@ def invalidate_sems_in_formation(formation_id): def module_move(module_id, after=0, redirect=1): """Move before/after previous one (decrement/increment numero)""" - module = sco_edit_module.do_module_list({"module_id": module_id})[0] + module = sco_edit_module.module_list({"module_id": module_id})[0] redirect = int(redirect) after = int(after) # 0: deplace avant, 1 deplace apres if after not in (0, 1): raise ValueError('invalid value for "after"') formation_id = module["formation_id"] - others = sco_edit_module.do_module_list({"matiere_id": module["matiere_id"]}) + others = sco_edit_module.module_list({"matiere_id": module["matiere_id"]}) # log('others=%s' % others) if len(others) > 1: idx = [p["module_id"] for p in others].index(module_id) diff --git a/app/scodoc/sco_edit_matiere.py b/app/scodoc/sco_edit_matiere.py index d4bdc6d8..13311e9b 100644 --- a/app/scodoc/sco_edit_matiere.py +++ b/app/scodoc/sco_edit_matiere.py @@ -174,7 +174,7 @@ def do_matiere_delete(oid): raise ScoLockedFormError() log("do_matiere_delete: matiere_id=%s" % oid) # delete all modules in this matiere - mods = sco_edit_module.do_module_list({"matiere_id": oid}) + mods = sco_edit_module.module_list({"matiere_id": oid}) for mod in mods: sco_edit_module.do_module_delete(mod["module_id"]) _matiereEditor.delete(cnx, oid) diff --git a/app/scodoc/sco_edit_module.py b/app/scodoc/sco_edit_module.py index 1aeb20df..51c5cef1 100644 --- a/app/scodoc/sco_edit_module.py +++ b/app/scodoc/sco_edit_module.py @@ -94,7 +94,7 @@ _moduleEditor = ndb.EditableTable( ) -def do_module_list(*args, **kw): +def module_list(*args, **kw): "list modules" cnx = ndb.GetDBConnexion() return _moduleEditor.list(cnx, *args, **kw) @@ -138,7 +138,7 @@ def module_create(matiere_id=None): _MODULE_HELP, ] # cherche le numero adequat (pour placer le module en fin de liste) - Mods = do_module_list(args={"matiere_id": matiere_id}) + Mods = module_list(args={"matiere_id": matiere_id}) if Mods: default_num = max([m["numero"] for m in Mods]) + 10 else: @@ -252,7 +252,7 @@ def do_module_delete(oid): "delete module" from app.scodoc import sco_formations - mod = do_module_list({"module_id": oid})[0] + mod = module_list({"module_id": oid})[0] if module_is_locked(mod["module_id"]): raise ScoLockedFormError() @@ -285,7 +285,7 @@ def module_delete(module_id=None): """Delete a module""" if not module_id: raise ScoValueError("invalid module !") - Mods = do_module_list(args={"module_id": module_id}) + Mods = module_list(args={"module_id": module_id}) if not Mods: raise ScoValueError("Module inexistant !") Mod = Mods[0] @@ -317,7 +317,7 @@ def do_module_edit(val): from app.scodoc import sco_edit_formation # check - mod = do_module_list({"module_id": val["module_id"]})[0] + mod = module_list({"module_id": val["module_id"]})[0] if module_is_locked(mod["module_id"]): # formation verrouillée: empeche de modifier certains champs: protected_fields = ("coefficient", "ue_id", "matiere_id", "semestre_id") @@ -332,7 +332,7 @@ def do_module_edit(val): def check_module_code_unicity(code, field, formation_id, module_id=None): "true si code module unique dans la formation" - Mods = do_module_list(args={"code": code, "formation_id": formation_id}) + Mods = module_list(args={"code": code, "formation_id": formation_id}) if module_id: # edition: supprime le module en cours Mods = [m for m in Mods if m["module_id"] != module_id] @@ -346,7 +346,7 @@ def module_edit(module_id=None): if not module_id: raise ScoValueError("invalid module !") - Mod = do_module_list(args={"module_id": module_id}) + Mod = module_list(args={"module_id": module_id}) if not Mod: raise ScoValueError("invalid module !") Mod = Mod[0] @@ -521,7 +521,7 @@ def edit_module_set_code_apogee(id=None, value=None): value = value.strip("-_ \t") log("edit_module_set_code_apogee: module_id=%s code_apogee=%s" % (module_id, value)) - modules = do_module_list(args={"module_id": module_id}) + modules = module_list(args={"module_id": module_id}) if not modules: return "module invalide" # should not occur @@ -531,7 +531,7 @@ def edit_module_set_code_apogee(id=None, value=None): return value -def module_list(formation_id): +def module_table(formation_id): """Liste des modules de la formation (XXX inutile ou a revoir) """ @@ -548,7 +548,7 @@ def module_list(formation_id): ] editable = current_user.has_permission(Permission.ScoChangeFormation) - for Mod in do_module_list(args={"formation_id": formation_id}): + for Mod in module_list(args={"formation_id": formation_id}): H.append('
  • %s' % Mod) if editable: H.append('modifier' % Mod) @@ -595,7 +595,7 @@ def formation_add_malus_modules(formation_id, titre=None, redirect=True): nb_mod_malus = len( [ mod - for mod in do_module_list(args={"ue_id": ue["ue_id"]}) + for mod in module_list(args={"ue_id": ue["ue_id"]}) if mod["module_type"] == scu.MODULE_MALUS ] ) diff --git a/app/scodoc/sco_edit_ue.py b/app/scodoc/sco_edit_ue.py index 8cf7c3c0..37e5786b 100644 --- a/app/scodoc/sco_edit_ue.py +++ b/app/scodoc/sco_edit_ue.py @@ -382,7 +382,7 @@ def _add_ue_semestre_id(ue_list): qui les place à la fin de la liste. """ for ue in ue_list: - Modlist = sco_edit_module.do_module_list(args={"ue_id": ue["ue_id"]}) + Modlist = sco_edit_module.module_list(args={"ue_id": ue["ue_id"]}) if Modlist: ue["semestre_id"] = Modlist[0]["semestre_id"] else: @@ -648,7 +648,7 @@ du programme" (menu "Semestre") si vous avez un semestre en cours); H.append("") H.append('