diff --git a/app/decorators.py b/app/decorators.py
index a14c3aff31..3d90aa2126 100644
--- a/app/decorators.py
+++ b/app/decorators.py
@@ -4,6 +4,8 @@
import functools
from functools import wraps
import inspect
+import types
+import logging
import flask
from flask import g
@@ -88,9 +90,9 @@ def permission_required(permission):
if "scodoc_dept" in kwargs:
g.scodoc_dept = kwargs["scodoc_dept"]
del kwargs["scodoc_dept"]
- current_app.logger.info(
- "permission_required: %s in %s" % (permission, g.scodoc_dept)
- )
+ # current_app.logger.info(
+ # "permission_required: %s in %s" % (permission, g.scodoc_dept)
+ # )
if not current_user.has_permission(permission, g.scodoc_dept):
abort(403)
return f(*args, **kwargs)
@@ -201,8 +203,17 @@ class ScoDoc7Context(object):
Mainly used to call published methods, as context.function(...)
"""
- def __init__(self, globals_dict):
- self.__dict__ = globals_dict
+ 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 (
+ type(globals_dict[k]) == types.FunctionType
+ ):
+ setattr(self, k, globals_dict[k].__get__(self))
def __repr__(self):
- return "ScoDoc7Context()"
+ return "ScoDoc7Context('%s')" % self.name
diff --git a/app/scodoc/sco_formations.py b/app/scodoc/sco_formations.py
index eedfd48288..c936ee0f9a 100644
--- a/app/scodoc/sco_formations.py
+++ b/app/scodoc/sco_formations.py
@@ -37,6 +37,7 @@ from notes_log import log
import sco_codes_parcours
import sco_formsemestre
import sco_tag_module
+import sco_preferences
from gen_tables import GenTable
from sco_exceptions import ScoValueError
from sco_permissions import ScoChangeFormation
diff --git a/app/views/absences.py b/app/views/absences.py
index 65b34050c3..3bea31900f 100644
--- a/app/views/absences.py
+++ b/app/views/absences.py
@@ -95,7 +95,7 @@ from app.scodoc.sco_abs import ddmmyyyy
CSSSTYLES = html_sco_header.BOOTSTRAP_MULTISELECT_CSS
-context = ScoDoc7Context(globals())
+context = ScoDoc7Context("absences")
def sco_publish(route, function, permission):
@@ -706,7 +706,7 @@ def SignaleAbsenceGrHebdo(
context, page_title="Saisie des absences", REQUEST=REQUEST
)
+ "
Aucun étudiant !
"
- + context.sco_footer(REQUEST)
+ + html_sco_header.sco_footer(REQUEST)
)
base_url = "SignaleAbsenceGrHebdo?datelundi=%s&%s&destination=%s" % (
@@ -850,7 +850,7 @@ def SignaleAbsenceGrHebdo(
etuds, datessem, destination, moduleimpl_id, require_module
)
- H.append(context.sco_footer(REQUEST))
+ H.append(html_sco_header.sco_footer(REQUEST))
return "\n".join(H)
@@ -877,7 +877,7 @@ def SignaleAbsenceGrSemestre(
context, page_title="Saisie des absences", REQUEST=REQUEST
)
+ "Aucun étudiant !
"
- + context.sco_footer(REQUEST)
+ + html_sco_header.sco_footer(REQUEST)
)
formsemestre_id = groups_infos.formsemestre_id
require_module = sco_preferences.get_preference(
@@ -1043,7 +1043,7 @@ onchange="document.location='%(url)s&moduleimpl_id='+document.getElementById('mo
H += context._gen_form_saisie_groupe(
etuds, dates, destination, moduleimpl_id, require_module
)
- H.append(context.sco_footer(REQUEST))
+ H.append(html_sco_header.sco_footer(REQUEST))
return "\n".join(H)
@@ -1582,7 +1582,7 @@ def EtatAbsencesDate(
% REQUEST.HTTP_REFERER
)
- return "\n".join(H) + context.sco_footer(REQUEST)
+ return "\n".join(H) + html_sco_header.sco_footer(REQUEST)
# ----- Gestion des "billets d'absence": signalement par les etudiants eux mêmes (à travers le portail)
@@ -1673,7 +1673,7 @@ def AddBilletAbsenceForm(context, etudid, REQUEST=None):
),
)
if tf[0] == 0:
- return "\n".join(H) + tf[1] + context.sco_footer(REQUEST)
+ return "\n".join(H) + tf[1] + html_sco_header.sco_footer(REQUEST)
elif tf[0] == -1:
return REQUEST.RESPONSE.redirect(scu.ScoURL())
else:
@@ -1808,7 +1808,7 @@ def listeBillets(context, REQUEST=None):
submitbutton=False,
)
if tf[0] == 0:
- return "\n".join(H) + tf[1] + T + context.sco_footer(REQUEST)
+ return "\n".join(H) + tf[1] + T + html_sco_header.sco_footer(REQUEST)
else:
return REQUEST.RESPONSE.redirect(
"ProcessBilletAbsenceForm?billet_id=" + tf[2]["billet_id"]
@@ -1951,7 +1951,7 @@ def ProcessBilletAbsenceForm(context, billet_id, REQUEST=None):
)
F += 'Liste de tous les billets en attente
'
- return "\n".join(H) + "
" + tf[1] + F + context.sco_footer(REQUEST)
+ return "\n".join(H) + "
" + tf[1] + F + html_sco_header.sco_footer(REQUEST)
elif tf[0] == -1:
return REQUEST.RESPONSE.redirect(scu.ScoURL())
else:
@@ -1976,7 +1976,7 @@ def ProcessBilletAbsenceForm(context, billet_id, REQUEST=None):
billets = sco_abs.billet_absence_list(cnx, {"etudid": etud["etudid"]})
tab = context._tableBillets(billets, etud=etud)
H.append(tab.html())
- return "\n".join(H) + context.sco_footer(REQUEST)
+ return "\n".join(H) + html_sco_header.sco_footer(REQUEST)
@bp.route("/XMLgetAbsEtud")
@@ -2011,3 +2011,6 @@ def XMLgetAbsEtud(context, beg_date="", end_date="", REQUEST=None):
doc._pop()
log("XMLgetAbsEtud (%gs)" % (time.time() - t0))
return repr(doc)
+
+
+context.populate(globals())
diff --git a/app/views/entreprises.py b/app/views/entreprises.py
index c8b810b5bb..5e0f7703ed 100644
--- a/app/views/entreprises.py
+++ b/app/views/entreprises.py
@@ -537,7 +537,7 @@ def entreprise_contact_edit(context, entreprise_contact_id, REQUEST=None):
initvalues=c,
submitlabel="Modifier les valeurs",
readonly=not REQUEST.AUTHENTICATED_USER.has_permission(
- ScoEntrepriseChange
+ Permission.ScoEntrepriseChange
),
)
@@ -665,7 +665,7 @@ def entreprise_correspondant_edit(context, entreprise_corresp_id, REQUEST=None):
initvalues=c,
submitlabel="Modifier les valeurs",
readonly=not REQUEST.AUTHENTICATED_USER.has_permission(
- ScoEntrepriseChange
+ Permission.ScoEntrepriseChange
),
)
if tf[0] == 0:
@@ -776,7 +776,7 @@ def entreprise_contact_create(context, entreprise_id, REQUEST=None):
cancelbutton="Annuler",
submitlabel="Ajouter ce contact",
readonly=not REQUEST.AUTHENTICATED_USER.has_permission(
- ScoEntrepriseChange
+ Permission.ScoEntrepriseChange
),
)
if tf[0] == 0:
@@ -926,7 +926,7 @@ def entreprise_correspondant_create(context, entreprise_id, REQUEST=None):
cancelbutton="Annuler",
submitlabel="Ajouter ce correspondant",
readonly=not REQUEST.AUTHENTICATED_USER.has_permission(
- ScoEntrepriseChange
+ Permission.ScoEntrepriseChange
),
)
if tf[0] == 0:
@@ -960,7 +960,7 @@ def entreprise_correspondant_delete(context, entreprise_corresp_id, REQUEST=None
submitlabel="Confirmer la suppression",
cancelbutton="Annuler",
readonly=not REQUEST.AUTHENTICATED_USER.has_permission(
- ScoEntrepriseChange
+ Permission.ScoEntrepriseChange
),
)
if tf[0] == 0:
@@ -1020,7 +1020,7 @@ def entreprise_delete(context, entreprise_id, REQUEST=None):
submitlabel="Confirmer la suppression",
cancelbutton="Annuler",
readonly=not REQUEST.AUTHENTICATED_USER.has_permission(
- ScoEntrepriseChange
+ Permission.ScoEntrepriseChange
),
)
if tf[0] == 0:
@@ -1117,7 +1117,7 @@ def entreprise_create(context, REQUEST=None):
cancelbutton="Annuler",
submitlabel="Ajouter cette entreprise",
readonly=not REQUEST.AUTHENTICATED_USER.has_permission(
- ScoEntrepriseChange
+ Permission.ScoEntrepriseChange
),
)
if tf[0] == 0:
diff --git a/app/views/notes.py b/app/views/notes.py
index c621c763db..2d8d50d4a9 100644
--- a/app/views/notes.py
+++ b/app/views/notes.py
@@ -128,7 +128,7 @@ from app.scodoc import sco_ue_external
from app.scodoc import sco_undo_notes
from app.scodoc import scolars
-context = ScoDoc7Context(globals())
+context = ScoDoc7Context("notes")
def sco_publish(route, function, permission):
@@ -389,7 +389,7 @@ def index_html(context, REQUEST=None):
"""
)
- H.append(context.sco_footer(REQUEST))
+ H.append(html_sco_header.sco_footer(context, REQUEST))
return "\n".join(H)
@@ -491,7 +491,7 @@ def formation_import_xml_form(context, REQUEST):
à partir un fichier XML (réservé aux utilisateurs avertis)
""",
]
- footer = context.sco_footer(REQUEST)
+ footer = html_sco_header.sco_footer(context, REQUEST)
tf = TrivialFormulator(
REQUEST.URL0,
REQUEST.form,
@@ -1143,7 +1143,7 @@ def _check_access_diretud(
header = html_sco_header.sco_header(
context, page_title="Accès interdit", REQUEST=REQUEST
)
- footer = context.sco_footer(REQUEST)
+ footer = html_sco_header.sco_footer(context, REQUEST)
if (str(authuser) not in sem["responsables"]) and not authuser.has_permission(
required_permission, context
):
@@ -1192,7 +1192,7 @@ def edit_enseignants_form(context, REQUEST, moduleimpl_id):
cssstyles=["css/autosuggest_inquisitor.css"],
bodyOnLoad="init_tf_form('')",
)
- footer = context.sco_footer(REQUEST)
+ footer = html_sco_header.sco_footer(context, REQUEST)
# Liste des enseignants avec forme pour affichage / saisie avec suggestion
userlist = context.Users.get_userlist()
@@ -1345,7 +1345,9 @@ def edit_moduleimpl_resp(context, REQUEST, moduleimpl_id):
initvalues=initvalues,
)
if tf[0] == 0:
- return "\n".join(H) + tf[1] + help + context.sco_footer(REQUEST)
+ return (
+ "\n".join(H) + tf[1] + help + html_sco_header.sco_footer(context, REQUEST)
+ )
elif tf[0] == -1:
return REQUEST.RESPONSE.redirect(
"moduleimpl_status?moduleimpl_id=" + moduleimpl_id
@@ -1440,7 +1442,7 @@ def edit_moduleimpl_expr(context, REQUEST, moduleimpl_id):
initvalues=initvalues,
)
if tf[0] == 0:
- return "\n".join(H) + tf[1] + context.sco_footer(REQUEST)
+ return "\n".join(H) + tf[1] + html_sco_header.sco_footer(context, REQUEST)
elif tf[0] == -1:
return REQUEST.RESPONSE.redirect(
"moduleimpl_status?moduleimpl_id=" + moduleimpl_id
@@ -1514,7 +1516,7 @@ def view_module_abs(context, REQUEST, moduleimpl_id, format="html"):
return (
"\n".join(H)
+ "Aucune absence signalée
"
- + context.sco_footer(REQUEST)
+ + html_sco_header.sco_footer(context, REQUEST)
)
tab = GenTable(
@@ -1538,7 +1540,7 @@ def view_module_abs(context, REQUEST, moduleimpl_id, format="html"):
if format != "html":
return tab.make_page(context, format=format, REQUEST=REQUEST)
- return "\n".join(H) + tab.html() + context.sco_footer(REQUEST)
+ return "\n".join(H) + tab.html() + html_sco_header.sco_footer(context, REQUEST)
@bp.route("/edit_ue_expr")
@@ -1593,7 +1595,7 @@ def edit_ue_expr(context, REQUEST, formsemestre_id, ue_id):
initvalues=initvalues,
)
if tf[0] == 0:
- return "\n".join(H) + tf[1] + context.sco_footer(REQUEST)
+ return "\n".join(H) + tf[1] + html_sco_header.sco_footer(context, REQUEST)
elif tf[0] == -1:
return REQUEST.RESPONSE.redirect(
"formsemestre_status?formsemestre_id=" + formsemestre_id
@@ -1899,7 +1901,7 @@ def formsemestre_desinscription(
html_sco_header.sco_header(context, REQUEST)
+ 'Etudiant désinscrit !
retour à la fiche'
% (scu.ScoURL(), etudid)
- + context.sco_footer(REQUEST)
+ + html_sco_header.sco_footer(context, REQUEST)
)
@@ -2283,7 +2285,7 @@ def evaluation_delete(context, REQUEST, evaluation_id):
"""
Suppression impossible (effacer les notes d'abord)
retour au tableau de bord du module
"""
% E["moduleimpl_id"]
)
- return "\n".join(H) + context.sco_footer(REQUEST)
+ return "\n".join(H) + html_sco_header.sco_footer(context, REQUEST)
if warning:
H.append("""""")
@@ -2296,7 +2298,7 @@ def evaluation_delete(context, REQUEST, evaluation_id):
cancelbutton="Annuler",
)
if tf[0] == 0:
- return "\n".join(H) + tf[1] + context.sco_footer(REQUEST)
+ return "\n".join(H) + tf[1] + html_sco_header.sco_footer(context, REQUEST)
elif tf[0] == -1:
return REQUEST.RESPONSE.redirect(
scu.ScoURL()
@@ -2314,7 +2316,7 @@ def evaluation_delete(context, REQUEST, evaluation_id):
+ "/Notes/moduleimpl_status?moduleimpl_id="
+ E["moduleimpl_id"]
)
- + context.sco_footer(REQUEST)
+ + html_sco_header.sco_footer(context, REQUEST)
)
@@ -2438,7 +2440,7 @@ def evaluation_listenotes(context, REQUEST=None):
javascripts=["js/etud_info.js"],
init_qtip=True,
)
- F = context.sco_footer(REQUEST)
+ F = html_sco_header.sco_footer(context, REQUEST)
else:
H, F = "", ""
B = context.do_evaluation_listenotes(REQUEST)
@@ -2702,7 +2704,7 @@ def formsemestre_bulletins_mailetuds(
html_sco_header.sco_header(context, REQUEST)
+ '%d bulletins sur %d envoyés par mail !
continuer
'
% (nb_send, len(etudids), formsemestre_id)
- + context.sco_footer(REQUEST)
+ + html_sco_header.sco_footer(context, REQUEST)
)
@@ -2766,7 +2768,7 @@ def appreciation_add_form(
html_sco_header.sco_header(context, REQUEST)
+ "%s d'une appréciation sur %s
" % (a, etud["nomprenom"])
]
- F = context.sco_footer(REQUEST)
+ F = html_sco_header.sco_footer(context, REQUEST)
descr = [
("edit", {"input_type": "hidden", "default": edit}),
("etudid", {"input_type": "hidden"}),
@@ -3298,7 +3300,7 @@ def check_sem_integrity(context, formsemestre_id, REQUEST):
+ "
".join([str(x) for x in bad_ue])
+ "Inconsistent SEM/MOD:
"
+ "
".join([str(x) for x in bad_sem])
- + context.sco_footer(REQUEST)
+ + html_sco_header.sco_footer(context, REQUEST)
)
@@ -3339,7 +3341,7 @@ def check_form_integrity(context, formation_id, fix=False, REQUEST=None):
return (
html_sco_header.sco_header(context, REQUEST=REQUEST)
+ txth
- + context.sco_footer(REQUEST)
+ + html_sco_header.sco_footer(context, REQUEST)
)
@@ -3391,7 +3393,7 @@ def check_formsemestre_integrity(context, formsemestre_id, REQUEST=None):
return (
html_sco_header.sco_header(context, REQUEST=REQUEST)
+ "
".join(diag)
- + context.sco_footer(REQUEST)
+ + html_sco_header.sco_footer(context, REQUEST)
)
@@ -3409,7 +3411,7 @@ def check_integrity_all(context, REQUEST=None):
return (
html_sco_header.sco_header(context, REQUEST=REQUEST)
+ "empty page: see logs and mails
"
- + context.sco_footer(REQUEST)
+ + html_sco_header.sco_footer(context, REQUEST)
)
@@ -3424,3 +3426,5 @@ sco_publish(
sco_moduleimpl.do_moduleimpl_withmodule_list,
Permission.ScoView,
)
+
+context.populate(globals())
diff --git a/app/views/scolar.py b/app/views/scolar.py
index f04832f188..57ff3721ad 100644
--- a/app/views/scolar.py
+++ b/app/views/scolar.py
@@ -145,7 +145,7 @@ from app.scodoc import sco_dept
from app.scodoc import sco_dump_db
-context = ScoDoc7Context(globals())
+context = ScoDoc7Context("scolar")
def sco_publish(route, function, permission):
@@ -197,7 +197,7 @@ def about(context, REQUEST):
html_sco_header.sco_header(context, REQUEST)
+ "\n".join(H)
+ d
- + context.sco_footer(REQUEST)
+ + html_sco_header.sco_footer(REQUEST)
)
@@ -615,7 +615,7 @@ def formChangeCoordonnees(context, etudid, REQUEST):
)
dest_url = scu.ScoURL() + "/ficheEtud?etudid=" + etudid
if tf[0] == 0:
- return header + "\n".join(H) + tf[1] + context.sco_footer(REQUEST)
+ return header + "\n".join(H) + tf[1] + html_sco_header.sco_footer(REQUEST)
elif tf[0] == -1:
return REQUEST.RESPONSE.redirect(dest_url)
else:
@@ -688,7 +688,7 @@ def etud_photo_orig_page(context, etudid=None, REQUEST=None):
'",
- context.sco_footer(REQUEST),
+ html_sco_header.sco_footer(REQUEST),
]
return "\n".join(H)
@@ -736,7 +736,7 @@ def formChangePhoto(context, etudid=None, REQUEST=None):
+ tf[1]
+ 'Supprimer cette photo
'
% etudid
- + context.sco_footer(REQUEST)
+ + html_sco_header.sco_footer(REQUEST)
)
elif tf[0] == -1:
return REQUEST.RESPONSE.redirect(dest_url)
@@ -747,7 +747,7 @@ def formChangePhoto(context, etudid=None, REQUEST=None):
return REQUEST.RESPONSE.redirect(dest_url)
else:
H.append('Erreur:' + diag + "
")
- return "\n".join(H) + context.sco_footer(REQUEST)
+ return "\n".join(H) + html_sco_header.sco_footer(REQUEST)
@bp.route("/formSuppressPhoto")
@@ -847,7 +847,7 @@ def _formDem_of_Def(
"""
% etud
)
- return header + "\n".join(H) + context.sco_footer(REQUEST)
+ return header + "\n".join(H) + html_sco_header.sco_footer(REQUEST)
@bp.route("/doDemEtudiant")
@@ -1046,7 +1046,7 @@ def etudident_edit_form(context, REQUEST=None):
def _etudident_create_or_edit_form(context, REQUEST, edit):
"Le formulaire HTML"
H = [html_sco_header.sco_header(context, REQUEST, init_jquery_ui=True)]
- F = context.sco_footer(REQUEST)
+ F = html_sco_header.sco_footer(REQUEST)
etudid = REQUEST.form.get("etudid", None)
cnx = ndb.GetDBConnexion()
descr = []
@@ -1642,7 +1642,7 @@ def check_group_apogee(
)
)
- return "\n".join(H) + context.sco_footer(REQUEST)
+ return "\n".join(H) + html_sco_header.sco_footer(REQUEST)
@bp.route("/form_students_import_excel")
@@ -1715,7 +1715,7 @@ def form_students_import_excel(context, REQUEST, formsemestre_id=None):
"""
)
- F = context.sco_footer(REQUEST)
+ F = html_sco_header.sco_footer(REQUEST)
tf = TrivialFormulator(
REQUEST.URL0,
REQUEST.form,
@@ -1829,7 +1829,7 @@ def import_generate_admission_sample(context, REQUEST, formsemestre_id):
def form_students_import_infos_admissions(context, REQUEST, formsemestre_id=None):
"formulaire import xls"
authuser = REQUEST.AUTHENTICATED_USER
- F = context.sco_footer(REQUEST)
+ F = html_sco_header.sco_footer(REQUEST)
if not authuser.has_permission(Permission.ScoEtudInscrit, context):
# autorise juste l'export
H = [
@@ -1958,7 +1958,7 @@ def _students_import_admission(
if diag:
H.append("Diagnostic:
" % "".join(diag))
- return "\n".join(H) + context.sco_footer(REQUEST)
+ return "\n".join(H) + html_sco_header.sco_footer(REQUEST)
@bp.route("/formsemestre_import_etud_admission")
@@ -1994,7 +1994,7 @@ def formsemestre_import_etud_admission(
"%s: %s devient %s
"
% (info["nom"], info["email"], new_mail)
)
- return "\n".join(H) + context.sco_footer(REQUEST)
+ return "\n".join(H) + html_sco_header.sco_footer(REQUEST)
sco_publish(
@@ -2037,3 +2037,5 @@ sco_publish(
sco_formsemestre_edit.formsemestre_edit_uecoefs,
Permission.ScoView,
)
+
+context.populate(globals())