diff --git a/app/auth/models.py b/app/auth/models.py index c0e5f2a5d..17cdce3d5 100644 --- a/app/auth/models.py +++ b/app/auth/models.py @@ -258,7 +258,7 @@ class User(UserMixin, db.Model): if self.nom: n = sco_etud.format_nom(self.nom) else: - n = scu.strupper(self.user_name) + n = self.user_name.upper() return "%s %s (%s)" % ( n, sco_etud.format_prenom(self.prenom), diff --git a/app/decorators.py b/app/decorators.py index 2ebb5accb..a6399cd7c 100644 --- a/app/decorators.py +++ b/app/decorators.py @@ -145,122 +145,95 @@ def admin_required(f): return permission_required(Permission.ScoSuperAdmin)(f) -def scodoc7func(context): +def scodoc7func(func): """Décorateur pour intégrer les fonctions Zope 2 de ScoDoc 7. Ajoute l'argument REQUEST s'il est dans la signature de la fonction. Les paramètres de la query string deviennent des (keywords) paramètres de la fonction. """ - def s7_decorator(func): - @wraps(func) - def scodoc7func_decorator(*args, **kwargs): - """Decorator allowing legacy Zope published methods to be called via Flask - routes without modification. + @wraps(func) + def scodoc7func_decorator(*args, **kwargs): + """Decorator allowing legacy Zope published methods to be called via Flask + routes without modification. - There are two cases: the function can be called - 1. via a Flask route ("top level call") - 2. or be called directly from Python. + There are two cases: the function can be called + 1. via a Flask route ("top level call") + 2. or be called directly from Python. - If called via a route, this decorator setups a REQUEST object (emulating Zope2 REQUEST) - """ - # Détermine si on est appelé via une route ("toplevel") - # ou par un appel de fonction python normal. - top_level = not hasattr(g, "zrequest") - if not top_level: - # ne "redécore" pas - return func(*args, **kwargs) - # --- Emulate Zope's REQUEST - REQUEST = ZRequest() - g.zrequest = REQUEST - req_args = REQUEST.form # args from query string (get) or form (post) - # --- Add positional arguments - pos_arg_values = [] - argspec = inspect.getfullargspec(func) - # current_app.logger.info("argspec=%s" % str(argspec)) - nb_default_args = len(argspec.defaults) if argspec.defaults else 0 - if nb_default_args: - arg_names = argspec.args[:-nb_default_args] + If called via a route, this decorator setups a REQUEST object (emulating Zope2 REQUEST) + """ + # Détermine si on est appelé via une route ("toplevel") + # ou par un appel de fonction python normal. + top_level = not hasattr(g, "zrequest") + if not top_level: + # ne "redécore" pas + return func(*args, **kwargs) + # --- Emulate Zope's REQUEST + REQUEST = ZRequest() + g.zrequest = REQUEST + req_args = REQUEST.form # args from query string (get) or form (post) + # --- Add positional arguments + pos_arg_values = [] + argspec = inspect.getfullargspec(func) + # current_app.logger.info("argspec=%s" % str(argspec)) + nb_default_args = len(argspec.defaults) if argspec.defaults else 0 + if nb_default_args: + arg_names = argspec.args[:-nb_default_args] + else: + arg_names = argspec.args + for arg_name in arg_names: + if arg_name == "REQUEST": # special case + pos_arg_values.append(REQUEST) else: - arg_names = argspec.args - for arg_name in arg_names: + v = req_args[arg_name] + # try to convert all arguments to INTEGERS + # necessary for db ids and boolean values + try: + v = int(v) + except ValueError: + pass + pos_arg_values.append(v) + # current_app.logger.info("pos_arg_values=%s" % pos_arg_values) + # current_app.logger.info("req_args=%s" % req_args) + # Add keyword arguments + if nb_default_args: + for arg_name in argspec.args[-nb_default_args:]: if arg_name == "REQUEST": # special case - pos_arg_values.append(REQUEST) - elif arg_name == "context": - pos_arg_values.append(context) - else: + kwargs[arg_name] = REQUEST + elif arg_name in req_args: + # set argument kw optionnel v = req_args[arg_name] # try to convert all arguments to INTEGERS # necessary for db ids and boolean values try: v = int(v) - except ValueError: + except (ValueError, TypeError): pass - pos_arg_values.append(v) - # current_app.logger.info("pos_arg_values=%s" % pos_arg_values) - # current_app.logger.info("req_args=%s" % req_args) - # Add keyword arguments - if nb_default_args: - for arg_name in argspec.args[-nb_default_args:]: - if arg_name == "REQUEST": # special case - kwargs[arg_name] = REQUEST - elif arg_name in req_args: - # set argument kw optionnel - v = req_args[arg_name] - # try to convert all arguments to INTEGERS - # necessary for db ids and boolean values - try: - v = int(v) - except (ValueError, TypeError): - pass - kwargs[arg_name] = v - # current_app.logger.info( - # "scodoc7func_decorator: top_level=%s, pos_arg_values=%s, kwargs=%s" - # % (top_level, pos_arg_values, kwargs) - # ) - value = func(*pos_arg_values, **kwargs) + kwargs[arg_name] = v + # current_app.logger.info( + # "scodoc7func_decorator: top_level=%s, pos_arg_values=%s, kwargs=%s" + # % (top_level, pos_arg_values, kwargs) + # ) + value = func(*pos_arg_values, **kwargs) - if not top_level: - return value - else: - if isinstance(value, werkzeug.wrappers.response.Response): - return value # redirected - # Build response, adding collected http headers: - headers = [] - kw = {"response": value, "status": 200} - if g.zrequest: - headers = g.zrequest.RESPONSE.headers - if not headers: - # no customized header, speedup: - return value - if "content-type" in headers: - kw["mimetype"] = headers["content-type"] - r = flask.Response(**kw) - for h in headers: - r.headers[h] = headers[h] - return r + if not top_level: + return value + else: + if isinstance(value, werkzeug.wrappers.response.Response): + return value # redirected + # Build response, adding collected http headers: + headers = [] + kw = {"response": value, "status": 200} + if g.zrequest: + headers = g.zrequest.RESPONSE.headers + if not headers: + # no customized header, speedup: + return value + if "content-type" in headers: + kw["mimetype"] = headers["content-type"] + r = flask.Response(**kw) + for h in headers: + r.headers[h] = headers[h] + return r - return scodoc7func_decorator - - return s7_decorator - - -# Le "context" de ScoDoc7 -class ScoDoc7Context(object): - """Context object for legacy Zope methods. - Mainly used to call published methods, as context.function(...) - """ - - def __init__(self, name=""): - self.name = name - # logging.getLogger(__name__).info("created %s" % self) - - def populate(self, globals_dict): - # logging.getLogger(__name__).info("populating context %s" % self) - for k in globals_dict: - if (not k.startswith("_")) and ( - isinstance(globals_dict[k], types.FunctionType) - ): - setattr(self, k, globals_dict[k].__get__(self)) - - def __repr__(self): - return "ScoDoc7Context('%s')" % self.name + return scodoc7func_decorator diff --git a/app/scodoc/debug.py b/app/scodoc/debug.py deleted file mode 100644 index 85f8a3631..000000000 --- a/app/scodoc/debug.py +++ /dev/null @@ -1,142 +0,0 @@ -# -*- mode: python -*- -# -*- coding: utf-8 -*- - -"""Configuration pour debugguer en mode console - -Lancer ScoDoc ainsi: (comme root) - - /opt/scodoc/bin/zopectl debug - -Puis - -from debug import * -context = go(app) -# ou -context = go_dept(app, 'CJ') - -authuser = app.acl_users.getUserById('admin') -# ou app.ScoDoc.acl_users.getUserById('toto') pour un utilisateur scodoc -authuser = authuser.__of__(app.acl_users) - -Exemple: -sems = sco_formsemestre.do_formsemestre_list.formsemestre_list(context) -formsemestre_id = sems[0]['formsemestre_id'] - -# Affiche tous les semestres: -for sem in sems: - print sem['formsemestre_id'], sem['titre_num'] - -# Recupere la table de notes: -nt = sco_cache.NotesTableCache.get( formsemestre_id) - - -""" -from __future__ import print_function -import pdb # pylint: disable=unused-import -import pprint - -import app.scodoc.notesdb as ndb # pylint: disable=unused-import -from app.scodoc.notesdb import * # pylint: disable=wildcard-import,unused-wildcard-import -from app.scodoc.notes_log import log -import app.scodoc.sco_utils as scu -from app.scodoc.sco_utils import * # pylint: disable=wildcard-import, unused-wildcard-import - -from app.scodoc.gen_tables import GenTable -from app.scodoc import html_sco_header -from app.scodoc import sco_archives -from app.scodoc import sco_bulletins -from app.scodoc import sco_bulletins_xml -from app.scodoc import sco_cache -from app.scodoc import sco_codes_parcours -from app.scodoc import sco_compute_moy -from app.scodoc import sco_edit_matiere -from app.scodoc import sco_edit_module -from app.scodoc import sco_edit_ue -from app.scodoc import sco_excel -from app.scodoc import sco_formations -from app.scodoc import sco_formsemestre -from app.scodoc import sco_formsemestre_edit -from app.scodoc import sco_formsemestre_status -from app.scodoc import sco_formsemestre_validation -from app.scodoc import sco_groups -from app.scodoc import sco_moduleimpl -from app.scodoc import sco_news -from app.scodoc import sco_parcours_dut -from app.scodoc import sco_permissions -from app.scodoc import sco_preferences -from app.scodoc import sco_tag_module -from app.scodoc import sco_etud - -# Prend le premier departement comme context - - -def go(app, n=0, verbose=True): - context = app.ScoDoc.objectValues("Folder")[n].Scolarite - if verbose: - print("context in dept ", scu.get_dept_id()) - return context - - -def go_dept(app, dept, verbose=True): - objs = app.ScoDoc.objectValues("Folder") - for o in objs: - try: - context = o.Scolarite - except AttributeError: - # ignore other folders, like old "icons" - continue - if scu.get_dept_id() == dept: - if verbose: - print("context in dept ", scu.get_dept_id()) - return context - raise ValueError("dep %s not found" % dept) - - -class FakeUser(object): - def __init__(self, name): - self.name = name - - def __str__(self): - return self.name - - def has_permission(self, op, dept=None): - return True - - def has_role(self, role): - return True - - -class DummyResponse(object): - """Emulation vide de Reponse http Zope""" - - def __init__(self): - self.header = {} - self.redirected = "" - - def setHeader(self, name, value): - self.header[name] = value - - def redirect(self, url): - self.redirected = url - - -class DummyRequest(object): - """Emulation vide de Request Zope""" - - def __init__(self): - self.RESPONSE = DummyResponse() - self.AUTHENTICATED_USER = FakeUser("admin") - self.form = {} - self.URL = "http://scodoc/" - self.URL0 = self.URL - self.BASE0 = "localhost" - self.REMOTE_ADDR = "127.0.0.1" - self.HTTP_REFERER = "" - self.REQUEST_METHOD = "get" - self.QUERY_STRING = "" - - -REQUEST = DummyRequest() - -# handful shorcut -pp = pprint.pprint diff --git a/app/scodoc/html_sco_header.py b/app/scodoc/html_sco_header.py index 056b0f24e..856c191e4 100644 --- a/app/scodoc/html_sco_header.py +++ b/app/scodoc/html_sco_header.py @@ -157,8 +157,6 @@ def sco_header( "Main HTML page header for ScoDoc" from app.scodoc.sco_formsemestre_status import formsemestre_page_title - context = None # XXX TODO à enlever #context - # Get head message from http request: if not head_message: if request.method == "POST": @@ -308,7 +306,7 @@ def sco_header( H.append("""
""") # # Barre menu semestre: - H.append(formsemestre_page_title(context)) + H.append(formsemestre_page_title()) # Avertissement si mot de passe à changer if user_check: diff --git a/app/scodoc/notes_log.py b/app/scodoc/notes_log.py index ba52d4946..67ae317c1 100644 --- a/app/scodoc/notes_log.py +++ b/app/scodoc/notes_log.py @@ -64,7 +64,7 @@ log = _logguer() # Alarms by email: -def sendAlarm(context, subj, txt): +def sendAlarm(subj, txt): from . import sco_utils from . import sco_emails from . import sco_preferences @@ -77,7 +77,7 @@ def sendAlarm(context, subj, txt): msg.epilogue = "" txt = MIMEText(txt, "plain", sco_utils.SCO_ENCODING) msg.attach(txt) - sco_emails.sendEmail(context, msg) + sco_emails.sendEmail(msg) # Debug: log call stack diff --git a/app/scodoc/notes_table.py b/app/scodoc/notes_table.py index 9df33d69c..99b4d7787 100644 --- a/app/scodoc/notes_table.py +++ b/app/scodoc/notes_table.py @@ -102,7 +102,7 @@ def comp_ranks(T): return rangs -def get_sem_ues_modimpls(context, formsemestre_id, modimpls=None): +def get_sem_ues_modimpls(formsemestre_id, modimpls=None): """Get liste des UE du semestre (à partir des moduleimpls) (utilisé quand on ne peut pas construire nt et faire nt.get_ues()) """ @@ -122,7 +122,7 @@ def get_sem_ues_modimpls(context, formsemestre_id, modimpls=None): return ues, modimpls -def comp_etud_sum_coef_modules_ue(context, formsemestre_id, etudid, ue_id): +def comp_etud_sum_coef_modules_ue(formsemestre_id, etudid, ue_id): """Somme des coefficients des modules de l'UE dans lesquels cet étudiant est inscrit ou None s'il n'y a aucun module. @@ -171,13 +171,10 @@ class NotesTable(object): """ - def __init__( - self, context, formsemestre_id - ): # context is not used in ScoDoc8 ! XXX + def __init__(self, formsemestre_id): log("NotesTable( formsemestre_id=%s )" % formsemestre_id) if not formsemestre_id: raise ValueError("invalid formsemestre_id (%s)" % formsemestre_id) - self.context = context self.formsemestre_id = formsemestre_id cnx = ndb.GetDBConnexion() self.sem = sco_formsemestre.get_formsemestre(formsemestre_id) @@ -218,7 +215,7 @@ class NotesTable(object): valid_evals, mods_att, self.expr_diagnostics, - ) = sco_compute_moy.do_formsemestre_moyennes(context, self, formsemestre_id) + ) = sco_compute_moy.do_formsemestre_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 } @@ -372,16 +369,14 @@ class NotesTable(object): def get_sexnom(self, etudid): "M. DUPONT" etud = self.identdict[etudid] - return ( - etud["civilite_str"] + " " + scu.strupper(etud["nom_usuel"] or etud["nom"]) - ) + return etud["civilite_str"] + " " + (etud["nom_usuel"] or etud["nom"]).upper() def get_nom_short(self, etudid): "formatte nom d'un etud (pour table recap)" etud = self.identdict[etudid] # Attention aux caracteres multibytes pour decouper les 2 premiers: return ( - scu.strupper(etud["nom_usuel"] or etud["nom"]) + (etud["nom_usuel"] or etud["nom"]).upper() + " " + etud["prenom"].capitalize()[:2] + "." @@ -681,7 +676,6 @@ class NotesTable(object): formula = sco_compute_moy.get_ue_expression(self.formsemestre_id, ue_id, cnx) if formula: moy = sco_compute_moy.compute_user_formula( - self.context, self.sem, etudid, moy, @@ -980,7 +974,7 @@ class NotesTable(object): # { groupe : { etudid : rang } } if not group_id in self.group_etuds: # lazy fill: list of etud in group_id - etuds = sco_groups.get_group_members(self.context, group_id) + etuds = sco_groups.get_group_members(group_id) self.group_etuds[group_id] = set([x["etudid"] for x in etuds]) # 1- build T restricted to group Tr = [] @@ -1056,7 +1050,7 @@ class NotesTable(object): "Warning: %s capitalized an UE %s which is not part of current sem %s" % (etudid, ue_id, self.formsemestre_id) ) - ue = sco_edit_ue.do_ue_list(self.context, args={"ue_id": ue_id})[0] + ue = sco_edit_ue.do_ue_list(args={"ue_id": ue_id})[0] self.uedict[ue_id] = ue # record this UE if ue_id not in self._uecoef: cl = formsemestre_uecoef_list( @@ -1146,9 +1140,7 @@ class NotesTable(object): self.ue_capitalisees = scu.DictDefault(defaultvalue=[]) cnx = None for etudid in self.get_etudids(): - capital = formsemestre_get_etud_capitalisation( - self.context, self.sem, etudid - ) + capital = formsemestre_get_etud_capitalisation(self.sem, etudid) for ue_cap in capital: # Si la moyenne d'UE n'avait pas été stockée (anciennes versions de ScoDoc) # il faut la calculer ici et l'enregistrer @@ -1194,7 +1186,7 @@ class NotesTable(object): cnx.commit() # log('comp_ue_capitalisees=\n%s' % pprint.pformat(self.ue_capitalisees) ) - # def comp_etud_sum_coef_modules_ue(self, etudid, ue_id): + # def comp_etud_sum_coef_modules_ue( etudid, ue_id): # """Somme des coefficients des modules de l'UE dans lesquels cet étudiant est inscrit # ou None s'il n'y a aucun module # """ @@ -1235,7 +1227,7 @@ class NotesTable(object): if ue_cap["formsemestre_id"]: # Somme des coefs dans l'UE du semestre d'origine (nouveau: 23/01/2016) coef = comp_etud_sum_coef_modules_ue( - self.context, ue_cap["formsemestre_id"], etudid, ue_cap["ue_id"] + ue_cap["formsemestre_id"], etudid, ue_cap["ue_id"] ) if coef != None: return coef @@ -1243,9 +1235,7 @@ class NotesTable(object): # Capitalisation UE externe: quel coef appliquer ? # Si l'étudiant est inscrit dans le semestre courant, # somme des coefs des modules de l'UE auxquels il est inscrit - c = comp_etud_sum_coef_modules_ue( - self.context, self.formsemestre_id, etudid, ue["ue_id"] - ) + c = comp_etud_sum_coef_modules_ue(self.formsemestre_id, etudid, ue["ue_id"]) if c is not None: # inscrit à au moins un module de cette UE return c # arfff: aucun moyen de déterminer le coefficient de façon sûre diff --git a/app/scodoc/pe_avislatex.py b/app/scodoc/pe_avislatex.py index 1e6d2f839..3259e20fb 100644 --- a/app/scodoc/pe_avislatex.py +++ b/app/scodoc/pe_avislatex.py @@ -66,9 +66,7 @@ def get_code_latex_from_modele(fichier): # ---------------------------------------------------------------------------------------- -def get_code_latex_from_scodoc_preference( - context, formsemestre_id, champ="pe_avis_latex_tmpl" -): +def get_code_latex_from_scodoc_preference(formsemestre_id, champ="pe_avis_latex_tmpl"): """ Extrait le template (ou le tag d'annotation au regard du champ fourni) des préférences LaTeX et s'assure qu'il est renvoyé au format unicode @@ -221,7 +219,7 @@ def get_code_latex_avis_etudiant( # ---------------------------------------------------------------------------------------- -def get_annotation_PE(context, etudid, tag_annotation_pe): +def get_annotation_PE(etudid, tag_annotation_pe): """Renvoie l'annotation PE dans la liste de ces annotations ; Cette annotation est reconnue par la présence d'un tag **PE** (cf. .get_preferences -> pe_tag_annotation_avis_latex). @@ -387,7 +385,7 @@ def get_bilanParTag(donnees_etudiant, groupe="groupe"): # ---------------------------------------------------------------------------------------- def get_avis_poursuite_par_etudiant( - context, jury, etudid, template_latex, tag_annotation_pe, footer_latex, prefs + jury, etudid, template_latex, tag_annotation_pe, footer_latex, prefs ): """Renvoie un nom de fichier et le contenu de l'avis latex d'un étudiant dont l'etudid est fourni. result: [ chaine unicode, chaine unicode ] @@ -417,9 +415,7 @@ def get_avis_poursuite_par_etudiant( ) # les annnotations - annotationPE = get_annotation_PE( - context, etudid, tag_annotation_pe=tag_annotation_pe - ) + annotationPE = get_annotation_PE(etudid, tag_annotation_pe=tag_annotation_pe) if pe_tools.PE_DEBUG: pe_tools.pe_print(annotationPE, type(annotationPE)) @@ -456,7 +452,7 @@ def get_templates_from_distrib(template="avis"): # ---------------------------------------------------------------------------------------- -def table_syntheseAnnotationPE(context, syntheseJury, tag_annotation_pe): +def table_syntheseAnnotationPE(syntheseJury, tag_annotation_pe): """Génère un fichier excel synthétisant les annotations PE telles qu'inscrites dans les fiches de chaque étudiant""" sT = SeqGenTable() # le fichier excel à générer @@ -514,9 +510,7 @@ def table_syntheseAnnotationPE(context, syntheseJury, tag_annotation_pe): n += 1 # L'annotation PE - annotationPE = get_annotation_PE( - context, etudid, tag_annotation_pe=tag_annotation_pe - ) + annotationPE = get_annotation_PE(etudid, tag_annotation_pe=tag_annotation_pe) row["Annotation PE"] = annotationPE if annotationPE else "" rows.append(row) diff --git a/app/scodoc/pe_jurype.py b/app/scodoc/pe_jurype.py index 888924f09..5aee97f94 100644 --- a/app/scodoc/pe_jurype.py +++ b/app/scodoc/pe_jurype.py @@ -61,7 +61,7 @@ from app.scodoc import pe_semestretag from app.scodoc import pe_settag # ---------------------------------------------------------------------------------------- -def comp_nom_semestre_dans_parcours(context, sem): +def comp_nom_semestre_dans_parcours(sem): """Le nom a afficher pour titrer un semestre par exemple: "semestre 2 FI 2015" """ @@ -83,15 +83,12 @@ class JuryPE(object): base sur NotesTable Attributs : - diplome : l'annee d'obtention du diplome DUT et du jury de PE (generalement fevrier XXXX) - - context : le contexte Zope - juryEtudDict : dictionnaire récapitulant les étudiants participant au jury PE (données administratives + celles des semestres valides à prendre en compte permettant le calcul des moyennes ... {'etudid : { 'nom', 'prenom', 'civilite', 'diplome', '', }} Rq: il contient à la fois les étudiants qui vont être diplomés à la date prévue et ceux qui sont éliminés (abandon, redoublement, ...) pour affichage alternatif - - Note (EV:): les attributs sont des chaines encodées (utf8), comme dans ScoDoc (pas des unicodes) """ # Variables de classe décrivant les aggrégats, leur ordre d'apparition temporelle et @@ -148,19 +145,17 @@ class JuryPE(object): } # ------------------------------------------------------------------------------------------------------------------ - def __init__(self, context, semBase): + def __init__(self, semBase): """ Création d'une table PE sur la base d'un semestre selectionné. De ce semestre est déduit : 1. l'année d'obtention du DUT, 2. tous les étudiants susceptibles à ce stade (au regard de leur parcours) d'être diplomés. Args: - context: semBase: le dictionnaire sem donnant la base du jury meme_programme: si True, impose un même programme pour tous les étudiants participant au jury, si False, permet des programmes differents """ - self.context = context self.semTagDict = ( {} ) # Les semestres taggués à la base des calculs de moyenne par tag @@ -275,7 +270,7 @@ class JuryPE(object): """ # Les cosemestres donnant lieu à meme année de diplome coSems = get_cosemestres_diplomants( - self.context, semBase, avec_meme_formation=avec_meme_formation + semBase, avec_meme_formation=avec_meme_formation ) # calcul des coSemestres if pe_tools.PE_DEBUG: pe_tools.pe_print( @@ -323,9 +318,7 @@ class JuryPE(object): for sem in semsListe: # pour chacun des semestres de la liste # nt = self.get_notes_d_un_semestre( sem['formsemestre_id'] ) - nt = self.get_cache_notes_d_un_semestre( - self.context, sem["formsemestre_id"] - ) + nt = self.get_cache_notes_d_un_semestre(sem["formsemestre_id"]) # sco_cache.NotesTableCache.get( sem['formsemestre_id']) etudiantsDuSemestre = ( nt.get_etudids() @@ -377,7 +370,7 @@ class JuryPE(object): if etudid not in self.PARCOURSINFO_DICT: etud = self.get_cache_etudInfo_d_un_etudiant( - self.context, etudid + etudid ) # On charge les données de l'étudiant if pe_tools.PE_DEBUG and pe_tools.PE_DEBUG >= 2: pe_tools.pe_print(etud["nom"] + " " + etud["prenom"], end="") @@ -460,8 +453,8 @@ class JuryPE(object): from app.scodoc import sco_report reponse = False - etud = self.get_cache_etudInfo_d_un_etudiant(self.context, etudid) - (_, parcours) = sco_report.get_codeparcoursetud(self.context, etud) + etud = self.get_cache_etudInfo_d_un_etudiant(etudid) + (_, parcours) = sco_report.get_codeparcoursetud(etud) if ( len(set(sco_codes_parcours.CODES_SEM_REO.keys()) & set(parcours.values())) > 0 @@ -493,7 +486,7 @@ class JuryPE(object): lastdate = max(sesdates) # date de fin de l'inscription la plus récente # if PETable.AFFICHAGE_DEBUG_PE == True : pe_tools.pe_print(" derniere inscription = ", lastDateSem) - semestresDeScoDoc = sco_formsemestre.do_formsemestre_list(self.context) + semestresDeScoDoc = sco_formsemestre.do_formsemestre_list() semestresSuperieurs = [ sem for sem in semestresDeScoDoc if sem["semestre_id"] > sonDernierSidValide ] # Semestre de rang plus élevé que son dernier sem valide @@ -523,9 +516,9 @@ class JuryPE(object): """ from app.scodoc import sco_report - etud = self.get_cache_etudInfo_d_un_etudiant(self.context, etudid) + etud = self.get_cache_etudInfo_d_un_etudiant(etudid) (code, parcours) = sco_report.get_codeparcoursetud( - self.context, etud + etud ) # description = '1234:A', parcours = {1:ADM, 2:NAR, ...} sonDernierSemestreValide = max( [ @@ -554,9 +547,7 @@ class JuryPE(object): for (i, sem) in enumerate( sesSi ): # Parcours des éventuels semestres précédents - nt = self.get_cache_notes_d_un_semestre( - self.context, sem["formsemestre_id"] - ) + nt = self.get_cache_notes_d_un_semestre(sem["formsemestre_id"]) dec = nt.get_etud_decision_sem( etudid ) # quelle est la décision du jury ? @@ -597,11 +588,11 @@ class JuryPE(object): """ # Semestre taggué avec classement dans le groupe if fid not in self.semTagDict: - nt = self.get_cache_notes_d_un_semestre(self.context, fid) + nt = self.get_cache_notes_d_un_semestre(fid) # Création du semestres self.semTagDict[fid] = pe_semestretag.SemestreTag( - self.context, nt, nt.sem + nt, nt.sem ) # Création du pesemestre associé self.semTagDict[fid].comp_data_semtag() lesEtudids = self.semTagDict[fid].get_etudids() @@ -612,7 +603,7 @@ class JuryPE(object): etudid not in self.PARCOURSINFO_DICT ): # Si l'étudiant n'a pas été pris en compte dans le jury car déjà diplômé ou redoublant lesEtudidsManquants.append(etudid) - # self.get_cache_etudInfo_d_un_etudiant(self.context, etudid) + # self.get_cache_etudInfo_d_un_etudiant(etudid) self.add_etudiants( etudid ) # Ajoute les élements de parcours de l'étudiant @@ -879,7 +870,7 @@ class JuryPE(object): infos = [] for sem in sems: - nomsem = comp_nom_semestre_dans_parcours(self.context, sem) + nomsem = comp_nom_semestre_dans_parcours(sem) infos.append( { "nom_semestre_dans_parcours": nomsem, @@ -1117,7 +1108,7 @@ class JuryPE(object): # **************************************************************************************************************** # # ------------------------------------------------------------------------------------------------------------------ - def get_cache_etudInfo_d_un_etudiant(self, context, etudid): + def get_cache_etudInfo_d_un_etudiant(self, etudid): """Renvoie les informations sur le parcours d'un étudiant soit en les relisant depuis ETUDINFO_DICT si mémorisée soit en les chargeant et en les mémorisant """ @@ -1130,9 +1121,7 @@ class JuryPE(object): # ------------------------------------------------------------------------------------------------------------------ # ------------------------------------------------------------------------------------------------------------------ - def get_cache_notes_d_un_semestre( - self, context, formsemestre_id - ): # inutile en realité ! + def get_cache_notes_d_un_semestre(self, formsemestre_id): # inutile en realité ! """Charge la table des notes d'un formsemestre""" return sco_cache.NotesTableCache.get(formsemestre_id) @@ -1145,7 +1134,7 @@ class JuryPE(object): en fonction de ses infos d'etud (cf. sco_etud.get_etud_info( etudid=etudid, filled=True)[0]), les semestres étant triés par ordre décroissant. Si semestre_id == None renvoie tous les semestres""" - etud = self.get_cache_etudInfo_d_un_etudiant(self.context, etudid) + etud = self.get_cache_etudInfo_d_un_etudiant(etudid) if semestre_id == None: sesSems = [sem for sem in etud["sems"] if 1 <= sem["semestre_id"] <= 4] else: @@ -1230,7 +1219,7 @@ def get_annee_diplome_semestre(sem): # ---------------------------------------------------------------------------------- -def get_cosemestres_diplomants(context, semBase, avec_meme_formation=False): +def get_cosemestres_diplomants(semBase, avec_meme_formation=False): """Partant d'un semestre de Base = {'formsemestre_id': ..., 'semestre_id': ..., 'annee_debut': ...}, renvoie la liste de tous ses co-semestres (lui-meme inclus) Par co-semestre, s'entend les semestres : diff --git a/app/scodoc/pe_semestretag.py b/app/scodoc/pe_semestretag.py index 314f30a1f..779efdf61 100644 --- a/app/scodoc/pe_semestretag.py +++ b/app/scodoc/pe_semestretag.py @@ -73,9 +73,7 @@ class SemestreTag(pe_tagtable.TableTag): # ----------------------------------------------------------------------------- # Fonctions d'initialisation # ----------------------------------------------------------------------------- - def __init__( - self, context, notetable, sem - ): # Initialisation sur la base d'une notetable + def __init__(self, notetable, sem): # Initialisation sur la base d'une notetable """Instantiation d'un objet SemestreTag à partir d'un tableau de note et des informations sur le semestre pour le dater """ @@ -95,7 +93,6 @@ class SemestreTag(pe_tagtable.TableTag): ) # Les attributs spécifiques - self.context = context self.nt = notetable # Les attributs hérités : la liste des étudiants @@ -293,7 +290,7 @@ class SemestreTag(pe_tagtable.TableTag): coeff / self.somme_coeffs if self.somme_coeffs != 0 else 0 ) # le coeff normalisé else: - semtag_prec = SemestreTag(self.context, nt_prec, nt_prec.sem) + semtag_prec = SemestreTag(nt_prec, nt_prec.sem) (note, coeff_norm) = semtag_prec.get_noteEtCoeff_modimpl( modprec_id, etudid, profondeur=profondeur - 1 ) # lecture de la note via le semtag associé au modimpl capitalisé diff --git a/app/scodoc/pe_tools.py b/app/scodoc/pe_tools.py index 278d8e2be..2dc94ea97 100644 --- a/app/scodoc/pe_tools.py +++ b/app/scodoc/pe_tools.py @@ -171,7 +171,7 @@ def add_local_file_to_zip(zipfile, ziproot, pathname, path_in_zip): zipfile.writestr(rooted_path_in_zip, data) -def add_pe_stuff_to_zip(context, zipfile, ziproot): +def add_pe_stuff_to_zip(zipfile, ziproot): """Add auxiliary files to (already opened) zip Put all local files found under config/doc_poursuites_etudes/local and config/doc_poursuites_etudes/distrib diff --git a/app/scodoc/pe_view.py b/app/scodoc/pe_view.py index 9411a0b6c..373c36e3d 100644 --- a/app/scodoc/pe_view.py +++ b/app/scodoc/pe_view.py @@ -46,7 +46,7 @@ from app.scodoc import pe_jurype from app.scodoc import pe_avislatex -def _pe_view_sem_recap_form(context, formsemestre_id, REQUEST=None): +def _pe_view_sem_recap_form(formsemestre_id, REQUEST=None): H = [ html_sco_header.sco_header(page_title="Avis de poursuite d'études"), """

Génération des avis de poursuites d'études

@@ -75,7 +75,6 @@ def _pe_view_sem_recap_form(context, formsemestre_id, REQUEST=None): def pe_view_sem_recap( - context, formsemestre_id, avis_tmpl_file=None, footer_tmpl_file=None, @@ -88,12 +87,12 @@ def pe_view_sem_recap( et debugger uniquement la partie avis latex """ if REQUEST and REQUEST.REQUEST_METHOD == "GET": - return _pe_view_sem_recap_form(context, formsemestre_id, REQUEST=REQUEST) + return _pe_view_sem_recap_form(formsemestre_id, REQUEST=REQUEST) prefs = sco_preferences.SemPreferences(formsemestre_id=formsemestre_id) semBase = sco_formsemestre.get_formsemestre(formsemestre_id) - jury = pe_jurype.JuryPE(context, semBase) + jury = pe_jurype.JuryPE(semBase) # Ajout avis LaTeX au même zip: etudids = list(jury.syntheseJury.keys()) @@ -108,7 +107,7 @@ def pe_view_sem_recap( else: # template indiqué dans préférences ScoDoc ? template_latex = pe_avislatex.get_code_latex_from_scodoc_preference( - context, formsemestre_id, champ="pe_avis_latex_tmpl" + formsemestre_id, champ="pe_avis_latex_tmpl" ) template_latex = template_latex.strip() @@ -124,7 +123,7 @@ def pe_view_sem_recap( footer_latex = footer_latex else: footer_latex = pe_avislatex.get_code_latex_from_scodoc_preference( - context, formsemestre_id, champ="pe_avis_latex_footer" + formsemestre_id, champ="pe_avis_latex_footer" ) footer_latex = footer_latex.strip() if not footer_latex: @@ -134,13 +133,11 @@ def pe_view_sem_recap( ) # fallback: footer vides tag_annotation_pe = pe_avislatex.get_code_latex_from_scodoc_preference( - context, formsemestre_id, champ="pe_tag_annotation_avis_latex" + formsemestre_id, champ="pe_tag_annotation_avis_latex" ) # Ajout des annotations PE dans un fichier excel - sT = pe_avislatex.table_syntheseAnnotationPE( - context, jury.syntheseJury, tag_annotation_pe - ) + sT = pe_avislatex.table_syntheseAnnotationPE(jury.syntheseJury, tag_annotation_pe) if sT: jury.add_file_to_zip( jury.NOM_EXPORT_ZIP + "_annotationsPE" + scu.XLSX_SUFFIX, sT.excel() @@ -149,7 +146,6 @@ def pe_view_sem_recap( latex_pages = {} # Dictionnaire de la forme nom_fichier => contenu_latex for etudid in etudids: [nom_fichier, contenu_latex] = pe_avislatex.get_avis_poursuite_par_etudiant( - context, jury, etudid, template_latex, @@ -171,7 +167,7 @@ def pe_view_sem_recap( jury.add_file_to_zip("avis/avis_poursuite.tex", doc_latex.encode(PE_LATEX_ENCODING)) # Ajoute image, LaTeX class file(s) and modeles - pe_tools.add_pe_stuff_to_zip(context, jury.zipfile, jury.NOM_EXPORT_ZIP) + pe_tools.add_pe_stuff_to_zip(jury.zipfile, jury.NOM_EXPORT_ZIP) data = jury.get_zipped_data() size = len(data) diff --git a/app/scodoc/sco_abs.py b/app/scodoc/sco_abs.py index 83c7ad465..84c946554 100644 --- a/app/scodoc/sco_abs.py +++ b/app/scodoc/sco_abs.py @@ -63,7 +63,7 @@ def _toboolean(x): return bool(x) -def is_work_saturday(context): +def is_work_saturday(): "Vrai si le samedi est travaillé" return int(sco_preferences.get_preference("work_saturday")) @@ -216,7 +216,7 @@ class ddmmyyyy(object): # d = ddmmyyyy( '21/12/99' ) -def DateRangeISO(context, date_beg, date_end, workable=1): +def DateRangeISO(date_beg, date_end, workable=1): """returns list of dates in [date_beg,date_end] workable = 1 => keeps only workable days""" if not date_beg: @@ -224,7 +224,7 @@ def DateRangeISO(context, date_beg, date_end, workable=1): if not date_end: date_end = date_beg r = [] - work_saturday = is_work_saturday(context) + work_saturday = is_work_saturday() cur = ddmmyyyy(date_beg, work_saturday=work_saturday) end = ddmmyyyy(date_end, work_saturday=work_saturday) while cur <= end: @@ -235,24 +235,23 @@ def DateRangeISO(context, date_beg, date_end, workable=1): return [x.ISO() for x in r] -def day_names(context): +def day_names(): """Returns week day names. If work_saturday property is set, include saturday """ - if is_work_saturday(context): + if is_work_saturday(): return ["Lundi", "Mardi", "Mercredi", "Jeudi", "Vendredi", "Samedi"] else: return ["Lundi", "Mardi", "Mercredi", "Jeudi", "Vendredi"] -def next_iso_day(context, date): +def next_iso_day(date): "return date after date" - d = ddmmyyyy(date, fmt="iso", work_saturday=is_work_saturday(context)) + d = ddmmyyyy(date, fmt="iso", work_saturday=is_work_saturday()) return d.next_day().ISO() def YearTable( - context, year, events=[], firstmonth=9, @@ -283,7 +282,7 @@ def YearTable( events, halfday, dayattributes, - is_work_saturday(context), + is_work_saturday(), pad_width=pad_width, ) ) @@ -624,7 +623,6 @@ AND B.ETUDID = %(etudid)s def add_absence( - context, etudid, jour, matin, @@ -653,10 +651,10 @@ def add_absence( ) cnx.commit() invalidate_abs_etud_date(etudid, jour) - sco_abs_notification.abs_notify(context, etudid, jour) + sco_abs_notification.abs_notify(etudid, jour) -def add_justif(context, etudid, jour, matin, REQUEST, description=None): +def add_justif(etudid, jour, matin, REQUEST, description=None): "Ajoute un justificatif dans la base" # unpublished if _isFarFutur(jour): @@ -678,7 +676,7 @@ def add_justif(context, etudid, jour, matin, REQUEST, description=None): invalidate_abs_etud_date(etudid, jour) -def _add_abslist(context, abslist, REQUEST, moduleimpl_id=None): +def _add_abslist(abslist, REQUEST, moduleimpl_id=None): for a in abslist: etudid, jour, ampm = a.split(":") if ampm == "am": @@ -689,10 +687,10 @@ def _add_abslist(context, abslist, REQUEST, moduleimpl_id=None): raise ValueError("invalid ampm !") # ajoute abs si pas deja absent if count_abs(etudid, jour, jour, matin, moduleimpl_id) == 0: - add_absence(context, etudid, jour, matin, 0, REQUEST, "", moduleimpl_id) + add_absence(etudid, jour, matin, 0, REQUEST, "", moduleimpl_id) -def annule_absence(context, etudid, jour, matin, moduleimpl_id=None): +def annule_absence(etudid, jour, matin, moduleimpl_id=None): """Annule une absence dans la base. N'efface pas l'éventuel justificatif. Args: etudid: @@ -721,7 +719,7 @@ def annule_absence(context, etudid, jour, matin, moduleimpl_id=None): invalidate_abs_etud_date(etudid, jour) -def annule_justif(context, etudid, jour, matin, REQUEST=None): +def annule_justif(etudid, jour, matin, REQUEST=None): "Annule un justificatif" # unpublished matin = _toboolean(matin) @@ -1087,7 +1085,7 @@ def invalidate_abs_etud_date(etudid, date): # was invalidateAbsEtudDate for sem in sems: # Inval cache bulletin et/ou note_table if sco_compute_moy.formsemestre_expressions_use_abscounts( - None, sem["formsemestre_id"] + sem["formsemestre_id"] ): # certaines formules utilisent les absences pdfonly = False diff --git a/app/scodoc/sco_abs_notification.py b/app/scodoc/sco_abs_notification.py index afe9e584a..6f7c0dfcc 100644 --- a/app/scodoc/sco_abs_notification.py +++ b/app/scodoc/sco_abs_notification.py @@ -50,7 +50,7 @@ from app.scodoc import sco_preferences from app.scodoc import sco_users -def abs_notify(context, etudid, date): +def abs_notify(etudid, date): """Check if notifications are requested and send them Considère le nombre d'absence dans le semestre courant (s'il n'y a pas de semestre courant, ne fait rien, @@ -58,15 +58,15 @@ def abs_notify(context, etudid, date): """ from app.scodoc import sco_abs - sem = retreive_current_formsemestre(context, etudid, date) + sem = retreive_current_formsemestre(etudid, date) if not sem: return # non inscrit a la date, pas de notification nbabs, nbabsjust = sco_abs.get_abs_count(etudid, sem) - do_abs_notify(context, sem, etudid, date, nbabs, nbabsjust) + do_abs_notify(sem, etudid, date, nbabs, nbabsjust) -def do_abs_notify(context, sem, etudid, date, nbabs, nbabsjust): +def do_abs_notify(sem, etudid, date, nbabs, nbabsjust): """Given new counts of absences, check if notifications are requested and send them.""" # prefs fallback to global pref if sem is None: if sem: @@ -76,9 +76,9 @@ def do_abs_notify(context, sem, etudid, date, nbabs, nbabsjust): prefs = sco_preferences.SemPreferences(formsemestre_id=sem["formsemestre_id"]) destinations = abs_notify_get_destinations( - context, sem, prefs, etudid, date, nbabs, nbabsjust + sem, prefs, etudid, date, nbabs, nbabsjust ) - msg = abs_notification_message(context, sem, prefs, etudid, nbabs, nbabsjust) + msg = abs_notification_message(sem, prefs, etudid, nbabs, nbabsjust) if not msg: return # abort @@ -86,9 +86,7 @@ def do_abs_notify(context, sem, etudid, date, nbabs, nbabsjust): abs_notify_max_freq = sco_preferences.get_preference("abs_notify_max_freq") destinations_filtered = [] for email_addr in destinations: - nbdays_since_last_notif = user_nbdays_since_last_notif( - context, email_addr, etudid - ) + nbdays_since_last_notif = user_nbdays_since_last_notif(email_addr, etudid) if (nbdays_since_last_notif is None) or ( nbdays_since_last_notif >= abs_notify_max_freq ): @@ -96,7 +94,6 @@ def do_abs_notify(context, sem, etudid, date, nbabs, nbabsjust): if destinations_filtered: abs_notify_send( - context, destinations_filtered, etudid, msg, @@ -106,9 +103,7 @@ def do_abs_notify(context, sem, etudid, date, nbabs, nbabsjust): ) -def abs_notify_send( - context, destinations, etudid, msg, nbabs, nbabsjust, formsemestre_id -): +def abs_notify_send(destinations, etudid, msg, nbabs, nbabsjust, formsemestre_id): """Actually send the notification by email, and register it in database""" cnx = ndb.GetDBConnexion() log("abs_notify: sending notification to %s" % destinations) @@ -116,7 +111,7 @@ def abs_notify_send( for email in destinations: del msg["To"] msg["To"] = email - sco_emails.sendEmail(context, msg) + sco_emails.sendEmail(msg) ndb.SimpleQuery( """insert into absences_notifications (etudid, email, nbabs, nbabsjust, formsemestre_id) @@ -134,15 +129,13 @@ def abs_notify_send( ) -def abs_notify_get_destinations(context, sem, prefs, etudid, date, nbabs, nbabsjust): +def abs_notify_get_destinations(sem, prefs, etudid, date, nbabs, nbabsjust): """Returns set of destination emails to be notified""" formsemestre_id = sem["formsemestre_id"] destinations = [] # list of email address to notify - if abs_notify_is_above_threshold( - context, etudid, nbabs, nbabsjust, formsemestre_id - ): + if abs_notify_is_above_threshold(etudid, nbabs, nbabsjust, formsemestre_id): if sem and prefs["abs_notify_respsem"]: # notifie chaque responsable du semestre for responsable_id in sem["responsables"]: @@ -162,7 +155,7 @@ def abs_notify_get_destinations(context, sem, prefs, etudid, date, nbabs, nbabsj # à cette date # nb: on pourrait prevoir d'utiliser un autre format de message pour ce cas if sem and prefs["abs_notify_respeval"]: - mods = mod_with_evals_at_date(context, date, etudid) + mods = mod_with_evals_at_date(date, etudid) for mod in mods: u = sco_users.user_info(mod["responsable_id"]) if u["email"]: @@ -174,7 +167,7 @@ def abs_notify_get_destinations(context, sem, prefs, etudid, date, nbabs, nbabsj return destinations -def abs_notify_is_above_threshold(context, etudid, nbabs, nbabsjust, formsemestre_id): +def abs_notify_is_above_threshold(etudid, nbabs, nbabsjust, formsemestre_id): """True si il faut notifier les absences (indépendemment du destinataire) nbabs: nombre d'absence (de tous types, unité de compte = demi-journée) @@ -189,7 +182,7 @@ def abs_notify_is_above_threshold(context, etudid, nbabs, nbabsjust, formsemestr abs_notify_abs_increment = sco_preferences.get_preference( "abs_notify_abs_increment", formsemestre_id ) - nbabs_last_notified = etud_nbabs_last_notified(context, etudid, formsemestre_id) + nbabs_last_notified = etud_nbabs_last_notified(etudid, formsemestre_id) if nbabs_last_notified == 0: if nbabs > abs_notify_abs_threshold: @@ -202,7 +195,7 @@ def abs_notify_is_above_threshold(context, etudid, nbabs, nbabsjust, formsemestr return False -def etud_nbabs_last_notified(context, etudid, formsemestre_id=None): +def etud_nbabs_last_notified(etudid, formsemestre_id=None): """nbabs lors de la dernière notification envoyée pour cet étudiant dans ce semestre ou sans semestre (ce dernier cas est nécessaire pour la transition au nouveau code)""" cnx = ndb.GetDBConnexion() @@ -218,7 +211,7 @@ def etud_nbabs_last_notified(context, etudid, formsemestre_id=None): return 0 -def user_nbdays_since_last_notif(context, email_addr, etudid): +def user_nbdays_since_last_notif(email_addr, etudid): """nb days since last notification to this email, or None if no previous notification""" cnx = ndb.GetDBConnexion() cursor = cnx.cursor(cursor_factory=ndb.ScoDocCursor) @@ -234,7 +227,7 @@ def user_nbdays_since_last_notif(context, email_addr, etudid): return None -def abs_notification_message(context, sem, prefs, etudid, nbabs, nbabsjust): +def abs_notification_message(sem, prefs, etudid, nbabs, nbabsjust): """Mime notification message based on template. returns None if sending should be canceled (emplty template). """ @@ -243,7 +236,7 @@ def abs_notification_message(context, sem, prefs, etudid, nbabs, nbabsjust): etud = sco_etud.get_etud_info(etudid=etudid, filled=True)[0] # Variables accessibles dans les balises du template: %(nom_variable)s : - values = sco_bulletins.make_context_dict(context, sem, etud) + values = sco_bulletins.make_context_dict(sem, etud) values["nbabs"] = nbabs values["nbabsjust"] = nbabsjust @@ -270,7 +263,7 @@ def abs_notification_message(context, sem, prefs, etudid, nbabs, nbabsjust): return msg -def retreive_current_formsemestre(context, etudid, cur_date): +def retreive_current_formsemestre(etudid, cur_date): """Get formsemestre dans lequel etudid est (ou était) inscrit a la date indiquée date est une chaine au format ISO (yyyy-mm-dd) """ @@ -288,7 +281,7 @@ def retreive_current_formsemestre(context, etudid, cur_date): return sem -def mod_with_evals_at_date(context, date_abs, etudid): +def mod_with_evals_at_date(date_abs, etudid): """Liste des moduleimpls avec des evaluations à la date indiquée""" req = """SELECT m.id AS moduleimpl_id, m.* FROM notes_moduleimpl m, notes_evaluation e, notes_moduleimpl_inscription i diff --git a/app/scodoc/sco_abs_views.py b/app/scodoc/sco_abs_views.py index c9151e4df..59b59e359 100644 --- a/app/scodoc/sco_abs_views.py +++ b/app/scodoc/sco_abs_views.py @@ -51,7 +51,6 @@ from app.scodoc.sco_exceptions import ScoValueError def doSignaleAbsence( - context, datedebut, datefin, moduleimpl_id=None, @@ -77,13 +76,12 @@ def doSignaleAbsence( if not moduleimpl_id: moduleimpl_id = None description_abs = description - dates = sco_abs.DateRangeISO(context, datedebut, datefin) + dates = sco_abs.DateRangeISO(datedebut, datefin) nbadded = 0 demijournee = int(demijournee) for jour in dates: if demijournee == 2: sco_abs.add_absence( - context, etudid, jour, False, @@ -93,7 +91,6 @@ def doSignaleAbsence( moduleimpl_id, ) sco_abs.add_absence( - context, etudid, jour, True, @@ -105,7 +102,6 @@ def doSignaleAbsence( nbadded += 2 else: sco_abs.add_absence( - context, etudid, jour, demijournee, @@ -155,12 +151,12 @@ def doSignaleAbsence(
""" % etud ) - H.append(sco_find_etud.form_search_etud(context, REQUEST)) + H.append(sco_find_etud.form_search_etud(REQUEST)) H.append(html_sco_header.sco_footer()) return "\n".join(H) -def SignaleAbsenceEtud(context, REQUEST=None): # etudid implied +def SignaleAbsenceEtud(REQUEST=None): # etudid implied """Formulaire individuel simple de signalement d'une absence""" # brute-force portage from very old dtml code ... etud = sco_etud.get_etud_info(filled=1, REQUEST=REQUEST)[0] @@ -230,7 +226,6 @@ def SignaleAbsenceEtud(context, REQUEST=None): # etudid implied """""" % url_for("scolar.ficheEtud", scodoc_dept=g.scodoc_dept, etudid=etud["etudid"]), sco_photos.etud_photo_html( - context, etudid=etudid, title="fiche de " + etud["nomprenom"], REQUEST=REQUEST, @@ -281,7 +276,6 @@ Raison: (optionnel) def doJustifAbsence( - context, datedebut, datefin, demijournee, @@ -302,13 +296,12 @@ def doJustifAbsence( etud = sco_etud.get_etud_info(filled=1, etudid=etudid, REQUEST=REQUEST)[0] etudid = etud["etudid"] description_abs = description - dates = sco_abs.DateRangeISO(context, datedebut, datefin) + dates = sco_abs.DateRangeISO(datedebut, datefin) nbadded = 0 demijournee = int(demijournee) for jour in dates: if demijournee == 2: sco_abs.add_justif( - context, etudid=etudid, jour=jour, matin=False, @@ -316,7 +309,6 @@ def doJustifAbsence( description=description_abs, ) sco_abs.add_justif( - context, etudid=etudid, jour=jour, matin=True, @@ -326,7 +318,6 @@ def doJustifAbsence( nbadded += 2 else: sco_abs.add_justif( - context, etudid=etudid, jour=jour, matin=demijournee, @@ -361,12 +352,12 @@ def doJustifAbsence(
""" % etud ) - H.append(sco_find_etud.form_search_etud(context, REQUEST)) + H.append(sco_find_etud.form_search_etud(REQUEST)) H.append(html_sco_header.sco_footer()) return "\n".join(H) -def JustifAbsenceEtud(context, REQUEST=None): # etudid implied +def JustifAbsenceEtud(REQUEST=None): # etudid implied """Formulaire individuel simple de justification d'une absence""" # brute-force portage from very old dtml code ... etud = sco_etud.get_etud_info(filled=1, REQUEST=REQUEST)[0] @@ -383,7 +374,6 @@ def JustifAbsenceEtud(context, REQUEST=None): # etudid implied """
""" % url_for("scolar.ficheEtud", scodoc_dept=g.scodoc_dept, etudid=etudid), sco_photos.etud_photo_html( - context, etudid=etudid, title="fiche de " + etud["nomprenom"], REQUEST=REQUEST, @@ -423,22 +413,22 @@ Raison: (optionnel) def doAnnuleAbsence( - context, datedebut, datefin, demijournee, etudid=False, REQUEST=None + datedebut, datefin, demijournee, etudid=False, REQUEST=None ): # etudid implied """Annulation des absences pour une demi journée""" etud = sco_etud.get_etud_info(filled=1, etudid=etudid, REQUEST=REQUEST)[0] etudid = etud["etudid"] - dates = sco_abs.DateRangeISO(context, datedebut, datefin) + dates = sco_abs.DateRangeISO(datedebut, datefin) nbadded = 0 demijournee = int(demijournee) for jour in dates: if demijournee == 2: - sco_abs.annule_absence(context, etudid, jour, False) - sco_abs.annule_absence(context, etudid, jour, True) + sco_abs.annule_absence(etudid, jour, False) + sco_abs.annule_absence(etudid, jour, True) nbadded += 2 else: - sco_abs.annule_absence(context, etudid, jour, demijournee) + sco_abs.annule_absence(etudid, jour, demijournee) nbadded += 1 # H = [ @@ -467,12 +457,12 @@ autre absence pour %(nomprenom)s
""" % etud ) - H.append(sco_find_etud.form_search_etud(context, REQUEST)) + H.append(sco_find_etud.form_search_etud(REQUEST)) H.append(html_sco_header.sco_footer()) return "\n".join(H) -def AnnuleAbsenceEtud(context, REQUEST=None): # etudid implied +def AnnuleAbsenceEtud(REQUEST=None): # etudid implied """Formulaire individuel simple d'annulation d'une absence""" # brute-force portage from very old dtml code ... etud = sco_etud.get_etud_info(filled=1, REQUEST=REQUEST)[0] @@ -490,7 +480,6 @@ def AnnuleAbsenceEtud(context, REQUEST=None): # etudid implied """""" % url_for("scolar.ficheEtud", scodoc_dept=g.scodoc_dept, etudid=etudid), sco_photos.etud_photo_html( - context, etudid=etudid, title="fiche de " + etud["nomprenom"], REQUEST=REQUEST, @@ -559,23 +548,21 @@ def AnnuleAbsenceEtud(context, REQUEST=None): # etudid implied return "\n".join(H) -def doAnnuleJustif( - context, datedebut0, datefin0, demijournee, REQUEST=None -): # etudid implied +def doAnnuleJustif(datedebut0, datefin0, demijournee, REQUEST=None): # etudid implied """Annulation d'une justification""" etud = sco_etud.get_etud_info(filled=1, REQUEST=REQUEST)[0] etudid = etud["etudid"] - dates = sco_abs.DateRangeISO(context, datedebut0, datefin0) + dates = sco_abs.DateRangeISO(datedebut0, datefin0) nbadded = 0 demijournee = int(demijournee) for jour in dates: # Attention: supprime matin et après-midi if demijournee == 2: - sco_abs.annule_justif(context, etudid, jour, False, REQUEST=REQUEST) - sco_abs.annule_justif(context, etudid, jour, True, REQUEST=REQUEST) + sco_abs.annule_justif(etudid, jour, False, REQUEST=REQUEST) + sco_abs.annule_justif(etudid, jour, True, REQUEST=REQUEST) nbadded += 2 else: - sco_abs.annule_justif(context, etudid, jour, demijournee, REQUEST=REQUEST) + sco_abs.annule_justif(etudid, jour, demijournee, REQUEST=REQUEST) nbadded += 1 # H = [ @@ -604,12 +591,12 @@ autre absence pour %(nomprenom)s
""" % etud ) - H.append(sco_find_etud.form_search_etud(context, REQUEST)) + H.append(sco_find_etud.form_search_etud(REQUEST)) H.append(html_sco_header.sco_footer()) return "\n".join(H) -def AnnuleAbsencesDatesNoJust(context, etudid, dates, moduleimpl_id=None): +def AnnuleAbsencesDatesNoJust(etudid, dates, moduleimpl_id=None): """Supprime les absences non justifiées aux dates indiquées Ne supprime pas les justificatifs éventuels. Args: @@ -634,7 +621,7 @@ def AnnuleAbsencesDatesNoJust(context, etudid, dates, moduleimpl_id=None): matin = 0 else: raise ValueError("invalid ampm !") - sco_abs.annule_absence(context, etudid, jour, matin, moduleimpl_id) + sco_abs.annule_absence(etudid, jour, matin, moduleimpl_id) return cnx = ndb.GetDBConnexion() cursor = cnx.cursor(cursor_factory=ndb.ScoDocCursor) @@ -668,14 +655,14 @@ def AnnuleAbsencesDatesNoJust(context, etudid, dates, moduleimpl_id=None): cnx.commit() -def EtatAbsences(context, REQUEST=None): +def EtatAbsences(): """Etat des absences: choix du groupe""" # crude portage from 1999 DTML H = [ html_sco_header.sco_header(page_title="Etat des absences"), """

Etat des absences pour un groupe

""", - formChoixSemestreGroupe(context), + formChoixSemestreGroupe(), """
Date de début (j/m/a) : @@ -694,7 +681,7 @@ def EtatAbsences(context, REQUEST=None): return "\n".join(H) -def formChoixSemestreGroupe(context, all=False): +def formChoixSemestreGroupe(all=False): """partie de formulaire pour le choix d'un semestre et d'un groupe. Si all, donne tous les semestres (même ceux verrouillés). """ @@ -722,7 +709,7 @@ def formChoixSemestreGroupe(context, all=False): return "\n".join(H) -def CalAbs(context, etudid, sco_year=None): +def CalAbs(etudid, sco_year=None): """Calendrier des absences d'un etudiant""" # crude portage from 1999 DTML REQUEST = None # XXX @@ -749,7 +736,7 @@ def CalAbs(context, etudid, sco_year=None): events.append( (str(a["jour"]), "X", "#8EA2C6", "", a["matin"], a["description"]) ) - CalHTML = sco_abs.YearTable(context, anneescolaire, events=events, halfday=1) + CalHTML = sco_abs.YearTable(anneescolaire, events=events, halfday=1) # H = [ @@ -773,7 +760,6 @@ def CalAbs(context, etudid, sco_year=None): % ( url_for("scolar.ficheEtud", scodoc_dept=g.scodoc_dept, etudid=etudid), sco_photos.etud_photo_html( - context, etudid=etudid, title="fiche de " + etud["nomprenom"], REQUEST=REQUEST, @@ -796,7 +782,6 @@ def CalAbs(context, etudid, sco_year=None): def ListeAbsEtud( - context, etudid, with_evals=True, format="html", @@ -822,7 +807,7 @@ def ListeAbsEtud( # Liste des absences et titres colonnes tables: titles, columns_ids, absnonjust, absjust = _TablesAbsEtud( - context, etudid, datedebut, with_evals=with_evals, format=format + etudid, datedebut, with_evals=with_evals, format=format ) if REQUEST: base_url_nj = "%s?etudid=%s&absjust_only=0" % (REQUEST.URL0, etudid) @@ -908,7 +893,6 @@ def ListeAbsEtud( def _TablesAbsEtud( - context, etudid, datedebut, with_evals=True, diff --git a/app/scodoc/sco_apogee_compare.py b/app/scodoc/sco_apogee_compare.py index 832190682..25858300c 100644 --- a/app/scodoc/sco_apogee_compare.py +++ b/app/scodoc/sco_apogee_compare.py @@ -61,7 +61,7 @@ _help_txt = """ """ -def apo_compare_csv_form(context, REQUEST=None): +def apo_compare_csv_form(): """Form: submit 2 CSV files to compare them.""" H = [ html_sco_header.sco_header(page_title="Comparaison de fichiers Apogée"), @@ -88,7 +88,7 @@ def apo_compare_csv_form(context, REQUEST=None): return "\n".join(H) -def apo_compare_csv(context, A_file, B_file, autodetect=True, REQUEST=None): +def apo_compare_csv(A_file, B_file, autodetect=True): """Page comparing 2 Apogee CSV files""" A = _load_apo_data(A_file, autodetect=autodetect) B = _load_apo_data(B_file, autodetect=autodetect) @@ -98,7 +98,7 @@ def apo_compare_csv(context, A_file, B_file, autodetect=True, REQUEST=None): "

Comparaison de fichiers Apogée

", _help_txt, '
', - _apo_compare_csv(context, A, B, REQUEST=None), + _apo_compare_csv(A, B), "
", """

Autre comparaison

""", html_sco_header.sco_footer(), @@ -119,7 +119,7 @@ def _load_apo_data(csvfile, autodetect=True): return apo_data -def _apo_compare_csv(context, A, B, REQUEST=None): +def _apo_compare_csv(A, B): """Generate html report comparing A and B, two instances of ApoData representing Apogee CSV maquettes. """ @@ -230,7 +230,7 @@ def _apo_compare_csv(context, A, B, REQUEST=None):

""" ) - T = apo_table_compare_etud_results(context, A, B, REQUEST=REQUEST) + T = apo_table_compare_etud_results(A, B) if T.get_nb_rows() > 0: L.append(T.html()) else: @@ -245,7 +245,7 @@ def _apo_compare_csv(context, A, B, REQUEST=None): return "\n".join(L) -def apo_table_compare_etud_results(context, A, B, REQUEST=None): +def apo_table_compare_etud_results(A, B): """""" D = compare_etuds_res(A, B) T = GenTable( diff --git a/app/scodoc/sco_apogee_csv.py b/app/scodoc/sco_apogee_csv.py index fff735b1a..deab4e159 100644 --- a/app/scodoc/sco_apogee_csv.py +++ b/app/scodoc/sco_apogee_csv.py @@ -296,7 +296,7 @@ class ApoEtud(dict): def __repr__(self): return "ApoEtud( nom='%s', nip='%s' )" % (self["nom"], self["nip"]) - def lookup_scodoc(self, context, etape_formsemestre_ids): + def lookup_scodoc(self, etape_formsemestre_ids): """Cherche l'étudiant ScoDoc associé à cet étudiant Apogée. S'il n'est pas trouvé (état "orphelin", dans Apo mais pas chez nous), met .etud à None. @@ -323,13 +323,13 @@ class ApoEtud(dict): else: self.etat = ETUD_OK - def associate_sco(self, context, apo_data): + def associate_sco(self, apo_data): """Recherche les valeurs des éléments Apogée pour cet étudiant Set .new_cols """ self.col_elts = {} # {'V1RT': {'R': 'ADM', 'J': '', 'B': 20, 'N': '12.14'}} if self.etat is None: - self.lookup_scodoc(context, apo_data.etape_formsemestre_ids) + self.lookup_scodoc(apo_data.etape_formsemestre_ids) if self.etat != ETUD_OK: self.new_cols = ( self.cols @@ -342,11 +342,9 @@ class ApoEtud(dict): code, None ) # {'R': ADM, 'J': '', 'B': 20, 'N': '12.14'} if el is None: # pas déjà trouvé - cur_sem, autre_sem = self.etud_semestres_de_etape(context, apo_data) + cur_sem, autre_sem = self.etud_semestres_de_etape(apo_data) for sem in apo_data.sems_etape: - el = self.search_elt_in_sem( - context, code, sem, cur_sem, autre_sem - ) + el = self.search_elt_in_sem(code, sem, cur_sem, autre_sem) if el != None: sco_elts[code] = el break @@ -376,7 +374,7 @@ class ApoEtud(dict): # codes = set([apo_data.cols[col_id].code for col_id in apo_data.col_ids]) # return codes - set(sco_elts) - def search_elt_in_sem(self, context, code, sem, cur_sem, autre_sem): + def search_elt_in_sem(self, code, sem, cur_sem, autre_sem): """ VET code jury etape ELP élément pédagogique: UE, module @@ -425,14 +423,14 @@ class ApoEtud(dict): export_res_etape = Se.all_other_validated() if export_res_etape: - return self.comp_elt_annuel(context, etudid, cur_sem, autre_sem) + return self.comp_elt_annuel(etudid, cur_sem, autre_sem) else: return VOID_APO_RES # Element semestre: if code in sem["elt_sem_apo"].split(","): if self.export_res_sem: - return self.comp_elt_semestre(context, nt, decision, etudid) + return self.comp_elt_semestre(nt, decision, etudid) else: return VOID_APO_RES @@ -471,7 +469,7 @@ class ApoEtud(dict): # return None # element Apogee non trouvé dans ce semestre - def comp_elt_semestre(self, context, nt, decision, etudid): + def comp_elt_semestre(self, nt, decision, etudid): """Calcul résultat apo semestre""" # resultat du semestre decision_apo = code_scodoc_to_apo(decision["code"]) @@ -486,7 +484,7 @@ class ApoEtud(dict): note_str = _apo_fmt_note(note) return dict(N=note_str, B=20, J="", R=decision_apo, M="") - def comp_elt_annuel(self, context, etudid, cur_sem, autre_sem): + def comp_elt_annuel(self, etudid, cur_sem, autre_sem): """Calcul resultat annuel (VET) à partir du semestre courant et de l'autre (le suivant ou le précédent complétant l'année scolaire) """ @@ -517,7 +515,7 @@ class ApoEtud(dict): if not autre_sem: # formations monosemestre, ou code VET semestriel, # ou jury intermediaire et etudiant non redoublant... - return self.comp_elt_semestre(context, cur_nt, cur_decision, etudid) + return self.comp_elt_semestre(cur_nt, cur_decision, etudid) decision_apo = code_scodoc_to_apo(cur_decision["code"]) @@ -554,7 +552,7 @@ class ApoEtud(dict): return dict(N=note_str, B=20, J="", R=decision_apo_annuelle, M="") - def etud_semestres_de_etape(self, context, apo_data): + def etud_semestres_de_etape(self, apo_data): """ Lorsqu'on a une formation semestrialisée mais avec un code étape annuel, il faut considérer les deux semestres ((S1,S2) ou (S3,S4)) pour calculer @@ -712,10 +710,9 @@ class ApoData(object): def set_periode(self, periode): # currently unused self.periode = periode - def setup(self, context): + def setup(self): """Recherche semestres ScoDoc concernés""" - self.context = context - self.sems_etape = comp_apo_sems(context, self.etape_apogee, self.annee_scolaire) + self.sems_etape = comp_apo_sems(self.etape_apogee, self.annee_scolaire) self.etape_formsemestre_ids = {s["formsemestre_id"] for s in self.sems_etape} if self.periode != None: self.sems_periode = [ @@ -1114,7 +1111,7 @@ def _apo_skip_section(f): # ------------------------------------- -def comp_apo_sems(context, etape_apogee, annee_scolaire): +def comp_apo_sems(etape_apogee, annee_scolaire): """ :param etape_apogee: etape (string or ApoEtapeVDI) :param annee_scolaire: annee (int) @@ -1125,7 +1122,7 @@ def comp_apo_sems(context, etape_apogee, annee_scolaire): ) -def nar_etuds_table(context, apo_data, NAR_Etuds): +def nar_etuds_table(apo_data, NAR_Etuds): """Liste les NAR -> excel table""" code_etape = apo_data.etape_apogee today = datetime.datetime.today().strftime("%d/%m/%y") @@ -1183,7 +1180,6 @@ def nar_etuds_table(context, apo_data, NAR_Etuds): def export_csv_to_apogee( - context, apo_csv_data, periode=None, dest_zip=None, @@ -1211,11 +1207,11 @@ def export_csv_to_apogee( export_res_sdj=export_res_sdj, export_res_rat=export_res_rat, ) - apo_data.setup(context) # -> .sems_etape + apo_data.setup() # -> .sems_etape for e in apo_data.etuds: - e.lookup_scodoc(context, apo_data.etape_formsemestre_ids) - e.associate_sco(context, apo_data) + e.lookup_scodoc(apo_data.etape_formsemestre_ids) + e.associate_sco(apo_data) # Ré-écrit le fichier Apogée f = io.StringIO() @@ -1225,7 +1221,7 @@ def export_csv_to_apogee( # Table des NAR: NAR_Etuds = [e for e in apo_data.etuds if e.is_NAR] if NAR_Etuds: - nar_xls = nar_etuds_table(context, apo_data, NAR_Etuds) + nar_xls = nar_etuds_table(apo_data, NAR_Etuds) else: nar_xls = None diff --git a/app/scodoc/sco_archives.py b/app/scodoc/sco_archives.py index 5aea4c6bc..2dc2f65fb 100644 --- a/app/scodoc/sco_archives.py +++ b/app/scodoc/sco_archives.py @@ -109,7 +109,7 @@ class BaseArchiver(object): scu.GSL.release() return obj_dir - def list_oids(self, context): + def list_oids(self): """ :return: list of archive oids """ @@ -228,7 +228,7 @@ class BaseArchiver(object): # XXX très incomplet: devrait inférer et assigner un type MIME archive_id = self.get_id_from_name(oid, archive_name) data = self.get(archive_id, filename) - ext = os.path.splitext(scu.strlower(filename))[1] + ext = os.path.splitext(filename.lower())[1] if ext == ".html" or ext == ".htm": return data elif ext == ".xml": @@ -262,7 +262,6 @@ PVArchive = SemsArchiver() def do_formsemestre_archive( - context, REQUEST, formsemestre_id, group_ids=[], # si indiqué, ne prend que ces groupes @@ -297,14 +296,12 @@ def do_formsemestre_archive( etudids = [m["etudid"] for m in groups_infos.members] # Tableau recap notes en XLS (pour tous les etudiants, n'utilise pas les groupes) - data, _, _ = make_formsemestre_recapcomplet( - context, REQUEST, formsemestre_id, format="xls" - ) + data, _, _ = make_formsemestre_recapcomplet(formsemestre_id, format="xls") if data: PVArchive.store(archive_id, "Tableau_moyennes" + scu.XLSX_SUFFIX, data) # Tableau recap notes en HTML (pour tous les etudiants, n'utilise pas les groupes) data, _, _ = make_formsemestre_recapcomplet( - context, REQUEST, formsemestre_id, format="html", disable_etudlink=True + formsemestre_id, format="html", disable_etudlink=True ) if data: data = "\n".join( @@ -324,25 +321,24 @@ def do_formsemestre_archive( # Bulletins en XML (pour tous les etudiants, n'utilise pas les groupes) data, _, _ = make_formsemestre_recapcomplet( - context, REQUEST, formsemestre_id, format="xml", xml_with_decisions=True + formsemestre_id, format="xml", xml_with_decisions=True ) if data: PVArchive.store(archive_id, "Bulletins.xml", data) # Decisions de jury, en XLS data = sco_pvjury.formsemestre_pvjury( - context, formsemestre_id, format="xls", REQUEST=REQUEST, publish=False + formsemestre_id, format="xls", REQUEST=REQUEST, publish=False ) if data: PVArchive.store(archive_id, "Decisions_Jury" + scu.XLSX_SUFFIX, data) # Classeur bulletins (PDF) data, _ = sco_bulletins_pdf.get_formsemestre_bulletins_pdf( - context, formsemestre_id, REQUEST, version=bulVersion + formsemestre_id, REQUEST, version=bulVersion ) if data: PVArchive.store(archive_id, "Bulletins.pdf", data) # Lettres individuelles (PDF): data = sco_pvpdf.pdf_lettres_individuelles( - context, formsemestre_id, etudids=etudids, date_jury=date_jury, @@ -352,13 +348,9 @@ def do_formsemestre_archive( if data: PVArchive.store(archive_id, "CourriersDecisions%s.pdf" % groups_filename, data) # PV de jury (PDF): - dpv = sco_pvjury.dict_pvjury( - context, formsemestre_id, etudids=etudids, with_prev=True - ) + dpv = sco_pvjury.dict_pvjury(formsemestre_id, etudids=etudids, with_prev=True) data = sco_pvpdf.pvjury_pdf( - context, dpv, - REQUEST, date_commission=date_commission, date_jury=date_jury, numeroArrete=numeroArrete, @@ -372,7 +364,7 @@ def do_formsemestre_archive( PVArchive.store(archive_id, "PV_Jury%s.pdf" % groups_filename, data) -def formsemestre_archive(context, REQUEST, formsemestre_id, group_ids=[]): +def formsemestre_archive(REQUEST, formsemestre_id, group_ids=[]): """Make and store new archive for this formsemestre. (all students or only selected groups) """ @@ -474,7 +466,6 @@ enregistrés et non modifiables, on peut les retrouver ultérieurement. else: tf[2]["anonymous"] = False do_formsemestre_archive( - context, REQUEST, formsemestre_id, group_ids=group_ids, diff --git a/app/scodoc/sco_archives_etud.py b/app/scodoc/sco_archives_etud.py index 231f3f801..d14ca48ab 100644 --- a/app/scodoc/sco_archives_etud.py +++ b/app/scodoc/sco_archives_etud.py @@ -232,12 +232,11 @@ def etud_get_archived_file(REQUEST, etudid, archive_name, filename): # --- Upload d'un ensemble de fichiers (pour un groupe d'étudiants) -def etudarchive_generate_excel_sample(context, group_id=None, REQUEST=None): +def etudarchive_generate_excel_sample(group_id=None, REQUEST=None): """Feuille excel pour import fichiers etudiants (utilisé pour admissions)""" fmt = sco_import_etuds.sco_import_format() data = sco_import_etuds.sco_import_generate_excel_sample( fmt, - context=context, group_ids=[group_id], only_tables=["identite"], exclude_cols=[ @@ -248,14 +247,13 @@ def etudarchive_generate_excel_sample(context, group_id=None, REQUEST=None): "photo_filename", ], extra_cols=["fichier_a_charger"], - REQUEST=REQUEST, ) return sco_excel.send_excel_file( REQUEST, data, "ImportFichiersEtudiants" + scu.XLSX_SUFFIX ) -def etudarchive_import_files_form(context, group_id, REQUEST=None): +def etudarchive_import_files_form(group_id, REQUEST=None): """Formulaire pour importation fichiers d'un groupe""" H = [ html_sco_header.sco_header( @@ -316,25 +314,21 @@ def etudarchive_import_files_form(context, group_id, REQUEST=None): ) else: return etudarchive_import_files( - context, group_id=tf[2]["group_id"], xlsfile=tf[2]["xlsfile"], zipfile=tf[2]["zipfile"], - REQUEST=REQUEST, description=tf[2]["description"], ) -def etudarchive_import_files( - context, group_id=None, xlsfile=None, zipfile=None, REQUEST=None, description="" -): - def callback(context, etud, data, filename, REQUEST): +def etudarchive_import_files(group_id=None, xlsfile=None, zipfile=None, description=""): + def callback(etud, data, filename): _store_etud_file_to_new_archive(etud["etudid"], data, filename, description) filename_title = "fichier_a_charger" page_title = "Téléchargement de fichiers associés aux étudiants" # Utilise la fontion au depart developpee pour les photos r = sco_trombino.zip_excel_import_files( - context, xlsfile, zipfile, REQUEST, callback, filename_title, page_title + xlsfile, zipfile, callback, filename_title, page_title ) return r + html_sco_header.sco_footer() diff --git a/app/scodoc/sco_bulletins.py b/app/scodoc/sco_bulletins.py index 53e6286d4..09b426f88 100644 --- a/app/scodoc/sco_bulletins.py +++ b/app/scodoc/sco_bulletins.py @@ -80,7 +80,7 @@ from app.scodoc import sco_bulletins_legacy from app.scodoc import sco_bulletins_ucac # format expérimental UCAC Cameroun -def make_context_dict(context, sem, etud): +def make_context_dict(sem, etud): """Construit dictionnaire avec valeurs pour substitution des textes (preferences bul_pdf_*) """ @@ -122,7 +122,7 @@ def make_context_dict(context, sem, etud): def formsemestre_bulletinetud_dict( - context, formsemestre_id, etudid, version="long", REQUEST=None + formsemestre_id, etudid, version="long", REQUEST=None ): """Collecte informations pour bulletin de notes Retourne un dictionnaire (avec valeur par défaut chaine vide). @@ -179,7 +179,6 @@ def formsemestre_bulletinetud_dict( # --- Decision Jury infos, dpv = etud_descr_situation_semestre( - context, etudid, formsemestre_id, format="html", @@ -257,7 +256,7 @@ def formsemestre_bulletinetud_dict( rang = "" rang_gr, ninscrits_gr, gr_name = get_etud_rangs_groups( - context, etudid, formsemestre_id, partitions, partitions_etud_groups, nt + etudid, formsemestre_id, partitions, partitions_etud_groups, nt ) if nt.get_moduleimpls_attente(): @@ -322,7 +321,7 @@ def formsemestre_bulletinetud_dict( else: u["ects"] = "-" modules, ue_attente = _ue_mod_bulletin( - context, etudid, formsemestre_id, ue["ue_id"], modimpls, nt, version + etudid, formsemestre_id, ue["ue_id"], modimpls, nt, version ) # u["modules"] = modules # detail des modules de l'UE (dans le semestre courant) @@ -353,7 +352,6 @@ def formsemestre_bulletinetud_dict( ) # > toutes notes u["modules_capitalized"], _ = _ue_mod_bulletin( - context, etudid, formsemestre_id, ue_status["capitalized_ue_id"], @@ -387,7 +385,7 @@ def formsemestre_bulletinetud_dict( I["matieres_modules"].update(_sort_mod_by_matiere(modules, nt, etudid)) # - C = make_context_dict(context, I["sem"], I["etud"]) + C = make_context_dict(I["sem"], I["etud"]) C.update(I) # # log( 'C = \n%s\n' % pprint.pformat(C) ) # tres pratique pour voir toutes les infos dispo @@ -409,7 +407,7 @@ def _sort_mod_by_matiere(modlist, nt, etudid): return matmod -def _ue_mod_bulletin(context, etudid, formsemestre_id, ue_id, modimpls, nt, version): +def _ue_mod_bulletin(etudid, formsemestre_id, ue_id, modimpls, nt, version): """Infos sur les modules (et évaluations) dans une UE (ajoute les informations aux modimpls) Result: liste de modules de l'UE avec les infos dans chacun (seulement ceux où l'étudiant est inscrit). @@ -600,7 +598,7 @@ def _ue_mod_bulletin(context, etudid, formsemestre_id, ue_id, modimpls, nt, vers def get_etud_rangs_groups( - context, etudid, formsemestre_id, partitions, partitions_etud_groups, nt + etudid, formsemestre_id, partitions, partitions_etud_groups, nt ): """Ramene rang et nb inscrits dans chaque partition""" rang_gr, ninscrits_gr, gr_name = {}, {}, {} @@ -624,7 +622,6 @@ def get_etud_rangs_groups( def etud_descr_situation_semestre( - context, etudid, formsemestre_id, ne="", @@ -722,7 +719,7 @@ def etud_descr_situation_semestre( infos["descr_decision_jury"] = "Défaillant%s" % ne infos["situation"] += " " + infos["descr_defaillance"] - dpv = sco_pvjury.dict_pvjury(context, formsemestre_id, etudids=[etudid]) + dpv = sco_pvjury.dict_pvjury(formsemestre_id, etudids=[etudid]) if not show_decisions: return infos, dpv @@ -764,7 +761,6 @@ def etud_descr_situation_semestre( # ------ Page bulletin def formsemestre_bulletinetud( - context, etudid=None, formsemestre_id=None, format="html", @@ -782,7 +778,6 @@ def formsemestre_bulletinetud( return scu.log_unknown_etud(REQUEST, format=format) bulletin = do_formsemestre_bulletinetud( - context, formsemestre_id, etudid, format=format, @@ -798,7 +793,7 @@ def formsemestre_bulletinetud( sem = sco_formsemestre.get_formsemestre(formsemestre_id) H = [ _formsemestre_bulletinetud_header_html( - context, etud, etudid, sem, formsemestre_id, format, version, REQUEST + etud, etudid, sem, formsemestre_id, format, version, REQUEST ), bulletin, ] @@ -852,7 +847,6 @@ def can_send_bulletin_by_mail(formsemestre_id): def do_formsemestre_bulletinetud( - context, formsemestre_id, etudid, version="long", # short, long, selectedevals @@ -870,7 +864,6 @@ def do_formsemestre_bulletinetud( """ if format == "xml": bul = sco_bulletins_xml.make_xml_formsemestre_bulletinetud( - context, formsemestre_id, etudid, REQUEST=REQUEST, @@ -883,7 +876,6 @@ def do_formsemestre_bulletinetud( elif format == "json": bul = sco_bulletins_json.make_json_formsemestre_bulletinetud( - context, formsemestre_id, etudid, REQUEST=REQUEST, @@ -893,20 +885,17 @@ def do_formsemestre_bulletinetud( ) return bul, "" - I = formsemestre_bulletinetud_dict( - context, formsemestre_id, etudid, REQUEST=REQUEST - ) + I = formsemestre_bulletinetud_dict(formsemestre_id, etudid, REQUEST=REQUEST) etud = I["etud"] if format == "html": htm, _ = sco_bulletins_generator.make_formsemestre_bulletinetud( - context, I, version=version, format="html", REQUEST=REQUEST + I, version=version, format="html", REQUEST=REQUEST ) return htm, I["filigranne"] elif format == "pdf" or format == "pdfpart": bul, filename = sco_bulletins_generator.make_formsemestre_bulletinetud( - context, I, version=version, format="pdf", @@ -931,11 +920,11 @@ def do_formsemestre_bulletinetud( htm = "" # speed up if html version not needed else: htm, _ = sco_bulletins_generator.make_formsemestre_bulletinetud( - context, I, version=version, format="html", REQUEST=REQUEST + I, version=version, format="html", REQUEST=REQUEST ) pdfdata, filename = sco_bulletins_generator.make_formsemestre_bulletinetud( - context, I, version=version, format="pdf", REQUEST=REQUEST + I, version=version, format="pdf", REQUEST=REQUEST ) if prefer_mail_perso: @@ -953,7 +942,7 @@ def do_formsemestre_bulletinetud( ) + htm return h, I["filigranne"] # - mail_bulletin(context, formsemestre_id, I, pdfdata, filename, recipient_addr) + mail_bulletin(formsemestre_id, I, pdfdata, filename, recipient_addr) emaillink = '%s' % ( recipient_addr, recipient_addr, @@ -968,7 +957,7 @@ def do_formsemestre_bulletinetud( raise ValueError("do_formsemestre_bulletinetud: invalid format (%s)" % format) -def mail_bulletin(context, formsemestre_id, I, pdfdata, filename, recipient_addr): +def mail_bulletin(formsemestre_id, I, pdfdata, filename, recipient_addr): """Send bulletin by email to etud If bul_mail_list_abs pref is true, put list of absences in mail body (text). """ @@ -991,7 +980,7 @@ def mail_bulletin(context, formsemestre_id, I, pdfdata, filename, recipient_addr if sco_preferences.get_preference("bul_mail_list_abs"): hea += "\n\n" + sco_abs_views.ListeAbsEtud( - context, etud["etudid"], with_evals=False, format="text" + etud["etudid"], with_evals=False, format="text" ) msg = MIMEMultipart() @@ -1015,11 +1004,10 @@ def mail_bulletin(context, formsemestre_id, I, pdfdata, filename, recipient_addr email.encoders.encode_base64(att) msg.attach(att) log("mail bulletin a %s" % msg["To"]) - sco_emails.sendEmail(context, msg) + sco_emails.sendEmail(msg) def _formsemestre_bulletinetud_header_html( - context, etud, etudid, sem, @@ -1095,7 +1083,7 @@ def _formsemestre_bulletinetud_header_html( { "title": 'Version papier (pdf, format "%s")' % sco_bulletins_generator.bulletin_get_class_name_displayed( - context, formsemestre_id + formsemestre_id ), "endpoint": endpoint, "args": { @@ -1220,7 +1208,7 @@ def _formsemestre_bulletinetud_header_html( % ( url_for("scolar.ficheEtud", scodoc_dept=g.scodoc_dept, etudid=etudid), sco_photos.etud_photo_html( - context, etud, title="fiche de " + etud["nom"], REQUEST=REQUEST + etud, title="fiche de " + etud["nom"], REQUEST=REQUEST ), ) ) diff --git a/app/scodoc/sco_bulletins_generator.py b/app/scodoc/sco_bulletins_generator.py index fb8584bc0..d2ecdddd0 100644 --- a/app/scodoc/sco_bulletins_generator.py +++ b/app/scodoc/sco_bulletins_generator.py @@ -85,7 +85,7 @@ def bulletin_get_class(class_name): return BULLETIN_CLASSES[class_name] -def bulletin_get_class_name_displayed(context, formsemestre_id): +def bulletin_get_class_name_displayed(formsemestre_id): """Le nom du générateur utilisé, en clair""" from app.scodoc import sco_preferences @@ -106,7 +106,6 @@ class BulletinGenerator(object): def __init__( self, - context, infos, authuser=None, version="long", @@ -117,7 +116,6 @@ class BulletinGenerator(object): if not version in scu.BULLETINS_VERSIONS: raise ValueError("invalid version code !") - self.context = context self.infos = infos self.authuser = authuser # nécessaire pour version HTML qui contient liens dépendant de l'utilisateur self.version = version @@ -259,7 +257,6 @@ class BulletinGenerator(object): # --------------------------------------------------------------------------- def make_formsemestre_bulletinetud( - context, infos, version="long", # short, long, selectedevals format="pdf", # html, pdf @@ -289,7 +286,6 @@ def make_formsemestre_bulletinetud( try: PDFLOCK.acquire() bul_generator = gen_class( - context, infos, authuser=REQUEST.AUTHENTICATED_USER, version=version, @@ -305,7 +301,6 @@ def make_formsemestre_bulletinetud( bul_class_name = bulletin_default_class_name() gen_class = bulletin_get_class(bul_class_name) bul_generator = gen_class( - context, infos, authuser=REQUEST.AUTHENTICATED_USER, version=version, diff --git a/app/scodoc/sco_bulletins_json.py b/app/scodoc/sco_bulletins_json.py index cc6ef7830..b209abd03 100644 --- a/app/scodoc/sco_bulletins_json.py +++ b/app/scodoc/sco_bulletins_json.py @@ -47,7 +47,6 @@ from app.scodoc import sco_etud def make_json_formsemestre_bulletinetud( - context, formsemestre_id, etudid, REQUEST=None, @@ -58,7 +57,6 @@ def make_json_formsemestre_bulletinetud( """Renvoie bulletin en chaine JSON""" d = formsemestre_bulletinetud_published_dict( - context, formsemestre_id, etudid, force_publishing=force_publishing, @@ -77,7 +75,6 @@ def make_json_formsemestre_bulletinetud( # pour simplifier le code, mais attention a la maintenance !) # def formsemestre_bulletinetud_published_dict( - context, formsemestre_id, etudid, force_publishing=False, @@ -129,9 +126,7 @@ def formsemestre_bulletinetud_published_dict( nom=scu.quote_xml_attr(etudinfo["nom"]), prenom=scu.quote_xml_attr(etudinfo["prenom"]), civilite=scu.quote_xml_attr(etudinfo["civilite_str"]), - photo_url=scu.quote_xml_attr( - sco_photos.etud_photo_url(context, etudinfo, fast=True) - ), + photo_url=scu.quote_xml_attr(sco_photos.etud_photo_url(etudinfo, fast=True)), email=scu.quote_xml_attr(etudinfo["email"]), emailperso=scu.quote_xml_attr(etudinfo["emailperso"]), ) @@ -164,7 +159,7 @@ def formsemestre_bulletinetud_published_dict( else: rang = str(nt.get_etud_rang(etudid)) rang_gr, ninscrits_gr, gr_name = sco_bulletins.get_etud_rangs_groups( - context, etudid, formsemestre_id, partitions, partitions_etud_groups, nt + etudid, formsemestre_id, partitions, partitions_etud_groups, nt ) d["note"] = dict( @@ -341,7 +336,6 @@ def formsemestre_bulletinetud_published_dict( or xml_with_decisions ): infos, dpv = sco_bulletins.etud_descr_situation_semestre( - context, etudid, formsemestre_id, format="xml", diff --git a/app/scodoc/sco_bulletins_legacy.py b/app/scodoc/sco_bulletins_legacy.py index 7a82034a4..2efa86bf1 100644 --- a/app/scodoc/sco_bulletins_legacy.py +++ b/app/scodoc/sco_bulletins_legacy.py @@ -56,7 +56,7 @@ class BulletinGeneratorLegacy(sco_bulletins_generator.BulletinGenerator): Renvoie une liste d'objets platypus """ objects = sco_bulletins_pdf.process_field( - self.context, self.preferences["bul_pdf_title"], self.infos, self.FieldStyle + self.preferences["bul_pdf_title"], self.infos, self.FieldStyle ) objects.append( Spacer(1, 5 * mm) @@ -77,7 +77,7 @@ class BulletinGeneratorLegacy(sco_bulletins_generator.BulletinGenerator): Renvoie une liste d'objets PLATYPUS (eg instance de Table). """ P, pdfTableStyle, colWidths = _bulletin_pdf_table_legacy( - self.context, self.infos, version=self.version + self.infos, version=self.version ) return [self.buildTableObject(P, pdfTableStyle, colWidths)] @@ -85,7 +85,6 @@ class BulletinGeneratorLegacy(sco_bulletins_generator.BulletinGenerator): """Génère la table centrale du bulletin de notes: chaine HTML""" I = self.infos formsemestre_id = self.infos["formsemestre_id"] - context = self.context bul_show_abs_modules = sco_preferences.get_preference( "bul_show_abs_modules", formsemestre_id @@ -285,7 +284,6 @@ class BulletinGeneratorLegacy(sco_bulletins_generator.BulletinGenerator): # ----- DECISION JURY if self.preferences["bul_show_decision"]: objects += sco_bulletins_pdf.process_field( - self.context, self.preferences["bul_pdf_caption"], self.infos, self.FieldStyle, @@ -354,7 +352,6 @@ class BulletinGeneratorLegacy(sco_bulletins_generator.BulletinGenerator): L = [ [ sco_bulletins_pdf.process_field( - self.context, self.preferences["bul_pdf_sig_left"], self.infos, self.FieldStyle, @@ -366,7 +363,6 @@ class BulletinGeneratorLegacy(sco_bulletins_generator.BulletinGenerator): if show_right: L[0].append( sco_bulletins_pdf.process_field( - self.context, self.preferences["bul_pdf_sig_right"], self.infos, self.FieldStyle, @@ -435,7 +431,7 @@ class BulTableStyle(object): self.pdfTableStyle.append(("LINEABOVE", (0, i), (-1, i), 1, self.MODSEPCOLOR)) -def _bulletin_pdf_table_legacy(context, I, version="long"): +def _bulletin_pdf_table_legacy(I, version="long"): """Génère la table centrale du bulletin de notes Renvoie un triplet: - table (liste de listes de chaines de caracteres) diff --git a/app/scodoc/sco_bulletins_pdf.py b/app/scodoc/sco_bulletins_pdf.py index 1c28032b1..9892850ed 100644 --- a/app/scodoc/sco_bulletins_pdf.py +++ b/app/scodoc/sco_bulletins_pdf.py @@ -76,7 +76,6 @@ def pdfassemblebulletins( pagesbookmarks, filigranne=None, server_name="", - context=None, ): "generate PDF document from a list of PLATYPUS objects" if not objects: @@ -109,9 +108,7 @@ def pdfassemblebulletins( return data -def process_field( - context, field, cdict, style, suppress_empty_pars=False, format="pdf" -): +def process_field(field, cdict, style, suppress_empty_pars=False, format="pdf"): """Process a field given in preferences, returns - if format = 'pdf': a list of Platypus objects - if format = 'html' : a string @@ -165,9 +162,7 @@ def process_field( return sco_pdf.makeParas(text, style, suppress_empty=suppress_empty_pars) -def get_formsemestre_bulletins_pdf( - context, formsemestre_id, REQUEST, version="selectedevals" -): +def get_formsemestre_bulletins_pdf(formsemestre_id, REQUEST, version="selectedevals"): "document pdf et filename" from app.scodoc import sco_bulletins @@ -183,7 +178,6 @@ def get_formsemestre_bulletins_pdf( i = 1 for etudid in nt.get_etudids(): frag, filigranne = sco_bulletins.do_formsemestre_bulletinetud( - context, formsemestre_id, etudid, format="pdfpart", @@ -210,7 +204,6 @@ def get_formsemestre_bulletins_pdf( bookmarks, filigranne=filigrannes, server_name=server_name, - context=context, ) finally: sco_pdf.PDFLOCK.release() @@ -225,7 +218,7 @@ def get_formsemestre_bulletins_pdf( return pdfdoc, filename -def get_etud_bulletins_pdf(context, etudid, REQUEST, version="selectedevals"): +def get_etud_bulletins_pdf(etudid, REQUEST, version="selectedevals"): "Bulletins pdf de tous les semestres de l'étudiant, et filename" from app.scodoc import sco_bulletins @@ -236,7 +229,6 @@ def get_etud_bulletins_pdf(context, etudid, REQUEST, version="selectedevals"): i = 1 for sem in etud["sems"]: frag, filigranne = sco_bulletins.do_formsemestre_bulletinetud( - context, sem["formsemestre_id"], etudid, format="pdfpart", @@ -262,7 +254,6 @@ def get_etud_bulletins_pdf(context, etudid, REQUEST, version="selectedevals"): bookmarks, filigranne=filigrannes, server_name=server_name, - context=context, ) finally: sco_pdf.PDFLOCK.release() diff --git a/app/scodoc/sco_bulletins_signature.py b/app/scodoc/sco_bulletins_signature.py index 4e888a7b4..120cbbf8a 100644 --- a/app/scodoc/sco_bulletins_signature.py +++ b/app/scodoc/sco_bulletins_signature.py @@ -56,10 +56,10 @@ et sur page "réglages bulletin" (avec formsemestre_id) # import os -# def form_change_bul_sig(context, side, formsemestre_id=None, REQUEST=None): +# def form_change_bul_sig(side, formsemestre_id=None, REQUEST=None): # """Change pdf signature""" # filename = _get_sig_existing_filename( -# context, side, formsemestre_id=formsemestre_id +# side, formsemestre_id=formsemestre_id # ) # if side == "left": # sidetxt = "gauche" @@ -77,12 +77,12 @@ et sur page "réglages bulletin" (avec formsemestre_id) # "

Photo actuelle (%(signatureloc)s): " -# def get_bul_sig_img(context, side, formsemestre_id=None): +# def get_bul_sig_img(side, formsemestre_id=None): # "send back signature image data" # # slow, not cached, used for unfrequent access (do not bypass python) -# def _sig_filename(context, side, formsemestre_id=None): +# def _sig_filename(side, formsemestre_id=None): # if not side in ("left", "right"): # raise ValueError("side must be left or right") # dirs = [SCODOC_LOGOS_DIR, scu.get_dept_id()] @@ -92,13 +92,13 @@ et sur page "réglages bulletin" (avec formsemestre_id) # return os.path.join(*dirs) -# def _get_sig_existing_filename(context, side, formsemestre_id=None): +# def _get_sig_existing_filename(side, formsemestre_id=None): # "full path to signature to use, or None if no signature available" # if formsemestre_id: -# filename = _sig_filename(context, side, formsemestre_id=formsemestre_id) +# filename = _sig_filename(side, formsemestre_id=formsemestre_id) # if os.path.exists(filename): # return filename -# filename = _sig_filename(context, side) +# filename = _sig_filename(side) # if os.path.exists(filename): # return filename # else: diff --git a/app/scodoc/sco_bulletins_standard.py b/app/scodoc/sco_bulletins_standard.py index e17584461..3397139f2 100644 --- a/app/scodoc/sco_bulletins_standard.py +++ b/app/scodoc/sco_bulletins_standard.py @@ -76,7 +76,7 @@ class BulletinGeneratorStandard(sco_bulletins_generator.BulletinGenerator): Renvoie une liste d'objets platypus """ objects = sco_bulletins_pdf.process_field( - self.context, self.preferences["bul_pdf_title"], self.infos, self.FieldStyle + self.preferences["bul_pdf_title"], self.infos, self.FieldStyle ) objects.append( Spacer(1, 5 * mm) @@ -179,14 +179,12 @@ class BulletinGeneratorStandard(sco_bulletins_generator.BulletinGenerator): # ----- DECISION JURY if self.preferences["bul_show_decision"]: Op += sco_bulletins_pdf.process_field( - self.context, self.preferences["bul_pdf_caption"], self.infos, self.FieldStyle, format="pdf", ) field = sco_bulletins_pdf.process_field( - self.context, self.preferences["bul_pdf_caption"], self.infos, self.FieldStyle, @@ -211,7 +209,6 @@ class BulletinGeneratorStandard(sco_bulletins_generator.BulletinGenerator): L = [ [ sco_bulletins_pdf.process_field( - self.context, self.preferences["bul_pdf_sig_left"], self.infos, self.FieldStyle, @@ -223,7 +220,6 @@ class BulletinGeneratorStandard(sco_bulletins_generator.BulletinGenerator): if show_right: L[0].append( sco_bulletins_pdf.process_field( - self.context, self.preferences["bul_pdf_sig_right"], self.infos, self.FieldStyle, @@ -275,7 +271,6 @@ class BulletinGeneratorStandard(sco_bulletins_generator.BulletinGenerator): - largeurs de colonnes pour PDF """ I = self.infos - context = self.context P = [] # elems pour générer table avec gen_table (liste de dicts) formsemestre_id = I["formsemestre_id"] prefs = sco_preferences.SemPreferences(formsemestre_id) diff --git a/app/scodoc/sco_bulletins_ucac.py b/app/scodoc/sco_bulletins_ucac.py index 17ccf269d..088bc0962 100644 --- a/app/scodoc/sco_bulletins_ucac.py +++ b/app/scodoc/sco_bulletins_ucac.py @@ -70,7 +70,6 @@ class BulletinGeneratorUCAC(sco_bulletins_standard.BulletinGeneratorStandard): - largeurs de colonnes pour PDF """ I = self.infos - context = self.context formsemestre_id = I["formsemestre_id"] prefs = sco_preferences.SemPreferences(formsemestre_id) @@ -304,5 +303,5 @@ class BulletinGeneratorUCAC(sco_bulletins_standard.BulletinGeneratorStandard): sco_bulletins_generator.register_bulletin_class(BulletinGeneratorUCAC) -def bulletin_table_ucac(context, I, version=None): +def bulletin_table_ucac(I, version=None): """""" diff --git a/app/scodoc/sco_bulletins_xml.py b/app/scodoc/sco_bulletins_xml.py index 62fe78988..49db50805 100644 --- a/app/scodoc/sco_bulletins_xml.py +++ b/app/scodoc/sco_bulletins_xml.py @@ -64,7 +64,6 @@ from app.scodoc import sco_xml # pour simplifier le code, mais attention a la maintenance !) # def make_xml_formsemestre_bulletinetud( - context, formsemestre_id, etudid, doc=None, # XML document @@ -123,7 +122,7 @@ def make_xml_formsemestre_bulletinetud( prenom=scu.quote_xml_attr(etudinfo["prenom"]), civilite=scu.quote_xml_attr(etudinfo["civilite_str"]), sexe=scu.quote_xml_attr(etudinfo["civilite_str"]), # compat - photo_url=scu.quote_xml_attr(sco_photos.etud_photo_url(context, etudinfo)), + photo_url=scu.quote_xml_attr(sco_photos.etud_photo_url(etudinfo)), email=scu.quote_xml_attr(etudinfo["email"]), emailperso=scu.quote_xml_attr(etudinfo["emailperso"]), ) @@ -157,7 +156,7 @@ def make_xml_formsemestre_bulletinetud( else: rang = str(nt.get_etud_rang(etudid)) rang_gr, ninscrits_gr, gr_name = sco_bulletins.get_etud_rangs_groups( - context, etudid, formsemestre_id, partitions, partitions_etud_groups, nt + etudid, formsemestre_id, partitions, partitions_etud_groups, nt ) doc.append( @@ -351,7 +350,6 @@ def make_xml_formsemestre_bulletinetud( or xml_with_decisions ): infos, dpv = sco_bulletins.etud_descr_situation_semestre( - context, etudid, formsemestre_id, format="xml", diff --git a/app/scodoc/sco_cache.py b/app/scodoc/sco_cache.py index 9d727c923..065f51a10 100644 --- a/app/scodoc/sco_cache.py +++ b/app/scodoc/sco_cache.py @@ -37,7 +37,7 @@ # sco_cache.NotesTableCache.get( formsemestre_id) # => sco_cache.NotesTableCache.get(formsemestre_id) # -# sco_core.inval_cache(context, formsemestre_id=None, pdfonly=False, formsemestre_id_list=None) +# sco_core.inval_cache(formsemestre_id=None, pdfonly=False, formsemestre_id_list=None) # => deprecated, NotesTableCache.invalidate_formsemestre(formsemestre_id=None, pdfonly=False) # # @@ -231,8 +231,7 @@ class NotesTableCache(ScoDocCache): from app.scodoc import notes_table t0 = time.time() - context = None # XXX TO REMOVE #context - nt = notes_table.NotesTable(context, formsemestre_id) + nt = notes_table.NotesTable(formsemestre_id) dt = time.time() - t0 log("caching formsemestre_id=%s (%gs)" % (formsemestre_id, dt)) _ = cls.set(formsemestre_id, nt) @@ -240,7 +239,7 @@ class NotesTableCache(ScoDocCache): return nt -def invalidate_formsemestre( # was inval_cache( context, formsemestre_id=None, pdfonly=False) +def invalidate_formsemestre( # was inval_cache(formsemestre_id=None, pdfonly=False) formsemestre_id=None, pdfonly=False ): """expire cache pour un semestre (ou tous si formsemestre_id non spécifié). diff --git a/app/scodoc/sco_compute_moy.py b/app/scodoc/sco_compute_moy.py index f4615301b..4a7eda4ec 100644 --- a/app/scodoc/sco_compute_moy.py +++ b/app/scodoc/sco_compute_moy.py @@ -52,7 +52,7 @@ from app.scodoc import sco_moduleimpl from app.scodoc import sco_etud -def moduleimpl_has_expression(context, mod): +def moduleimpl_has_expression(mod): "True if we should use a user-defined expression" expr = mod["computation_expr"] if not expr: @@ -63,7 +63,7 @@ def moduleimpl_has_expression(context, mod): return True -def formsemestre_expressions_use_abscounts(context, formsemestre_id): +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. """ @@ -80,7 +80,7 @@ def formsemestre_expressions_use_abscounts(context, formsemestre_id): return True # 2- moyennes de modules for mod in sco_moduleimpl.do_moduleimpl_list(formsemestre_id=formsemestre_id): - if moduleimpl_has_expression(context, mod) and ab in mod["computation_expr"]: + if moduleimpl_has_expression(mod) and ab in mod["computation_expr"]: return True return False @@ -120,7 +120,6 @@ def get_ue_expression(formsemestre_id, ue_id, cnx, html_quote=False): def compute_user_formula( - context, sem, etudid, moy, @@ -184,7 +183,7 @@ def compute_user_formula( return user_moy -def do_moduleimpl_moyennes(context, nt, mod): +def do_moduleimpl_moyennes(nt, mod): """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). @@ -219,7 +218,7 @@ def do_moduleimpl_moyennes(context, nt, mod): key=lambda x: (x["numero"], x["jour"], x["heure_debut"]) ) # la plus ancienne en tête - user_expr = moduleimpl_has_expression(context, mod) + user_expr = moduleimpl_has_expression(mod) attente = False # recupere les notes de toutes les evaluations eval_rattr = None @@ -330,7 +329,6 @@ def do_moduleimpl_moyennes(context, nt, mod): coefs_mask.append(0) if nb_notes > 0 or formula_use_abs: user_moy = compute_user_formula( - context, sem, etudid, R[etudid], @@ -367,7 +365,7 @@ def do_moduleimpl_moyennes(context, nt, mod): return R, valid_evals, attente, diag_info -def do_formsemestre_moyennes(context, nt, formsemestre_id): +def do_formsemestre_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. @@ -392,7 +390,7 @@ def do_formsemestre_moyennes(context, nt, formsemestre_id): moduleimpl_id = modimpl["moduleimpl_id"] assert moduleimpl_id not in D D[moduleimpl_id], valid_evals_mod, attente, expr_diag = do_moduleimpl_moyennes( - context, nt, modimpl + nt, modimpl ) valid_evals_per_mod[moduleimpl_id] = valid_evals_mod valid_evals += valid_evals_mod diff --git a/app/scodoc/sco_cost_formation.py b/app/scodoc/sco_cost_formation.py index 2b2dbc101..a2e532a2c 100644 --- a/app/scodoc/sco_cost_formation.py +++ b/app/scodoc/sco_cost_formation.py @@ -40,7 +40,6 @@ from app.scodoc import sco_preferences def formsemestre_table_estim_cost( - context, formsemestre_id, n_group_td=1, n_group_tp=1, @@ -149,7 +148,6 @@ def formsemestre_table_estim_cost( def formsemestre_estim_cost( - context, formsemestre_id, n_group_td=1, n_group_tp=1, @@ -166,7 +164,6 @@ def formsemestre_estim_cost( coef_cours = float(coef_cours) tab = formsemestre_table_estim_cost( - context, formsemestre_id, n_group_td=n_group_td, n_group_tp=n_group_tp, diff --git a/app/scodoc/sco_debouche.py b/app/scodoc/sco_debouche.py index c7c835cc0..274a8da9d 100644 --- a/app/scodoc/sco_debouche.py +++ b/app/scodoc/sco_debouche.py @@ -47,17 +47,17 @@ from app.scodoc import sco_tag_module from app.scodoc import sco_etud -def report_debouche_date(context, start_year=None, format="html", REQUEST=None): +def report_debouche_date(start_year=None, format="html", REQUEST=None): """Rapport (table) pour les débouchés des étudiants sortis à partir de l'année indiquée.""" if not start_year: - return report_debouche_ask_date(context, REQUEST=REQUEST) + return report_debouche_ask_date(REQUEST=REQUEST) if format == "xls": keep_numeric = True # pas de conversion des notes en strings else: keep_numeric = False - etudids = get_etudids_with_debouche(context, start_year) - tab = table_debouche_etudids(context, etudids, keep_numeric=keep_numeric) + etudids = get_etudids_with_debouche(start_year) + tab = table_debouche_etudids(etudids, keep_numeric=keep_numeric) tab.filename = scu.make_filename("debouche_scodoc_%s" % start_year) tab.origin = "Généré par %s le " % VERSION.SCONAME + scu.timedate_human_repr() + "" @@ -73,7 +73,7 @@ def report_debouche_date(context, start_year=None, format="html", REQUEST=None): ) -def get_etudids_with_debouche(context, start_year): +def get_etudids_with_debouche(start_year): """Liste des etudids de tous les semestres terminant à partir du 1er janvier de start_year et ayant un 'debouche' renseigné. @@ -102,7 +102,7 @@ def get_etudids_with_debouche(context, start_year): return [x["etudid"] for x in r] -def table_debouche_etudids(context, etudids, keep_numeric=True): +def table_debouche_etudids(etudids, keep_numeric=True): """Rapport pour ces etudiants""" L = [] for etudid in etudids: @@ -139,7 +139,7 @@ def table_debouche_etudids(context, etudids, keep_numeric=True): } # recherche des débouchés - debouche = itemsuivi_list_etud(context, etudid) # liste de plusieurs items + debouche = itemsuivi_list_etud(etudid) # liste de plusieurs items if debouche: row["debouche"] = "
".join( [ @@ -192,7 +192,7 @@ def table_debouche_etudids(context, etudids, keep_numeric=True): return tab -def report_debouche_ask_date(context, REQUEST=None): +def report_debouche_ask_date(REQUEST=None): """Formulaire demande date départ""" return ( html_sco_header.sco_header() @@ -247,7 +247,7 @@ def itemsuivi_get(cnx, itemsuivi_id, ignore_errors=False): return None -def itemsuivi_suppress(context, itemsuivi_id, REQUEST=None): +def itemsuivi_suppress(itemsuivi_id, REQUEST=None): """Suppression d'un item""" if not sco_permissions_check.can_edit_suivi(): raise AccessDenied("Vous n'avez pas le droit d'effectuer cette opération !") @@ -259,9 +259,7 @@ def itemsuivi_suppress(context, itemsuivi_id, REQUEST=None): log("suppressed itemsuivi %s" % (itemsuivi_id,)) -def itemsuivi_create( - context, etudid, item_date=None, situation="", REQUEST=None, format=None -): +def itemsuivi_create(etudid, item_date=None, situation="", REQUEST=None, format=None): """Creation d'un item""" if not sco_permissions_check.can_edit_suivi(): raise AccessDenied("Vous n'avez pas le droit d'effectuer cette opération !") @@ -277,7 +275,7 @@ def itemsuivi_create( return item -def itemsuivi_set_date(context, itemsuivi_id, item_date, REQUEST=None): +def itemsuivi_set_date(itemsuivi_id, item_date, REQUEST=None): """set item date item_date is a string dd/mm/yyyy """ @@ -290,7 +288,7 @@ def itemsuivi_set_date(context, itemsuivi_id, item_date, REQUEST=None): _itemsuivi_edit(cnx, item) -def itemsuivi_set_situation(context, object, value, REQUEST=None): +def itemsuivi_set_situation(object, value, REQUEST=None): """set situation""" if not sco_permissions_check.can_edit_suivi(): raise AccessDenied("Vous n'avez pas le droit d'effectuer cette opération !") @@ -304,18 +302,18 @@ def itemsuivi_set_situation(context, object, value, REQUEST=None): return situation or scu.IT_SITUATION_MISSING_STR -def itemsuivi_list_etud(context, etudid, format=None, REQUEST=None): +def itemsuivi_list_etud(etudid, format=None, REQUEST=None): """Liste des items pour cet étudiant, avec tags""" cnx = ndb.GetDBConnexion() items = _itemsuivi_list(cnx, {"etudid": etudid}) for it in items: - it["tags"] = ", ".join(itemsuivi_tag_list(context, it["itemsuivi_id"])) + it["tags"] = ", ".join(itemsuivi_tag_list(it["itemsuivi_id"])) if format == "json": return scu.sendJSON(REQUEST, items) return items -def itemsuivi_tag_list(context, itemsuivi_id): +def itemsuivi_tag_list(itemsuivi_id): """les noms de tags associés à cet item""" r = ndb.SimpleDictFetch( """SELECT t.title @@ -328,7 +326,7 @@ def itemsuivi_tag_list(context, itemsuivi_id): return [x["title"] for x in r] -def itemsuivi_tag_search(context, term, REQUEST=None): +def itemsuivi_tag_search(term, REQUEST=None): """List all used tag names (for auto-completion)""" # restrict charset to avoid injections if not scu.ALPHANUM_EXP.match(term): @@ -343,7 +341,7 @@ def itemsuivi_tag_search(context, term, REQUEST=None): return scu.sendJSON(REQUEST, data) -def itemsuivi_tag_set(context, itemsuivi_id="", taglist=[], REQUEST=None): +def itemsuivi_tag_set(itemsuivi_id="", taglist=[], REQUEST=None): """taglist may either be: a string with tag names separated by commas ("un;deux") or a list of strings (["un", "deux"]) @@ -361,14 +359,14 @@ def itemsuivi_tag_set(context, itemsuivi_id="", taglist=[], REQUEST=None): _ = itemsuivi_get(cnx, itemsuivi_id) newtags = set(taglist) - oldtags = set(itemsuivi_tag_list(context, itemsuivi_id)) + oldtags = set(itemsuivi_tag_list(itemsuivi_id)) to_del = oldtags - newtags to_add = newtags - oldtags # should be atomic, but it's not. for tagname in to_add: - t = ItemSuiviTag(context, tagname, object_id=itemsuivi_id) + t = ItemSuiviTag(tagname, object_id=itemsuivi_id) for tagname in to_del: - t = ItemSuiviTag(context, tagname) + t = ItemSuiviTag(tagname) t.remove_tag_from_object(itemsuivi_id) return "", http.HTTPStatus.NO_CONTENT diff --git a/app/scodoc/sco_dept.py b/app/scodoc/sco_dept.py index bd02d5097..1dbd9df01 100644 --- a/app/scodoc/sco_dept.py +++ b/app/scodoc/sco_dept.py @@ -45,16 +45,16 @@ from app.scodoc import sco_up_to_date from app.scodoc import sco_users -def index_html(context, REQUEST=None, showcodes=0, showsemtable=0): +def index_html(REQUEST=None, showcodes=0, showsemtable=0): "Page accueil département (liste des semestres)" showsemtable = int(showsemtable) H = [] # News: - H.append(sco_news.scolar_news_summary_html(context)) + H.append(sco_news.scolar_news_summary_html()) # Avertissement de mise à jour: - H.append(sco_up_to_date.html_up_to_date_box(context)) + H.append(sco_up_to_date.html_up_to_date_box()) # Liste de toutes les sessions: sems = sco_formsemestre.do_formsemestre_list() @@ -105,7 +105,7 @@ def index_html(context, REQUEST=None, showcodes=0, showsemtable=0): # Liste des formsemestres "courants" if cursems: H.append('

Sessions en cours

') - H.append(_sem_table(context, cursems)) + H.append(_sem_table(cursems)) else: # aucun semestre courant: affiche aide H.append( @@ -125,7 +125,7 @@ def index_html(context, REQUEST=None, showcodes=0, showsemtable=0): """ % sco_preferences.get_preference("DeptName") ) - H.append(_sem_table_gt(context, sems).html()) + H.append(_sem_table_gt(sems).html()) H.append("
") if not showsemtable: H.append( @@ -178,7 +178,7 @@ Chercher étape courante: %(tmpcode)s %(lockimg)s %(groupicon)s @@ -190,7 +190,7 @@ def _sem_table(context, sems): """ # Liste des semestres, groupés par modalités - sems_by_mod, modalites = sco_modalites.group_sems_by_modalite(context, sems) + sems_by_mod, modalites = sco_modalites.group_sems_by_modalite(sems) H = [''] for modalite in modalites: @@ -211,9 +211,9 @@ def _sem_table(context, sems): return "\n".join(H) -def _sem_table_gt(context, sems, showcodes=False): +def _sem_table_gt(sems, showcodes=False): """Nouvelle version de la table des semestres""" - _style_sems(context, sems) + _style_sems(sems) columns_ids = ( "lockimg", "semestre_id_n", @@ -249,7 +249,7 @@ def _sem_table_gt(context, sems, showcodes=False): return tab -def _style_sems(context, sems): +def _style_sems(sems): """ajoute quelques attributs de présentation pour la table""" for sem in sems: sem["notes_url"] = scu.NotesURL() diff --git a/app/scodoc/sco_dump_db.py b/app/scodoc/sco_dump_db.py index 4f793d5fa..e9231f466 100644 --- a/app/scodoc/sco_dump_db.py +++ b/app/scodoc/sco_dump_db.py @@ -64,7 +64,7 @@ from app.scodoc.sco_exceptions import ScoValueError SCO_DUMP_LOCK = "/tmp/scodump.lock" -def sco_dump_and_send_db(context, REQUEST=None): +def sco_dump_and_send_db(REQUEST=None): """Dump base de données et l'envoie anonymisée pour debug""" H = [html_sco_header.sco_header(page_title="Assistance technique")] # get currect (dept) DB name: @@ -93,7 +93,7 @@ def sco_dump_and_send_db(context, REQUEST=None): _anonymize_db(ano_db_name) # Send - r = _send_db(context, REQUEST, ano_db_name) + r = _send_db(REQUEST, ano_db_name) if ( r.status_code == requests.codes.INSUFFICIENT_STORAGE # pylint: disable=no-member @@ -164,14 +164,14 @@ def _anonymize_db(ano_db_name): ) -def _get_scodoc_serial(context): +def _get_scodoc_serial(): try: return int(open(os.path.join(scu.SCODOC_VERSION_DIR, "scodoc.sn")).read()) except: return 0 -def _send_db(context, REQUEST, ano_db_name): +def _send_db(REQUEST, ano_db_name): """Dump this (anonymized) database and send it to tech support""" log("dumping anonymized database {}".format(ano_db_name)) try: @@ -189,7 +189,7 @@ def _send_db(context, REQUEST, ano_db_name): files=files, data={ "dept_name": sco_preferences.get_preference("DeptName"), - "serial": _get_scodoc_serial(context), + "serial": _get_scodoc_serial(), "sco_user": str(REQUEST.AUTHENTICATED_USER), "sent_by": sco_users.user_info(str(REQUEST.AUTHENTICATED_USER))[ "nomcomplet" diff --git a/app/scodoc/sco_edit_module.py b/app/scodoc/sco_edit_module.py index f6fa00f82..e04d358fa 100644 --- a/app/scodoc/sco_edit_module.py +++ b/app/scodoc/sco_edit_module.py @@ -207,7 +207,7 @@ def module_create(matiere_id=None, REQUEST=None): { "input_type": "menu", "type": "int", - "title": scu.strcapitalize(parcours.SESSION_NAME), + "title": parcours.SESSION_NAME.capitalize(), "explanation": "%s de début du module dans la formation standard" % parcours.SESSION_NAME, "labels": [str(x) for x in semestres_indices], diff --git a/app/scodoc/sco_edit_ue.py b/app/scodoc/sco_edit_ue.py index 9d82919a3..7e8f01ae3 100644 --- a/app/scodoc/sco_edit_ue.py +++ b/app/scodoc/sco_edit_ue.py @@ -305,7 +305,7 @@ def ue_edit(ue_id=None, create=False, formation_id=None, REQUEST=None): { "input_type": "menu", "type": "int", - "title": scu.strcapitalize(parcours.SESSION_NAME), + "title": parcours.SESSION_NAME.capitalize(), "explanation": "%s de début du module dans la formation" % parcours.SESSION_NAME, "labels": [str(x) for x in semestres_indices], diff --git a/app/scodoc/sco_edt_cal.py b/app/scodoc/sco_edt_cal.py index 93634f595..3f28bec7d 100644 --- a/app/scodoc/sco_edt_cal.py +++ b/app/scodoc/sco_edt_cal.py @@ -47,7 +47,7 @@ from app.scodoc import sco_groups_view from app.scodoc import sco_preferences -def formsemestre_get_ics_url(context, sem): +def formsemestre_get_ics_url(sem): """ edt_sem_ics_url est un template utilisé avec .format(sem=sem) @@ -72,10 +72,10 @@ def formsemestre_get_ics_url(context, sem): return ics_url -def formsemestre_load_ics(context, sem): +def formsemestre_load_ics(sem): """Load ics data, from our cache or, when necessary, from external provider""" # TODO: cacher le résultat - ics_url = formsemestre_get_ics_url(context, sem) + ics_url = formsemestre_get_ics_url(sem) if not ics_url: ics_data = "" else: @@ -90,13 +90,13 @@ def formsemestre_load_ics(context, sem): return cal -# def formsemestre_edt_groups_used(context, sem): +# def formsemestre_edt_groups_used(sem): # """L'ensemble des groupes EDT utilisés dans l'emploi du temps publié""" -# cal = formsemestre_load_ics(context, sem) +# cal = formsemestre_load_ics(sem) # return {e["X-GROUP-ID"].decode("utf8") for e in events} -def get_edt_transcodage_groups(context, formsemestre_id): +def get_edt_transcodage_groups(formsemestre_id): """-> { nom_groupe_edt : nom_groupe_scodoc }""" # TODO: valider ces données au moment où on enregistre les préférences edt2sco = {} @@ -123,7 +123,7 @@ def get_edt_transcodage_groups(context, formsemestre_id): return edt2sco, sco2edt, msg -def group_edt_json(context, group_id, start="", end="", REQUEST=None): +def group_edt_json(group_id, start="", end="", REQUEST=None): # actuellement inutilisé """EDT complet du semestre, au format JSON TODO: indiquer un groupe TODO: utiliser start et end (2 dates au format ISO YYYY-MM-DD) @@ -131,14 +131,12 @@ def group_edt_json(context, group_id, start="", end="", REQUEST=None): """ group = sco_groups.get_group(group_id) sem = sco_formsemestre.get_formsemestre(group["formsemestre_id"]) - edt2sco, sco2edt, msg = get_edt_transcodage_groups( - context, group["formsemestre_id"] - ) + edt2sco, sco2edt, msg = get_edt_transcodage_groups(group["formsemestre_id"]) edt_group_name = sco2edt.get(group["group_name"], group["group_name"]) log("group scodoc=%s : edt=%s" % (group["group_name"], edt_group_name)) - cal = formsemestre_load_ics(context, sem) + cal = formsemestre_load_ics(sem) events = [e for e in cal.walk() if e.name == "VEVENT"] J = [] for e in events: @@ -161,7 +159,9 @@ for e in events: """ -def experimental_calendar(context, group_id=None, formsemestre_id=None, REQUEST=None): +def experimental_calendar( + group_id=None, formsemestre_id=None, REQUEST=None +): # inutilisé """experimental page""" return "\n".join( [ @@ -191,7 +191,7 @@ def experimental_calendar(context, group_id=None, formsemestre_id=None, REQUEST= """Emplois du temps du groupe""", sco_groups_view.menu_group_choice( - context, group_id=group_id, formsemestre_id=formsemestre_id + group_id=group_id, formsemestre_id=formsemestre_id ), """
loading...
diff --git a/app/scodoc/sco_emails.py b/app/scodoc/sco_emails.py index 9ebdf5977..017ffffd4 100644 --- a/app/scodoc/sco_emails.py +++ b/app/scodoc/sco_emails.py @@ -48,11 +48,11 @@ from app.scodoc.notes_log import log from app.scodoc import VERSION -def sendEmail(context, msg): # TODO A REECRIRE ScoDoc8 +def sendEmail(msg): # TODO A REECRIRE ScoDoc8 """Send an email to the address using the mailhost, if there is one.""" raise NotImplementedError() try: - mail_host = context.MailHost + mail_host = xxx.MailHost except: log("warning: sendEmail: no MailHost found !") return @@ -66,7 +66,7 @@ def sendEmail(context, msg): # TODO A REECRIRE ScoDoc8 pass -def sendEmailFromException(context, msg): +def sendEmailFromException(msg): # Send email by hand, as it seems to be not possible to use Zope Mail Host # from an exception handler (see https://bugs.launchpad.net/zope2/+bug/246748) log("sendEmailFromException") @@ -80,13 +80,13 @@ def sendEmailFromException(context, msg): log("an exception occurred sending mail") -def send_debug_alert(context, txt, REQUEST=None): +def send_debug_alert(txt, REQUEST=None): """Send an alert email (bug report) to ScoDoc developpers""" if not scu.SCO_EXC_MAIL: log("send_debug_alert: email disabled") return if REQUEST: - txt = _report_request(context, REQUEST) + txt + txt = _report_request(REQUEST) + txt URL = REQUEST.URL else: URL = "send_debug_alert" @@ -98,11 +98,11 @@ def send_debug_alert(context, txt, REQUEST=None): msg["From"] = "scodoc-alert" msg.epilogue = "" msg.attach(MIMEText(txt, "plain", scu.SCO_ENCODING)) - sendEmailFromException(context, msg) + sendEmailFromException(msg) log("Sent mail alert:\n" + txt) -def _report_request(context, REQUEST, fmt="txt"): +def _report_request(REQUEST, fmt="txt"): """string describing current request for bug reports""" QUERY_STRING = REQUEST.QUERY_STRING if QUERY_STRING: diff --git a/app/scodoc/sco_entreprises.py b/app/scodoc/sco_entreprises.py index a7d4ffdff..7a7762f21 100644 --- a/app/scodoc/sco_entreprises.py +++ b/app/scodoc/sco_entreprises.py @@ -67,7 +67,6 @@ class EntreprisesEditor(EditableTable): test="=", sortkey=None, sort_on_contact=False, - context=None, limit="", offset="", ): @@ -85,7 +84,6 @@ class EntreprisesEditor(EditableTable): if sort_on_contact: for r in R: c = do_entreprise_contact_list( - context, args={"entreprise_id": r["entreprise_id"]}, disable_formatting=True, ) @@ -199,95 +197,94 @@ _entreprise_contactEditor = EditableTable( ) -def do_entreprise_create(context, args): +def do_entreprise_create(args): "entreprise_create" cnx = ndb.GetDBConnexion() r = _entreprisesEditor.create(cnx, args) return r -def do_entreprise_delete(context, oid): +def do_entreprise_delete(oid): "entreprise_delete" cnx = ndb.GetDBConnexion() _entreprisesEditor.delete(cnx, oid) -def do_entreprise_list(context, **kw): +def do_entreprise_list(**kw): "entreprise_list" cnx = ndb.GetDBConnexion() - kw["context"] = context return _entreprisesEditor.list(cnx, **kw) -def do_entreprise_list_by_etud(context, **kw): +def do_entreprise_list_by_etud(**kw): "entreprise_list_by_etud" cnx = ndb.GetDBConnexion() return _entreprisesEditor.list_by_etud(cnx, **kw) -def do_entreprise_edit(context, *args, **kw): +def do_entreprise_edit(*args, **kw): "entreprise_edit" cnx = ndb.GetDBConnexion() _entreprisesEditor.edit(cnx, *args, **kw) -def do_entreprise_correspondant_create(context, args): +def do_entreprise_correspondant_create(args): "entreprise_correspondant_create" cnx = ndb.GetDBConnexion() r = _entreprise_correspEditor.create(cnx, args) return r -def do_entreprise_correspondant_delete(context, oid): +def do_entreprise_correspondant_delete(oid): "entreprise_correspondant_delete" cnx = ndb.GetDBConnexion() _entreprise_correspEditor.delete(cnx, oid) -def do_entreprise_correspondant_list(context, **kw): +def do_entreprise_correspondant_list(**kw): "entreprise_correspondant_list" cnx = ndb.GetDBConnexion() return _entreprise_correspEditor.list(cnx, **kw) -def do_entreprise_correspondant_edit(context, *args, **kw): +def do_entreprise_correspondant_edit(*args, **kw): "entreprise_correspondant_edit" cnx = ndb.GetDBConnexion() _entreprise_correspEditor.edit(cnx, *args, **kw) -def do_entreprise_correspondant_listnames(context, args={}): +def do_entreprise_correspondant_listnames(args={}): "-> liste des noms des correspondants (pour affichage menu)" - C = do_entreprise_correspondant_list(context, args=args) + C = do_entreprise_correspondant_list(args=args) return [(x["prenom"] + " " + x["nom"], str(x["entreprise_corresp_id"])) for x in C] -def do_entreprise_contact_delete(context, oid): +def do_entreprise_contact_delete(oid): "entreprise_contact_delete" cnx = ndb.GetDBConnexion() _entreprise_contactEditor.delete(cnx, oid) -def do_entreprise_contact_list(context, **kw): +def do_entreprise_contact_list(**kw): "entreprise_contact_list" cnx = ndb.GetDBConnexion() return _entreprise_contactEditor.list(cnx, **kw) -def do_entreprise_contact_edit(context, *args, **kw): +def do_entreprise_contact_edit(*args, **kw): "entreprise_contact_edit" cnx = ndb.GetDBConnexion() _entreprise_contactEditor.edit(cnx, *args, **kw) -def do_entreprise_contact_create(context, args): +def do_entreprise_contact_create(args): "entreprise_contact_create" cnx = ndb.GetDBConnexion() r = _entreprise_contactEditor.create(cnx, args) return r -def do_entreprise_check_etudiant(context, etudiant): +def do_entreprise_check_etudiant(etudiant): """Si etudiant est vide, ou un ETUDID valide, ou un nom unique, retourne (1, ETUDID). Sinon, retourne (0, 'message explicatif') @@ -315,8 +312,7 @@ def do_entreprise_check_etudiant(context, etudiant): e = ['") return ( diff --git a/app/scodoc/sco_etape_apogee.py b/app/scodoc/sco_etape_apogee.py index 4959d21fe..1e7a4cdd8 100644 --- a/app/scodoc/sco_etape_apogee.py +++ b/app/scodoc/sco_etape_apogee.py @@ -43,19 +43,19 @@ apo_csv_get() API: - apo_csv_store(context, csv, annee_scolaire, sem_id) + apo_csv_store( annee_scolaire, sem_id) store maq file (archive) - apo_csv_get(context, etape_apo, annee_scolaire, sem_id, vdi_apo=None) + apo_csv_get(etape_apo, annee_scolaire, sem_id, vdi_apo=None) get maq data (read stored file and returns string) if vdi_apo, get maq for this etape/vdi, else returns the first matching etape. - apo_csv_delete(context, etape_apo, annee_scolaire, sem_id) + apo_csv_delete(etape_apo, annee_scolaire, sem_id) - apo_csv_list_stored_etapes(context, annee_scolaire=None, sem_id=None, etapes=None) + apo_csv_list_stored_etapes(annee_scolaire=None, sem_id=None, etapes=None) returns: liste des codes etapes et version vdi stockés (pour l'annee_scolaire et le sem_id indiqués) - apo_csv_semset_check(context, semset) + apo_csv_semset_check(semset) check students in stored maqs vs students in sem Cas à détecter: - etudiants ScoDoc sans code NIP @@ -70,7 +70,7 @@ dups_apo : liste de { 'NIP', 'nom', 'prenom', 'etapes_apo' } etapes_missing_csv : liste des étapes du semestre sans maquette CSV - apo_csv_check_etape(context, semset, set_nips, etape_apo) + apo_csv_check_etape(semset, set_nips, etape_apo) check une etape """ @@ -91,7 +91,7 @@ class ApoCSVArchiver(sco_archives.BaseArchiver): ApoCSVArchive = ApoCSVArchiver() -# def get_sem_apo_archive(context, formsemestre_id): +# def get_sem_apo_archive(formsemestre_id): # """Get, or create if necessary, the archive for apo CSV files""" # archive_id @@ -99,7 +99,7 @@ ApoCSVArchive = ApoCSVArchiver() # return archive_id -def apo_csv_store(context, csv_data, annee_scolaire, sem_id): +def apo_csv_store(csv_data, annee_scolaire, sem_id): """ csv_data: maquette content, as a string, encoding given by APO_INPUT_ENCODING (latin-1, not utf8) annee_scolaire: int (2016) @@ -120,9 +120,7 @@ def apo_csv_store(context, csv_data, annee_scolaire, sem_id): filename = str(apo_data.etape) + ".csv" # will concatenate VDI to etape - if str(apo_data.etape) in apo_csv_list_stored_etapes( - context, annee_scolaire, sem_id=sem_id - ): + if str(apo_data.etape) in apo_csv_list_stored_etapes(annee_scolaire, sem_id=sem_id): raise ScoValueError( "Etape %s déjà stockée pour cette année scolaire !" % apo_data.etape ) @@ -135,14 +133,12 @@ def apo_csv_store(context, csv_data, annee_scolaire, sem_id): return apo_data.etape -def apo_csv_list_stored_archives( - context, annee_scolaire=None, sem_id=None, etapes=None -): +def apo_csv_list_stored_archives(annee_scolaire=None, sem_id=None, etapes=None): """ :return: list of informations about stored CSV [ { } ] """ - oids = ApoCSVArchive.list_oids(context) # [ '2016-1', ... ] + oids = ApoCSVArchive.list_oids() # [ '2016-1', ... ] # filter if annee_scolaire: e = re.compile(str(annee_scolaire) + "-.+") @@ -177,25 +173,25 @@ def apo_csv_list_stored_archives( return infos -def apo_csv_list_stored_etapes(context, annee_scolaire, sem_id=None, etapes=None): +def apo_csv_list_stored_etapes(annee_scolaire, sem_id=None, etapes=None): """ :return: list of stored etapes [ ApoEtapeVDI, ... ] """ infos = apo_csv_list_stored_archives( - context, annee_scolaire=annee_scolaire, sem_id=sem_id, etapes=etapes + annee_scolaire=annee_scolaire, sem_id=sem_id, etapes=etapes ) return [info["etape_apo"] for info in infos] -def apo_csv_delete(context, archive_id): +def apo_csv_delete(archive_id): """Delete archived CSV""" ApoCSVArchive.delete_archive(archive_id) -def apo_csv_get_archive(context, etape_apo, annee_scolaire="", sem_id=""): +def apo_csv_get_archive(etape_apo, annee_scolaire="", sem_id=""): """Get archive""" stored_archives = apo_csv_list_stored_archives( - context, annee_scolaire=annee_scolaire, sem_id=sem_id + annee_scolaire=annee_scolaire, sem_id=sem_id ) for info in stored_archives: if info["etape_apo"] == etape_apo: @@ -203,11 +199,11 @@ def apo_csv_get_archive(context, etape_apo, annee_scolaire="", sem_id=""): return None -def apo_csv_get(context, etape_apo="", annee_scolaire="", sem_id=""): +def apo_csv_get(etape_apo="", annee_scolaire="", sem_id=""): """Get CSV data for given etape_apo :return: CSV, as a data string """ - info = apo_csv_get_archive(context, etape_apo, annee_scolaire, sem_id) + info = apo_csv_get_archive(etape_apo, annee_scolaire, sem_id) if not info: raise ScoValueError( "Etape %s non enregistree (%s, %s)" % (etape_apo, annee_scolaire, sem_id) @@ -220,7 +216,7 @@ def apo_csv_get(context, etape_apo="", annee_scolaire="", sem_id=""): # ------------------------------------------------------------------------ -def apo_get_sem_etapes(context, sem): +def apo_get_sem_etapes(sem): """Etapes de ce semestre: pour l'instant, celles déclarées Dans une future version, on pourrait aussi utiliser les étapes d'inscription des étudiants, recupérées via le portail, @@ -231,12 +227,10 @@ def apo_get_sem_etapes(context, sem): return sem["etapes"] -def apo_csv_check_etape(context, semset, set_nips, etape_apo): +def apo_csv_check_etape(semset, set_nips, etape_apo): """Check etape vs set of sems""" # Etudiants dans la maquette CSV: - csv_data = apo_csv_get( - context, etape_apo, semset["annee_scolaire"], semset["sem_id"] - ) + csv_data = apo_csv_get(etape_apo, semset["annee_scolaire"], semset["sem_id"]) apo_data = sco_apogee_csv.ApoData(csv_data, periode=semset["sem_id"]) apo_nips = {e["nip"] for e in apo_data.etuds} # @@ -245,14 +239,14 @@ def apo_csv_check_etape(context, semset, set_nips, etape_apo): nips_no_sco = apo_nips - set_nips # dans Apogée mais pas dans ScoDoc # Elements Apogee vs ScoDoc - apo_data.setup(context) + apo_data.setup() maq_elems, sem_elems = apo_data.list_elements() return nips_ok, apo_nips, nips_no_apo, nips_no_sco, maq_elems, sem_elems def apo_csv_semset_check( - context, semset, allow_missing_apo=False, allow_missing_csv=False + semset, allow_missing_apo=False, allow_missing_csv=False ): # was apo_csv_check """ check students in stored maqs vs students in semset @@ -266,7 +260,7 @@ def apo_csv_semset_check( """ # Etapes du semestre sans maquette CSV: etapes_apo = apo_csv_list_stored_etapes( - context, semset["annee_scolaire"], semset["sem_id"], etapes=semset.list_etapes() + semset["annee_scolaire"], semset["sem_id"], etapes=semset.list_etapes() ) etapes_missing_csv = [] for e in semset.list_etapes(): @@ -292,7 +286,7 @@ def apo_csv_semset_check( et_nips_no_sco, et_maq_elems, et_sem_elems, - ) = apo_csv_check_etape(context, semset, set_nips, etape_apo) + ) = apo_csv_check_etape(semset, set_nips, etape_apo) nips_ok |= et_nips_ok nips_no_apo -= et_apo_nips nips_no_sco |= et_nips_no_sco @@ -330,19 +324,15 @@ def apo_csv_semset_check( ) -def apo_csv_retreive_etuds_by_nip(context, semset, nips): +def apo_csv_retreive_etuds_by_nip(semset, nips): """ Search info about listed nips in stored CSV :return: list [ { 'etape_apo', 'nip', 'nom', 'prenom' } ] """ apo_etuds_by_nips = {} - etapes_apo = apo_csv_list_stored_etapes( - context, semset["annee_scolaire"], semset["sem_id"] - ) + etapes_apo = apo_csv_list_stored_etapes(semset["annee_scolaire"], semset["sem_id"]) for etape_apo in etapes_apo: - csv_data = apo_csv_get( - context, etape_apo, semset["annee_scolaire"], semset["sem_id"] - ) + csv_data = apo_csv_get(etape_apo, semset["annee_scolaire"], semset["sem_id"]) apo_data = sco_apogee_csv.ApoData(csv_data, periode=semset["sem_id"]) etape_apo = apo_data.etape_apogee for e in apo_data.etuds: @@ -367,7 +357,7 @@ from app.scodoc.sco_etape_apogee import * from app.scodoc.sco_apogee_csv import * from app.scodoc.sco_semset import * -context = go_dept(app, 'RT').Notes +app.set_sco_dept('RT') csv_data = open('/opt/misc/VDTRT_V1RT.TXT').read() annee_scolaire=2015 sem_id=1 @@ -375,15 +365,15 @@ sem_id=1 apo_data = sco_apogee_csv.ApoData(csv_data, periode=sem_id) print apo_data.etape_apogee -apo_data.setup(context) +apo_data.setup() e = apo_data.etuds[0] -e.lookup_scodoc(context, apo_data.etape_formsemestre_ids) -e.associate_sco(context, apo_data) +e.lookup_scodoc( apo_data.etape_formsemestre_ids) +e.associate_sco( apo_data) -print apo_csv_list_stored_archives(context) +print apo_csv_list_stored_archives() -apo_csv_store(context, csv_data, annee_scolaire, sem_id) +apo_csv_store(csv_data, annee_scolaire, sem_id) @@ -392,24 +382,24 @@ groups_infos = sco_groups_view.DisplayedGroupsInfos( [sco_groups.get_default_gro nt = sco_cache.NotesTableCache.get( formsemestre_id) # -s = SemSet(context, 'NSS29902') +s = SemSet('NSS29902') apo_data = sco_apogee_csv.ApoData(open('/opt/scodoc/var/scodoc/archives/apo_csv/RT/2015-2/2016-07-10-11-26-15/V1RT.csv').read(), periode=1) # cas Tiziri K. (inscrite en S1, démission en fin de S1, pas inscrite en S2) # => pas de décision, ce qui est voulu (?) # -apo_data.setup(context) +apo_data.setup() e = [ e for e in apo_data.etuds if e['nom'] == 'XYZ' ][0] -e.lookup_scodoc(context, apo_data.etape_formsemestre_ids) -e.associate_sco(context, apo_data) +e.lookup_scodoc( apo_data.etape_formsemestre_ids) +e.associate_sco(apo_data) self=e col_id='apoL_c0129' # -- from app.scodoc import sco_portal_apogee -context = go_dept(app, 'GEA').Notes +_ = go_dept(app, 'GEA').Notes #csv_data = sco_portal_apogee.get_maquette_apogee(etape='V1GE', annee_scolaire=2015) csv_data = open('/tmp/V1GE.txt').read() apo_data = sco_apogee_csv.ApoData(csv_data, periode=1) @@ -426,7 +416,7 @@ from app.scodoc.sco_etape_apogee import * from app.scodoc.sco_apogee_csv import * from app.scodoc.sco_semset import * -context = go_dept(app, 'RT').Notes +_ = go_dept(app, 'RT').Notes csv_data = open('/opt/misc/V2RT.csv').read() annee_scolaire=2015 sem_id=1 @@ -434,10 +424,10 @@ sem_id=1 apo_data = sco_apogee_csv.ApoData(csv_data, periode=1) print apo_data.etape_apogee -apo_data.setup(context) +apo_data.setup() for e in apo_data.etuds: - e.lookup_scodoc(context, apo_data.etape_formsemestre_ids) - e.associate_sco(context, apo_data) + e.lookup_scodoc( apo_data.etape_formsemestre_ids) + e.associate_sco(apo_data) # ------ # test export jury intermediaire @@ -449,7 +439,7 @@ from app.scodoc.sco_etape_apogee import * from app.scodoc.sco_apogee_csv import * from app.scodoc.sco_semset import * -context = go_dept(app, 'CJ').Notes +_ = go_dept(app, 'CJ').Notes csv_data = open('/opt/scodoc/var/scodoc/archives/apo_csv/CJ/2016-1/2017-03-06-21-46-32/V1CJ.csv').read() annee_scolaire=2016 sem_id=1 @@ -457,10 +447,10 @@ sem_id=1 apo_data = sco_apogee_csv.ApoData(csv_data, periode=1) print apo_data.etape_apogee -apo_data.setup(context) +apo_data.setup() e = [ e for e in apo_data.etuds if e['nom'] == 'XYZ' ][0] # -e.lookup_scodoc(context, apo_data.etape_formsemestre_ids) -e.associate_sco(context, apo_data) +e.lookup_scodoc( apo_data.etape_formsemestre_ids) +e.associate_sco(apo_data) self=e diff --git a/app/scodoc/sco_etape_apogee_view.py b/app/scodoc/sco_etape_apogee_view.py index 52c46aa38..514d262a1 100644 --- a/app/scodoc/sco_etape_apogee_view.py +++ b/app/scodoc/sco_etape_apogee_view.py @@ -54,7 +54,6 @@ from app.scodoc.sco_exceptions import ScoValueError def apo_semset_maq_status( - context, semset_id="", allow_missing_apo=False, allow_missing_decisions=False, @@ -69,7 +68,7 @@ def apo_semset_maq_status( """Page statut / tableau de bord""" if not semset_id: raise ValueError("invalid null semset_id") - semset = sco_semset.SemSet(context, semset_id=semset_id) + semset = sco_semset.SemSet(semset_id=semset_id) semset.fill_formsemestres() # autorise export meme si etudiants Apo manquants: allow_missing_apo = int(allow_missing_apo) @@ -85,7 +84,7 @@ def apo_semset_maq_status( prefs = sco_preferences.SemPreferences() - tab_archives = table_apo_csv_list(context, semset, REQUEST=REQUEST) + tab_archives = table_apo_csv_list(semset, REQUEST=REQUEST) ( ok_for_export, @@ -98,7 +97,7 @@ def apo_semset_maq_status( maq_elems, sem_elems, ) = sco_etape_apogee.apo_csv_semset_check( - context, semset, allow_missing_apo, allow_missing_csv + semset, allow_missing_apo, allow_missing_csv ) if not allow_missing_decisions: @@ -432,20 +431,18 @@ def apo_semset_maq_status( return "\n".join(H) -def table_apo_csv_list(context, semset, REQUEST=None): +def table_apo_csv_list(semset, REQUEST=None): """Table des archives (triée par date d'archivage)""" annee_scolaire = semset["annee_scolaire"] sem_id = semset["sem_id"] T = sco_etape_apogee.apo_csv_list_stored_archives( - context, annee_scolaire, sem_id, etapes=semset.list_etapes() + annee_scolaire, sem_id, etapes=semset.list_etapes() ) for t in T: # Ajoute qq infos pour affichage: - csv_data = sco_etape_apogee.apo_csv_get( - context, t["etape_apo"], annee_scolaire, sem_id - ) + csv_data = sco_etape_apogee.apo_csv_get(t["etape_apo"], annee_scolaire, sem_id) apo_data = sco_apogee_csv.ApoData(csv_data, periode=semset["sem_id"]) t["filename"] = apo_data.titles["apoC_Fichier_Exp"] t["nb_etuds"] = len(apo_data.etuds) @@ -488,17 +485,17 @@ def table_apo_csv_list(context, semset, REQUEST=None): return tab -def view_apo_etuds(context, semset_id, title="", nips=[], format="html", REQUEST=None): +def view_apo_etuds(semset_id, title="", nips=[], format="html", REQUEST=None): """Table des étudiants Apogée par nips""" if not semset_id: raise ValueError("invalid null semset_id") - semset = sco_semset.SemSet(context, semset_id=semset_id) + semset = sco_semset.SemSet(semset_id=semset_id) # annee_scolaire = semset["annee_scolaire"] # sem_id = semset["sem_id"] if nips and type(nips) != type([]): nips = [nips] - etuds = sco_etape_apogee.apo_csv_retreive_etuds_by_nip(context, semset, nips) + etuds = sco_etape_apogee.apo_csv_retreive_etuds_by_nip(semset, nips) # Ils sont parfois dans ScoDoc même si pas dans le semestre: essaie de les retrouver for etud in etuds.values(): etud_sco = sco_etud.get_etud_info(code_nip=etud["nip"], filled=True) @@ -514,7 +511,6 @@ def view_apo_etuds(context, semset_id, title="", nips=[], format="html", REQUEST ) return _view_etuds_page( - context, semset_id, title=title, etuds=list(etuds.values()), @@ -525,7 +521,7 @@ def view_apo_etuds(context, semset_id, title="", nips=[], format="html", REQUEST def view_scodoc_etuds( - context, semset_id, title="", etudids=None, nips=None, format="html", REQUEST=None + semset_id, title="", etudids=None, nips=None, format="html", REQUEST=None ): """Table des étudiants ScoDoc par nips ou etudids""" if etudids is not None: @@ -549,7 +545,6 @@ def view_scodoc_etuds( e["_prenom_td_attrs"] = 'id="pre-%s" class="etudinfo"' % (e["etudid"],) return _view_etuds_page( - context, semset_id, title=title, etuds=etuds, @@ -560,7 +555,7 @@ def view_scodoc_etuds( def _view_etuds_page( - context, semset_id, title="", etuds=[], keys=(), format="html", REQUEST=None + semset_id, title="", etuds=[], keys=(), format="html", REQUEST=None ): # Tri les étudiants par nom: if etuds: @@ -605,7 +600,7 @@ def _view_etuds_page( def view_apo_csv_store( - context, semset_id="", csvfile=None, data="", autodetect=False, REQUEST=None + semset_id="", csvfile=None, data="", autodetect=False, REQUEST=None ): """Store CSV data Le semset identifie l'annee scolaire et le semestre @@ -613,7 +608,7 @@ def view_apo_csv_store( """ if not semset_id: raise ValueError("invalid null semset_id") - semset = sco_semset.SemSet(context, semset_id=semset_id) + semset = sco_semset.SemSet(semset_id=semset_id) if csvfile: data = csvfile.read() @@ -636,18 +631,16 @@ def view_apo_csv_store( "Le code étape de ce fichier ne correspond pas à ceux de cet ensemble" ) - sco_etape_apogee.apo_csv_store( - context, data, semset["annee_scolaire"], semset["sem_id"] - ) + sco_etape_apogee.apo_csv_store(data, semset["annee_scolaire"], semset["sem_id"]) return flask.redirect("apo_semset_maq_status?semset_id=" + semset_id) -def view_apo_csv_download_and_store(context, etape_apo="", semset_id="", REQUEST=None): +def view_apo_csv_download_and_store(etape_apo="", semset_id="", REQUEST=None): """Download maquette and store it""" if not semset_id: raise ValueError("invalid null semset_id") - semset = sco_semset.SemSet(context, semset_id=semset_id) + semset = sco_semset.SemSet(semset_id=semset_id) data = sco_portal_apogee.get_maquette_apogee( etape=etape_apo, annee_scolaire=semset["annee_scolaire"] @@ -655,18 +648,16 @@ def view_apo_csv_download_and_store(context, etape_apo="", semset_id="", REQUEST # here, data is utf8 # but we store and generate latin1 files, to ease further import in Apogée data = data.decode(APO_PORTAL_ENCODING).encode(APO_INPUT_ENCODING) # XXX #py3 - return view_apo_csv_store( - context, semset_id, data=data, autodetect=False, REQUEST=REQUEST - ) + return view_apo_csv_store(semset_id, data=data, autodetect=False, REQUEST=REQUEST) def view_apo_csv_delete( - context, etape_apo="", semset_id="", dialog_confirmed=False, REQUEST=None + etape_apo="", semset_id="", dialog_confirmed=False, REQUEST=None ): """Delete CSV file""" if not semset_id: raise ValueError("invalid null semset_id") - semset = sco_semset.SemSet(context, semset_id=semset_id) + semset = sco_semset.SemSet(semset_id=semset_id) dest_url = "apo_semset_maq_status?semset_id=" + semset_id if not dialog_confirmed: return scu.confirm_dialog( @@ -679,22 +670,22 @@ def view_apo_csv_delete( ) info = sco_etape_apogee.apo_csv_get_archive( - context, etape_apo, semset["annee_scolaire"], semset["sem_id"] + etape_apo, semset["annee_scolaire"], semset["sem_id"] ) - sco_etape_apogee.apo_csv_delete(context, info["archive_id"]) + sco_etape_apogee.apo_csv_delete(info["archive_id"]) return flask.redirect(dest_url + "&head_message=Archive%20supprimée") -def view_apo_csv(context, etape_apo="", semset_id="", format="html", REQUEST=None): +def view_apo_csv(etape_apo="", semset_id="", format="html", REQUEST=None): """Visualise une maquette stockée Si format="raw", renvoie le fichier maquette tel quel """ if not semset_id: raise ValueError("invalid null semset_id") - semset = sco_semset.SemSet(context, semset_id=semset_id) + semset = sco_semset.SemSet(semset_id=semset_id) annee_scolaire = semset["annee_scolaire"] sem_id = semset["sem_id"] - csv_data = sco_etape_apogee.apo_csv_get(context, etape_apo, annee_scolaire, sem_id) + csv_data = sco_etape_apogee.apo_csv_get(etape_apo, annee_scolaire, sem_id) if format == "raw": return scu.sendCSVFile(REQUEST, csv_data, etape_apo + ".txt") apo_data = sco_apogee_csv.ApoData(csv_data, periode=semset["sem_id"]) @@ -709,7 +700,7 @@ def view_apo_csv(context, etape_apo="", semset_id="", format="html", REQUEST=Non apo_dups, maq_elems, sem_elems, - ) = sco_etape_apogee.apo_csv_semset_check(context, semset) + ) = sco_etape_apogee.apo_csv_semset_check(semset) H = [ html_sco_header.sco_header( @@ -788,7 +779,6 @@ def view_apo_csv(context, etape_apo="", semset_id="", format="html", REQUEST=Non # called from Web def apo_csv_export_results( - context, semset_id, block_export_res_etape=False, block_export_res_sem=False, @@ -815,7 +805,7 @@ def apo_csv_export_results( if not semset_id: raise ValueError("invalid null semset_id") - semset = sco_semset.SemSet(context, semset_id=semset_id) + semset = sco_semset.SemSet(semset_id=semset_id) annee_scolaire = semset["annee_scolaire"] periode = semset["sem_id"] @@ -823,14 +813,11 @@ def apo_csv_export_results( dest_zip = ZipFile(data, "w") etapes_apo = sco_etape_apogee.apo_csv_list_stored_etapes( - context, annee_scolaire, periode, etapes=semset.list_etapes() + annee_scolaire, periode, etapes=semset.list_etapes() ) for etape_apo in etapes_apo: - apo_csv = sco_etape_apogee.apo_csv_get( - context, etape_apo, annee_scolaire, periode - ) + apo_csv = sco_etape_apogee.apo_csv_get(etape_apo, annee_scolaire, periode) sco_apogee_csv.export_csv_to_apogee( - context, apo_csv, periode=periode, export_res_etape=export_res_etape, diff --git a/app/scodoc/sco_etape_bilan.py b/app/scodoc/sco_etape_bilan.py index 4231acdd5..6d1bb22a3 100644 --- a/app/scodoc/sco_etape_bilan.py +++ b/app/scodoc/sco_etape_bilan.py @@ -237,8 +237,7 @@ class EtapeBilan(object): Structure de donnée représentation l'état global de la comparaison ScoDoc/Apogée """ - def __init__(self, context): - self.context = context + def __init__(self): self.semestres = ( {} ) # Dictionnaire des formsemestres du semset (formsemestre_id -> semestre) @@ -405,7 +404,7 @@ class EtapeBilan(object): for key_etape in self.etapes: anneeapogee, etapestr = key_to_values(key_etape) self.etu_etapes[key_etape] = set() - for etud in get_inscrits_etape(self.context, etapestr, anneeapogee): + for etud in get_inscrits_etape(etapestr, anneeapogee): key_etu = self.register_etud_apogee(etud, key_etape) self.etu_etapes[key_etape].add(key_etu) diff --git a/app/scodoc/sco_etud.py b/app/scodoc/sco_etud.py index 562db3388..d8e5a74f5 100644 --- a/app/scodoc/sco_etud.py +++ b/app/scodoc/sco_etud.py @@ -116,9 +116,7 @@ def format_etud_ident(etud): def force_uppercase(s): - if s: - s = scu.strupper(s) - return s + return s.upper() if s else s def format_nomprenom(etud, reverse=False): @@ -151,7 +149,7 @@ def format_nom(s, uppercase=True): if not s: return "" if uppercase: - return scu.strupper(s) + return s.upper() else: return format_prenom(s) @@ -161,7 +159,7 @@ def input_civilite(s): 'M', 'F', or 'X' (and nothing else). Raises valueError if conversion fails. """ - s = scu.strupper(s).strip() + s = s.upper().strip() if s in ("M", "M.", "MR", "H"): return "M" elif s in ("F", "MLLE", "MLLE.", "MELLE", "MME"): @@ -187,7 +185,7 @@ def format_civilite(civilite): def format_lycee(nomlycee): nomlycee = nomlycee.strip() - s = scu.strlower(nomlycee) + s = nomlycee.lower() if s[:5] == "lycee" or s[:5] == "lycée": return nomlycee[5:] else: @@ -217,7 +215,7 @@ def format_telephone(n): def format_pays(s): "laisse le pays seulement si != FRANCE" - if scu.strupper(s) != "FRANCE": + if s.upper() != "FRANCE": return s else: return "" @@ -321,7 +319,9 @@ def check_nom_prenom(cnx, nom="", prenom="", etudid=None): return True, len(res) -def _check_duplicate_code(cnx, args, code_name, context, edit=True, REQUEST=None): +def _check_duplicate_code( + cnx, args, code_name, disable_notify=False, edit=True, REQUEST=None +): etudid = args.get("etudid", None) if args.get(code_name, None): etuds = identite_list(cnx, {code_name: str(args[code_name])}) @@ -355,7 +355,7 @@ def _check_duplicate_code(cnx, args, code_name, context, edit=True, REQUEST=None OK = "Annuler" dest_url = "" parameters = {} - if context: + if not disable_notify: err_page = scu.confirm_dialog( message="""

Code étudiant (%s) dupliqué !

""" % code_name, helpmsg="""Le %s %s est déjà utilisé: un seul étudiant peut avoir ce code. Vérifier votre valeur ou supprimer l'autre étudiant avec cette valeur.

', '
    ', @@ -436,7 +436,7 @@ def formsemestre_status_menubar(context, sem): htmlutils.make_menu("Notes", menuNotes), htmlutils.make_menu("Jury", menuJury), htmlutils.make_menu("Statistiques", menuStats), - formsemestre_custommenu_html(context, formsemestre_id), + formsemestre_custommenu_html(formsemestre_id), "
", #'
' ] @@ -448,7 +448,6 @@ def retreive_formsemestre_from_request(): arguments de la requête: formsemestre_id ou moduleimpl ou evaluation ou group_id ou partition_id """ - context = None # XXX #context if request.method == "GET": args = request.args elif request.method == "POST": @@ -494,7 +493,7 @@ def retreive_formsemestre_from_request(): # Element HTML decrivant un semestre (barre de menu et infos) -def formsemestre_page_title(context): +def formsemestre_page_title(): """Element HTML decrivant un semestre (barre de menu et infos) Cherche dans REQUEST si un semestre est défini (formsemestre_id ou moduleimpl ou evaluation ou group) """ @@ -515,7 +514,7 @@ def formsemestre_page_title(context): """""" % sem, - formsemestre_status_menubar(context, sem), + formsemestre_status_menubar(sem), """
""", ] return "\n".join(H) @@ -523,7 +522,6 @@ def formsemestre_page_title(context): def fill_formsemestre(sem): """Add some useful fields to help display formsemestres""" - context = None # XXX #context notes_url = scu.NotesURL() sem["notes_url"] = notes_url formsemestre_id = sem["formsemestre_id"] @@ -576,9 +574,7 @@ def fill_formsemestre(sem): # Description du semestre sous forme de table exportable -def formsemestre_description_table( - context, formsemestre_id, REQUEST=None, with_evals=False -): +def formsemestre_description_table(formsemestre_id, REQUEST=None, with_evals=False): """Description du semestre sous forme de table exportable Liste des modules et de leurs coefficients """ @@ -695,7 +691,7 @@ def formsemestre_description_table( titles["coefficient"] = "Coef. éval." titles["evalcomplete_str"] = "Complète" titles["publish_incomplete_str"] = "Toujours Utilisée" - title = "%s %s" % (scu.strcapitalize(parcours.SESSION_NAME), sem["titremois"]) + title = "%s %s" % (parcours.SESSION_NAME.capitalize(), sem["titremois"]) return GenTable( columns_ids=columns_ids, @@ -717,14 +713,14 @@ def formsemestre_description_table( def formsemestre_description( - context, formsemestre_id, format="html", with_evals=False, REQUEST=None + formsemestre_id, format="html", with_evals=False, REQUEST=None ): """Description du semestre sous forme de table exportable Liste des modules et de leurs coefficients """ with_evals = int(with_evals) tab = formsemestre_description_table( - context, formsemestre_id, REQUEST, with_evals=with_evals + formsemestre_id, REQUEST, with_evals=with_evals ) tab.html_before_table = """
@@ -740,8 +736,7 @@ def formsemestre_description( # genere liste html pour accès aux groupes de ce semestre -def _make_listes_sem(context, sem, REQUEST=None, with_absences=True): - context = context +def _make_listes_sem(sem, REQUEST=None, with_absences=True): # construit l'URL "destination" # (a laquelle on revient apres saisie absences) destination = url_for( @@ -778,7 +773,7 @@ def _make_listes_sem(context, sem, REQUEST=None, with_absences=True): """) date = first_monday i = 0 - for jour in sco_abs.day_names(context): + for jour in sco_abs.day_names(): if i == today_idx: sel = "selected" else: @@ -916,7 +906,7 @@ def form_choix_jour_saisie_hebdo( # Ajout Le Havre # Formulaire saisie absences semaine -def form_choix_saisie_semaine(context, groups_infos, REQUEST=None): +def form_choix_saisie_semaine(groups_infos, REQUEST=None): authuser = REQUEST.AUTHENTICATED_USER if not authuser.has_permission(Permission.ScoAbsChange): return "" @@ -947,7 +937,7 @@ def form_choix_saisie_semaine(context, groups_infos, REQUEST=None): return "\n".join(FA) -def export_groups_as_moodle_csv(context, formsemestre_id=None, REQUEST=None): +def export_groups_as_moodle_csv(formsemestre_id=None, REQUEST=None): """Export all students/groups, in a CSV format suitable for Moodle Each (student,group) will be listed on a separate line jo@univ.fr,S3-A diff --git a/app/scodoc/sco_import_etuds.py b/app/scodoc/sco_import_etuds.py index a6923176a..f9b688b48 100644 --- a/app/scodoc/sco_import_etuds.py +++ b/app/scodoc/sco_import_etuds.py @@ -157,7 +157,6 @@ def sco_import_generate_excel_sample( exclude_cols=[], extra_cols=[], group_ids=[], - context=None, REQUEST=None, ): """Generates an excel document based on format fmt @@ -171,10 +170,10 @@ def sco_import_generate_excel_sample( titles = [] titlesStyles = [] for l in fmt: - name = scu.strlower(l[0]) + name = l[0].lower() if (not with_codesemestre) and name == "codesemestre": continue # pas de colonne codesemestre - if only_tables is not None and scu.strlower(l[2]) not in only_tables: + if only_tables is not None and l[2].lower() not in only_tables: continue # table non demandée if name in exclude_cols: continue # colonne exclue @@ -188,7 +187,7 @@ def sco_import_generate_excel_sample( titlesStyles.append(style) titles += extra_cols titlesStyles += [style] * len(extra_cols) - if group_ids and context: + if group_ids: groups_infos = sco_groups_view.DisplayedGroupsInfos(group_ids, REQUEST=REQUEST) members = groups_infos.members log( @@ -209,7 +208,7 @@ def sco_import_generate_excel_sample( ) l.append(etud["partitionsgroupes"]) else: - key = scu.strlower(field).split()[0] + key = field.lower().split()[0] l.append(etud.get(key, "")) lines.append(l) else: @@ -220,7 +219,6 @@ def sco_import_generate_excel_sample( def students_import_excel( - context, csvfile, REQUEST=None, formsemestre_id=None, @@ -230,7 +228,6 @@ def students_import_excel( "import students from Excel file" diag = scolars_import_excel_file( csvfile, - context, REQUEST, formsemestre_id=formsemestre_id, check_homonyms=check_homonyms, @@ -258,7 +255,6 @@ def students_import_excel( def scolars_import_excel_file( datafile, - context, REQUEST, formsemestre_id=None, check_homonyms=True, @@ -285,7 +281,7 @@ def scolars_import_excel_file( titles = {} fmt = sco_import_format() for l in fmt: - tit = scu.strlower(l[0]).split()[0] # titles in lowercase, and take 1st word + tit = l[0].lower().split()[0] # titles in lowercase, and take 1st word if ( (not formsemestre_id) or (tit != "codesemestre") ) and tit not in exclude_cols: @@ -294,7 +290,7 @@ def scolars_import_excel_file( # log("titles=%s" % titles) # remove quotes, downcase and keep only 1st word try: - fs = [scu.strlower(scu.stripquotes(s)).split()[0] for s in data[0]] + fs = [scu.stripquotes(s).lower().split()[0] for s in data[0]] except: raise ScoValueError("Titres de colonnes invalides (ou vides ?)") # log("excel: fs='%s'\ndata=%s" % (str(fs), str(data))) @@ -371,7 +367,7 @@ def scolars_import_excel_file( % (val, linenum, titleslist[i]) ) # xxx Ad-hoc checks (should be in format description) - if scu.strlower(titleslist[i]) == "sexe": + if titleslist[i].lower() == "sexe": try: val = sco_etud.input_civilite(val) except: @@ -380,13 +376,13 @@ def scolars_import_excel_file( % (val, linenum, titleslist[i]) ) # Excel date conversion: - if scu.strlower(titleslist[i]) == "date_naissance": + if titleslist[i].lower() == "date_naissance": if val: # if re.match(r"^[0-9]*\.?[0-9]*$", str(val)): val = sco_excel.xldate_as_datetime(val) # INE if ( - scu.strlower(titleslist[i]) == "code_ine" + titleslist[i].lower() == "code_ine" and always_require_ine and not val ): @@ -419,7 +415,6 @@ def scolars_import_excel_file( # Insert in DB tables formsemestre_to_invalidate.add( _import_one_student( - context, cnx, REQUEST, formsemestre_id, @@ -494,12 +489,11 @@ def scolars_import_excel_file( def students_import_admission( - context, csvfile, type_admission="", REQUEST=None, formsemestre_id=None + csvfile, type_admission="", REQUEST=None, formsemestre_id=None ): "import donnees admission from Excel file (v2016)" diag = scolars_import_admission( csvfile, - context, REQUEST, formsemestre_id=formsemestre_id, type_admission=type_admission, @@ -522,7 +516,6 @@ def students_import_admission( def _import_one_student( - context, cnx, REQUEST, formsemestre_id, @@ -542,7 +535,7 @@ def _import_one_student( ) # Identite args = values.copy() - etudid = sco_etud.identite_create(cnx, args, context=context, REQUEST=REQUEST) + etudid = sco_etud.identite_create(cnx, args, REQUEST=REQUEST) created_etudids.append(etudid) # Admissions args["etudid"] = etudid @@ -575,7 +568,6 @@ def _import_one_student( ) do_formsemestre_inscription_with_modules( - context, args["formsemestre_id"], etudid, group_ids, @@ -594,7 +586,7 @@ def _is_new_ine(cnx, code_ine): # ------ Fonction ré-écrite en nov 2016 pour lire des fichiers sans etudid (fichiers APB) def scolars_import_admission( - datafile, context, REQUEST, formsemestre_id=None, type_admission=None + datafile, REQUEST, formsemestre_id=None, type_admission=None ): """Importe données admission depuis un fichier Excel quelconque par exemple ceux utilisés avec APB @@ -698,13 +690,13 @@ def scolars_import_admission( # Type admission: traitement particulier if not cur_adm["type_admission"] and not args.get("type_admission"): args["type_admission"] = type_admission - sco_etud.etudident_edit(cnx, args) + sco_etud.etudident_edit(cnx, args, disable_notify=True) adr = sco_etud.adresse_list(cnx, args={"etudid": etud["etudid"]}) if adr: args["adresse_id"] = adr[0]["adresse_id"] sco_etud.adresse_edit( - cnx, args - ) # ne passe pas le contexte: pas de notification ici + cnx, args, disable_notify=True + ) # pas de notification ici else: args["typeadresse"] = "domicile" args["description"] = "(infos admission)" @@ -800,7 +792,7 @@ def adm_convert_real(v): return float(v) -def adm_table_description_format(context): +def adm_table_description_format(): """Table HTML (ou autre format) decrivant les donnees d'admissions importables""" Fmt = sco_import_format_dict(with_codesemestre=False) for k in Fmt: diff --git a/app/scodoc/sco_import_users.py b/app/scodoc/sco_import_users.py index 1080799e0..5280559ee 100644 --- a/app/scodoc/sco_import_users.py +++ b/app/scodoc/sco_import_users.py @@ -76,7 +76,7 @@ def import_excel_file(datafile, REQUEST=None, context=None): if not data: # probably a bug raise ScoException("import_excel_file: empty file !") # 1- --- check title line - fs = [scu.strlower(scu.stripquotes(s)) for s in data[0]] + fs = [scu.stripquotes(s).lower() for s in data[0]] log("excel: fs='%s'\ndata=%s" % (str(fs), str(data))) # check cols cols = {}.fromkeys(TITLES) @@ -230,4 +230,4 @@ Pour plus d'informations sur ce logiciel, voir %s msg.epilogue = "" txt = MIMEText(txt, "plain", scu.SCO_ENCODING) msg.attach(txt) - sco_emails.sendEmail(context, msg) + sco_emails.sendEmail(msg) diff --git a/app/scodoc/sco_inscr_passage.py b/app/scodoc/sco_inscr_passage.py index fd8ad3641..de5670144 100644 --- a/app/scodoc/sco_inscr_passage.py +++ b/app/scodoc/sco_inscr_passage.py @@ -49,17 +49,17 @@ from app.scodoc import sco_etud from app.scodoc.sco_exceptions import ScoValueError -def list_authorized_etuds_by_sem(context, sem, delai=274): +def list_authorized_etuds_by_sem(sem, delai=274): """Liste des etudiants autorisés à s'inscrire dans sem. delai = nb de jours max entre la date de l'autorisation et celle de debut du semestre cible. """ - src_sems = list_source_sems(context, sem, delai=delai) - inscrits = list_inscrits(context, sem["formsemestre_id"]) + src_sems = list_source_sems(sem, delai=delai) + inscrits = list_inscrits(sem["formsemestre_id"]) r = {} candidats = {} # etudid : etud (tous les etudiants candidats) nb = 0 # debug for src in src_sems: - liste = list_etuds_from_sem(context, src, sem) + liste = list_etuds_from_sem(src, sem) liste_filtree = [] for e in liste: # Filtre ceux qui se sont déjà inscrit dans un semestre APRES le semestre src @@ -105,7 +105,7 @@ def list_authorized_etuds_by_sem(context, sem, delai=274): return r, inscrits, candidats -def list_inscrits(context, formsemestre_id, with_dems=False): +def list_inscrits(formsemestre_id, with_dems=False): """Etudiants déjà inscrits à ce semestre { etudid : etud } """ @@ -123,10 +123,10 @@ def list_inscrits(context, formsemestre_id, with_dems=False): return inscr -def list_etuds_from_sem(context, src, dst): +def list_etuds_from_sem(src, dst): """Liste des etudiants du semestre src qui sont autorisés à passer dans le semestre dst.""" target = dst["semestre_id"] - dpv = sco_pvjury.dict_pvjury(context, src["formsemestre_id"]) + dpv = sco_pvjury.dict_pvjury(src["formsemestre_id"]) if not dpv: return [] etuds = [ @@ -137,7 +137,7 @@ def list_etuds_from_sem(context, src, dst): return etuds -def list_inscrits_date(context, sem): +def list_inscrits_date(sem): """Liste les etudiants inscrits dans n'importe quel semestre SAUF sem à la date de début de sem. """ @@ -156,7 +156,7 @@ def list_inscrits_date(context, sem): return [x[0] for x in cursor.fetchall()] -def do_inscrit(context, sem, etudids, REQUEST=None, inscrit_groupes=False): +def do_inscrit(sem, etudids, REQUEST=None, inscrit_groupes=False): """Inscrit ces etudiants dans ce semestre (la liste doit avoir été vérifiée au préalable) En option: inscrit aux mêmes groupes que dans le semestre origine @@ -164,7 +164,6 @@ def do_inscrit(context, sem, etudids, REQUEST=None, inscrit_groupes=False): log("do_inscrit (inscrit_groupes=%s): %s" % (inscrit_groupes, etudids)) for etudid in etudids: sco_formsemestre_inscriptions.do_formsemestre_inscription_with_modules( - context, sem["formsemestre_id"], etudid, etat="I", @@ -212,15 +211,15 @@ def do_inscrit(context, sem, etudids, REQUEST=None, inscrit_groupes=False): ) -def do_desinscrit(context, sem, etudids, REQUEST): +def do_desinscrit(sem, etudids, REQUEST): log("do_desinscrit: %s" % etudids) for etudid in etudids: sco_formsemestre_inscriptions.do_formsemestre_desinscription( - context, etudid, sem["formsemestre_id"], REQUEST=REQUEST + etudid, sem["formsemestre_id"], REQUEST=REQUEST ) -def list_source_sems(context, sem, delai=None): +def list_source_sems(sem, delai=None): """Liste des semestres sources sem est le semestre destination """ @@ -256,7 +255,6 @@ def list_source_sems(context, sem, delai=None): def formsemestre_inscr_passage( - context, formsemestre_id, etuds=[], inscrit_groupes=False, @@ -288,12 +286,12 @@ def formsemestre_inscr_passage( if type(etuds) == type(""): etuds = etuds.split(",") # vient du form de confirmation - auth_etuds_by_sem, inscrits, candidats = list_authorized_etuds_by_sem(context, sem) + auth_etuds_by_sem, inscrits, candidats = list_authorized_etuds_by_sem(sem) etuds_set = set(etuds) candidats_set = set(candidats) inscrits_set = set(inscrits) candidats_non_inscrits = candidats_set - inscrits_set - inscrits_ailleurs = set(list_inscrits_date(context, sem)) + inscrits_ailleurs = set(list_inscrits_date(sem)) def set_to_sorted_etud_list(etudset): etuds = [candidats[etudid] for etudid in etudset] @@ -310,7 +308,6 @@ def formsemestre_inscr_passage( if not submitted: H += build_page( - context, REQUEST, sem, auth_etuds_by_sem, @@ -361,7 +358,6 @@ def formsemestre_inscr_passage( else: # Inscription des étudiants au nouveau semestre: do_inscrit( - context, sem, a_inscrire, REQUEST=REQUEST, @@ -369,7 +365,7 @@ def formsemestre_inscr_passage( ) # Desincriptions: - do_desinscrit(context, sem, a_desinscrire, REQUEST) + do_desinscrit(sem, a_desinscrire, REQUEST) H.append( """

Opération effectuée

@@ -398,7 +394,6 @@ def formsemestre_inscr_passage( def build_page( - context, REQUEST, sem, auth_etuds_by_sem, @@ -429,7 +424,7 @@ def build_page( et %d candidats supplémentaires """ % (len(inscrits), len(candidats_non_inscrits)), - etuds_select_boxes(context, auth_etuds_by_sem, inscrits_ailleurs), + etuds_select_boxes(auth_etuds_by_sem, inscrits_ailleurs), """

""", formsemestre_inscr_passage_help(sem), """

""", @@ -473,7 +468,6 @@ def formsemestre_inscr_passage_help(sem): def etuds_select_boxes( - context, auth_etuds_by_cat, inscrits_ailleurs={}, sel_inscrits=True, @@ -489,7 +483,7 @@ def etuds_select_boxes( export_cat_xls = """ if export_cat_xls: - return etuds_select_box_xls(context, auth_etuds_by_cat[export_cat_xls]) + return etuds_select_box_xls(auth_etuds_by_cat[export_cat_xls]) H = [ """