WIP refactoring, cont.

This commit is contained in:
Emmanuel Viennet 2021-06-16 18:18:32 +02:00
parent be1d5d7a65
commit c2798be033
34 changed files with 606 additions and 574 deletions

View File

@ -8,6 +8,7 @@ SCONAME = "ScoDoc"
SCONEWS = """ SCONEWS = """
<h4>Année 2021</h4> <h4>Année 2021</h4>
<ul> <ul>
<li>Réécriture du système de publication, basé sur <a href="https://flask.palletsprojects.com/en/2.0.x/">Flask</a>.
<li>Version mobile (en test)</li> <li>Version mobile (en test)</li>
<li>Évaluations de type "deuxième session"</li> <li>Évaluations de type "deuxième session"</li>
<li>Gestion du genre neutre (pas d'affichage de la civilité)</li> <li>Gestion du genre neutre (pas d'affichage de la civilité)</li>

View File

@ -100,10 +100,10 @@ def get_sem_ues_modimpls(context, formsemestre_id, modimpls=None):
) )
uedict = {} uedict = {}
for modimpl in modimpls: for modimpl in modimpls:
mod = context.do_module_list(args={"module_id": modimpl["module_id"]})[0] mod = sco_edit_module.do_module_list(context, args={"module_id": modimpl["module_id"]})[0]
modimpl["module"] = mod modimpl["module"] = mod
if not mod["ue_id"] in uedict: if not mod["ue_id"] in uedict:
ue = context.do_ue_list(args={"ue_id": mod["ue_id"]})[0] ue = sco_edit_ue.do_ue_list(context, args={"ue_id": mod["ue_id"]})[0]
uedict[ue["ue_id"]] = ue uedict[ue["ue_id"]] = ue
ues = uedict.values() ues = uedict.values()
ues.sort(key=lambda u: u["numero"]) ues.sort(key=lambda u: u["numero"])
@ -218,18 +218,18 @@ class NotesTable:
for modimpl in self._modimpls: for modimpl in self._modimpls:
mod = modimpl["module"] # has been added here by do_formsemestre_moyennes mod = modimpl["module"] # has been added here by do_formsemestre_moyennes
if not mod["ue_id"] in uedict: if not mod["ue_id"] in uedict:
ue = context.do_ue_list(args={"ue_id": mod["ue_id"]})[0] ue = sco_edit_ue.do_ue_list(context, args={"ue_id": mod["ue_id"]})[0]
uedict[ue["ue_id"]] = ue uedict[ue["ue_id"]] = ue
else: else:
ue = uedict[mod["ue_id"]] ue = uedict[mod["ue_id"]]
modimpl["ue"] = ue # add ue dict to moduleimpl modimpl["ue"] = ue # add ue dict to moduleimpl
self._matmoys[mod["matiere_id"]] = {} self._matmoys[mod["matiere_id"]] = {}
mat = context.do_matiere_list(args={"matiere_id": mod["matiere_id"]})[0] mat = sco_edit_matiere.do_matiere_list(context, args={"matiere_id": mod["matiere_id"]})[0]
modimpl["mat"] = mat # add matiere dict to moduleimpl modimpl["mat"] = mat # add matiere dict to moduleimpl
# calcul moyennes du module et stocke dans le module # calcul moyennes du module et stocke dans le module
# nb_inscrits, nb_notes, nb_abs, nb_neutre, moy, median, last_modif= # nb_inscrits, nb_notes, nb_abs, nb_neutre, moy, median, last_modif=
self.formation = context.formation_list( self.formation = sco_formations.formation_list(context,
args={"formation_id": self.sem["formation_id"]} args={"formation_id": self.sem["formation_id"]}
)[0] )[0]
self.parcours = sco_codes_parcours.get_parcours_from_code( self.parcours = sco_codes_parcours.get_parcours_from_code(
@ -1074,7 +1074,7 @@ class NotesTable:
"Warning: %s capitalized an UE %s which is not part of current sem %s" "Warning: %s capitalized an UE %s which is not part of current sem %s"
% (etudid, ue_id, self.formsemestre_id) % (etudid, ue_id, self.formsemestre_id)
) )
ue = self.context.do_ue_list(args={"ue_id": ue_id})[0] ue = self.sco_edit_ue.do_ue_list(context, args={"ue_id": ue_id})[0]
self.uedict[ue_id] = ue # record this UE self.uedict[ue_id] = ue # record this UE
if ue_id not in self._uecoef: if ue_id not in self._uecoef:
cl = formsemestre_uecoef_list( cl = formsemestre_uecoef_list(

View File

@ -66,7 +66,7 @@ def comp_nom_semestre_dans_parcours(context, sem):
"""Le nom a afficher pour titrer un semestre """Le nom a afficher pour titrer un semestre
par exemple: "semestre 2 FI 2015" par exemple: "semestre 2 FI 2015"
""" """
F = context.formation_list(args={"formation_id": sem["formation_id"]})[0] F = sco_formations.formation_list(context, args={"formation_id": sem["formation_id"]})[0]
parcours = sco_codes_parcours.get_parcours_from_code(F["type_parcours"]) parcours = sco_codes_parcours.get_parcours_from_code(F["type_parcours"])
return "%s %s %s %s" % ( return "%s %s %s %s" % (
parcours.SESSION_NAME, # eg "semestre" parcours.SESSION_NAME, # eg "semestre"

View File

@ -131,7 +131,7 @@ def formsemestre_bulletinetud_dict(
I["server_name"] = "" I["server_name"] = ""
# Formation et parcours # Formation et parcours
I["formation"] = context.formation_list( I["formation"] = sco_formations.formation_list(context,
args={"formation_id": I["sem"]["formation_id"]} args={"formation_id": I["sem"]["formation_id"]}
)[0] )[0]
I["parcours"] = sco_codes_parcours.get_parcours_from_code( I["parcours"] = sco_codes_parcours.get_parcours_from_code(

View File

@ -380,7 +380,7 @@ def formsemestre_bulletinetud_published_dict(
"decisions_ue" "decisions_ue"
]: # and sco_preferences.get_preference(context, 'bul_show_uevalid', formsemestre_id): always publish (car utile pour export Apogee) ]: # and sco_preferences.get_preference(context, 'bul_show_uevalid', formsemestre_id): always publish (car utile pour export Apogee)
for ue_id in decision["decisions_ue"].keys(): for ue_id in decision["decisions_ue"].keys():
ue = context.do_ue_list({"ue_id": ue_id})[0] ue = sco_edit_ue.do_ue_list(context, {"ue_id": ue_id})[0]
d["decision_ue"].append( d["decision_ue"].append(
dict( dict(
ue_id=ue["ue_id"], ue_id=ue["ue_id"],

View File

@ -392,7 +392,7 @@ def make_xml_formsemestre_bulletinetud(
"decisions_ue" "decisions_ue"
]: # and sco_preferences.get_preference(context, 'bul_show_uevalid', formsemestre_id): always publish (car utile pour export Apogee) ]: # and sco_preferences.get_preference(context, 'bul_show_uevalid', formsemestre_id): always publish (car utile pour export Apogee)
for ue_id in decision["decisions_ue"].keys(): for ue_id in decision["decisions_ue"].keys():
ue = context.do_ue_list({"ue_id": ue_id})[0] ue = sco_edit_ue.do_ue_list(context, {"ue_id": ue_id})[0]
doc._push() doc._push()
doc.decision_ue( doc.decision_ue(
ue_id=ue["ue_id"], ue_id=ue["ue_id"],

View File

@ -390,7 +390,7 @@ def do_formsemestre_moyennes(context, nt, formsemestre_id):
mods_att = [] mods_att = []
expr_diags = [] expr_diags = []
for modimpl in modimpls: for modimpl in modimpls:
mod = context.do_module_list(args={"module_id": modimpl["module_id"]})[0] mod = sco_edit_module.do_module_list(context, args={"module_id": modimpl["module_id"]})[0]
modimpl["module"] = mod # add module dict to moduleimpl (used by nt) modimpl["module"] = mod # add module dict to moduleimpl (used by nt)
moduleimpl_id = modimpl["moduleimpl_id"] moduleimpl_id = modimpl["moduleimpl_id"]
assert not D.has_key(moduleimpl_id) assert not D.has_key(moduleimpl_id)

View File

@ -40,7 +40,7 @@ import sco_formations
def formation_delete(context, formation_id=None, dialog_confirmed=False, REQUEST=None): def formation_delete(context, formation_id=None, dialog_confirmed=False, REQUEST=None):
"""Delete a formation""" """Delete a formation"""
F = context.formation_list(args={"formation_id": formation_id}) F = sco_formations.formation_list(context, args={"formation_id": formation_id})
if not F: if not F:
raise ScoValueError("formation inexistante !") raise ScoValueError("formation inexistante !")
F = F[0] F = F[0]
@ -81,7 +81,7 @@ def formation_delete(context, formation_id=None, dialog_confirmed=False, REQUEST
parameters={"formation_id": formation_id}, parameters={"formation_id": formation_id},
) )
else: else:
context.do_formation_delete(F["formation_id"], REQUEST) do_formation_delete(context, F["formation_id"], REQUEST)
H.append( H.append(
"""<p>OK, formation supprimée.</p> """<p>OK, formation supprimée.</p>
<p><a class="stdlink" href="%s">continuer</a></p>""" <p><a class="stdlink" href="%s">continuer</a></p>"""
@ -92,6 +92,31 @@ def formation_delete(context, formation_id=None, dialog_confirmed=False, REQUEST
return "\n".join(H) return "\n".join(H)
def do_formation_delete(context, oid, REQUEST):
"""delete a formation (and all its UE, matieres, modules)
XXX delete all ues, will break if there are validations ! USE WITH CARE !
"""
F = sco_formations.formation_list(context, args={"formation_id": oid})[0]
if sco_formations.formation_has_locked_sems(context, oid):
raise ScoLockedFormError()
cnx = ndb.GetDBConnexion()
# delete all UE in this formation
ues = sco_edit_ue.do_ue_list(context, {"formation_id": oid})
for ue in ues:
do_ue_delete(ue["ue_id"], REQUEST=REQUEST, force=True)
sco_formations._formationEditor.delete(cnx, oid)
# news
sco_news.add(
context,
REQUEST,
typ=NEWS_FORM,
object=oid,
text="Suppression de la formation %(acronyme)s" % F,
)
def formation_create(context, REQUEST=None): def formation_create(context, REQUEST=None):
"""Creation d'une formation""" """Creation d'une formation"""
return formation_edit(context, create=True, REQUEST=REQUEST) return formation_edit(context, create=True, REQUEST=REQUEST)
@ -118,11 +143,11 @@ def formation_edit(context, formation_id=None, create=False, REQUEST=None):
is_locked = False is_locked = False
else: else:
# edit an existing formation # edit an existing formation
F = context.formation_list(args={"formation_id": formation_id}) F = sco_formations.formation_list(context, args={"formation_id": formation_id})
if not F: if not F:
raise ScoValueError("formation inexistante !") raise ScoValueError("formation inexistante !")
initvalues = F[0] initvalues = F[0]
is_locked = context.formation_has_locked_sems(formation_id) is_locked = sco_formations.formation_has_locked_sems(context, formation_id)
submitlabel = "Modifier les valeurs" submitlabel = "Modifier les valeurs"
H = [ H = [
html_sco_header.sco_header( html_sco_header.sco_header(
@ -212,7 +237,7 @@ def formation_edit(context, formation_id=None, create=False, REQUEST=None):
"version": version, "version": version,
} }
ndb.quote_dict(args) ndb.quote_dict(args)
others = context.formation_list(args=args) others = sco_formations.formation_list(context, args=args)
if others and ((len(others) > 1) or others[0]["formation_id"] != formation_id): if others and ((len(others) > 1) or others[0]["formation_id"] != formation_id):
return ( return (
"\n".join(H) "\n".join(H)
@ -237,7 +262,7 @@ def do_formation_create(context, args, REQUEST):
a = args.copy() a = args.copy()
if a.has_key("formation_id"): if a.has_key("formation_id"):
del a["formation_id"] del a["formation_id"]
F = context.formation_list(args=a) F = sco_formations.formation_list(context, args=a)
if len(F) > 0: if len(F) > 0:
log("do_formation_create: error: %d formations matching args=%s" % (len(F), a)) log("do_formation_create: error: %d formations matching args=%s" % (len(F), a))
raise ScoValueError("Formation non unique (%s) !" % str(a)) raise ScoValueError("Formation non unique (%s) !" % str(a))
@ -263,7 +288,7 @@ def do_formation_edit(context, args):
# On autorise la modif de la formation meme si elle est verrouillee # On autorise la modif de la formation meme si elle est verrouillee
# car cela ne change que du cosmetique, (sauf eventuellement le code formation ?) # car cela ne change que du cosmetique, (sauf eventuellement le code formation ?)
# mais si verrouillée on ne peut changer le type de parcours # mais si verrouillée on ne peut changer le type de parcours
if context.formation_has_locked_sems(args["formation_id"]): if sco_formations.formation_has_locked_sems(context, args["formation_id"]):
if args.has_key("type_parcours"): if args.has_key("type_parcours"):
del args["type_parcours"] del args["type_parcours"]
# On ne peut jamais supprimer le code formation: # On ne peut jamais supprimer le code formation:

View File

@ -32,13 +32,65 @@ import notesdb as ndb
import sco_utils as scu import sco_utils as scu
from notes_log import log from notes_log import log
from TrivialFormulator import TrivialFormulator, TF, tf_error_message from TrivialFormulator import TrivialFormulator, TF, tf_error_message
import sco_edit_ue
import sco_formsemestre import sco_formsemestre
import sco_news
from sco_exceptions import ScoValueError from sco_exceptions import ScoValueError
_matiereEditor = ndb.EditableTable(
"notes_matieres",
"matiere_id",
("matiere_id", "ue_id", "numero", "titre"),
sortkey="numero",
output_formators={"numero": ndb.int_null_is_zero},
)
def do_matiere_list(context, *args, **kw):
"list matieres"
cnx = ndb.GetDBConnexion()
return _matiereEditor.list(cnx, *args, **kw)
def do_matiere_edit(context, *args, **kw):
"edit a matiere"
cnx = ndb.GetDBConnexion()
# check
mat = sco_edit_matiere.do_matiere_list(
context, {"matiere_id": args[0]["matiere_id"]}
)[0]
if sco_edit_matiere.matiere_is_locked(context, mat["matiere_id"]):
raise ScoLockedFormError()
# edit
_matiereEditor.edit(cnx, *args, **kw)
sco_core.inval_cache(context) # > modif matiere
def do_matiere_create(context, args, REQUEST):
"create a matiere"
cnx = ndb.GetDBConnexion()
# check
ue = sco_edit_ue.do_ue_list(context, {"ue_id": args["ue_id"]})[0]
# create matiere
r = _matiereEditor.create(cnx, args)
# news
F = sco_formations.formation_list(
context, args={"formation_id": ue["formation_id"]}
)[0]
sco_news.add(
context,
REQUEST,
typ=NEWS_FORM,
object=ue["formation_id"],
text="Modification de la formation %(acronyme)s" % F,
)
return r
def matiere_create(context, ue_id=None, REQUEST=None): def matiere_create(context, ue_id=None, REQUEST=None):
"""Creation d'une matiere""" """Creation d'une matiere"""
UE = context.do_ue_list(args={"ue_id": ue_id})[0] UE = sco_edit_ue.do_ue_list(context, args={"ue_id": ue_id})[0]
H = [ H = [
html_sco_header.sco_header( html_sco_header.sco_header(
context, REQUEST, page_title="Création d'une matière" context, REQUEST, page_title="Création d'une matière"
@ -85,7 +137,7 @@ associé.
return REQUEST.RESPONSE.redirect(dest_url) return REQUEST.RESPONSE.redirect(dest_url)
else: else:
# check unicity # check unicity
mats = context.do_matiere_list(args={"ue_id": ue_id, "titre": tf[2]["titre"]}) mats = do_matiere_list(context, args={"ue_id": ue_id, "titre": tf[2]["titre"]})
if mats: if mats:
return ( return (
"\n".join(H) "\n".join(H)
@ -93,14 +145,46 @@ associé.
+ tf[1] + tf[1]
+ html_sco_header.sco_footer(context, REQUEST) + html_sco_header.sco_footer(context, REQUEST)
) )
_ = context.do_matiere_create(tf[2], REQUEST) _ = do_matiere_create(context, tf[2], REQUEST)
return REQUEST.RESPONSE.redirect(dest_url) return REQUEST.RESPONSE.redirect(dest_url)
def do_matiere_delete(context, oid, REQUEST):
"delete matiere and attached modules"
cnx = ndb.GetDBConnexion()
# check
mat = do_matiere_list(context, {"matiere_id": oid})[0]
ue = sco_edit_ue.do_ue_list(context, {"ue_id": mat["ue_id"]})[0]
locked = sco_edit_matiere.matiere_is_locked(context, mat["matiere_id"])
if locked:
log("do_matiere_delete: mat=%s" % mat)
log("do_matiere_delete: ue=%s" % ue)
log("do_matiere_delete: locked sems: %s" % locked)
raise ScoLockedFormError()
log("do_matiere_delete: matiere_id=%s" % oid)
# delete all modules in this matiere
mods = sco_edit_module.do_module_list(context, {"matiere_id": oid})
for mod in mods:
sco_edit_module.do_module_delete(context, mod["module_id"], REQUEST)
_matiereEditor.delete(cnx, oid)
# news
F = sco_formations.formation_list(
context, args={"formation_id": ue["formation_id"]}
)[0]
sco_news.add(
context,
REQUEST,
typ=NEWS_FORM,
object=ue["formation_id"],
text="Modification de la formation %(acronyme)s" % F,
)
def matiere_delete(context, matiere_id=None, REQUEST=None): def matiere_delete(context, matiere_id=None, REQUEST=None):
"""Delete an UE""" """Delete an UE"""
M = context.do_matiere_list(args={"matiere_id": matiere_id})[0] M = do_matiere_list(context, args={"matiere_id": matiere_id})[0]
UE = context.do_ue_list(args={"ue_id": M["ue_id"]})[0] UE = sco_edit_ue.do_ue_list(context, args={"ue_id": M["ue_id"]})[0]
H = [ H = [
html_sco_header.sco_header( html_sco_header.sco_header(
context, REQUEST, page_title="Suppression d'une matière" context, REQUEST, page_title="Suppression d'une matière"
@ -122,23 +206,25 @@ def matiere_delete(context, matiere_id=None, REQUEST=None):
elif tf[0] == -1: elif tf[0] == -1:
return REQUEST.RESPONSE.redirect(dest_url) return REQUEST.RESPONSE.redirect(dest_url)
else: else:
context.do_matiere_delete(matiere_id, REQUEST) do_matiere_delete(context, matiere_id, REQUEST)
return REQUEST.RESPONSE.redirect(dest_url) return REQUEST.RESPONSE.redirect(dest_url)
def matiere_edit(context, matiere_id=None, REQUEST=None): def matiere_edit(context, matiere_id=None, REQUEST=None):
"""Edit matiere""" """Edit matiere"""
F = context.do_matiere_list(args={"matiere_id": matiere_id}) F = do_matiere_list(context, args={"matiere_id": matiere_id})
if not F: if not F:
raise ScoValueError("Matière inexistante !") raise ScoValueError("Matière inexistante !")
F = F[0] F = F[0]
U = context.do_ue_list(args={"ue_id": F["ue_id"]}) U = sco_edit_ue.do_ue_list(context, args={"ue_id": F["ue_id"]})
if not F: if not F:
raise ScoValueError("UE inexistante !") raise ScoValueError("UE inexistante !")
U = U[0] U = U[0]
Fo = context.formation_list(args={"formation_id": U["formation_id"]})[0] Fo = sco_formations.formation_list(
context, args={"formation_id": U["formation_id"]}
)[0]
ues = context.do_ue_list(args={"formation_id": U["formation_id"]}) ues = sco_edit_ue.do_ue_list(context, args={"formation_id": U["formation_id"]})
ue_names = ["%(acronyme)s (%(titre)s)" % u for u in ues] ue_names = ["%(acronyme)s (%(titre)s)" % u for u in ues]
ue_ids = [u["ue_id"] for u in ues] ue_ids = [u["ue_id"] for u in ues]
H = [ H = [
@ -195,8 +281,8 @@ associé.
return REQUEST.RESPONSE.redirect(dest_url) return REQUEST.RESPONSE.redirect(dest_url)
else: else:
# check unicity # check unicity
mats = context.do_matiere_list( mats = do_matiere_list(
args={"ue_id": tf[2]["ue_id"], "titre": tf[2]["titre"]} context, args={"ue_id": tf[2]["ue_id"], "titre": tf[2]["titre"]}
) )
if len(mats) > 1 or (len(mats) == 1 and mats[0]["matiere_id"] != matiere_id): if len(mats) > 1 or (len(mats) == 1 and mats[0]["matiere_id"] != matiere_id):
return ( return (
@ -215,7 +301,7 @@ associé.
{"ue_id": tf[2]["ue_id"], "matiere_id": matiere_id}, {"ue_id": tf[2]["ue_id"], "matiere_id": matiere_id},
) )
context.do_matiere_edit(tf[2]) do_matiere_edit(context, tf[2])
return REQUEST.RESPONSE.redirect(dest_url) return REQUEST.RESPONSE.redirect(dest_url)

View File

@ -25,7 +25,7 @@
# #
############################################################################## ##############################################################################
"""Ajout/Modification/Supression UE """Ajout/Modification/Supression modules
(portage from DTML) (portage from DTML)
""" """
import notesdb as ndb import notesdb as ndb
@ -55,14 +55,75 @@ Tous ces enseignants, plus le responsable du semestre, pourront
saisir et modifier les notes de ce module. saisir et modifier les notes de ce module.
</p> """ </p> """
_moduleEditor = ndb.EditableTable(
"notes_modules",
"module_id",
(
"module_id",
"titre",
"code",
"abbrev",
"heures_cours",
"heures_td",
"heures_tp",
"coefficient",
"ue_id",
"matiere_id",
"formation_id",
"semestre_id",
"numero",
"code_apogee",
"module_type"
#'ects'
),
sortkey="numero, code, titre",
output_formators={
"heures_cours": ndb.float_null_is_zero,
"heures_td": ndb.float_null_is_zero,
"heures_tp": ndb.float_null_is_zero,
"numero": ndb.int_null_is_zero,
"coefficient": ndb.float_null_is_zero,
"module_type": ndb.int_null_is_zero
#'ects' : ndb.float_null_is_null
},
)
def do_module_list(context, *args, **kw):
"list modules"
cnx = ndb.GetDBConnexion()
return _moduleEditor.list(cnx, *args, **kw)
def do_module_create(context, args, REQUEST):
"create a module"
# create
cnx = ndb.GetDBConnexion()
r = _moduleEditor.create(cnx, args)
# news
F = sco_formations.formation_list(
context, args={"formation_id": args["formation_id"]}
)[0]
sco_news.add(
context,
REQUEST,
typ=NEWS_FORM,
object=args["formation_id"],
text="Modification de la formation %(acronyme)s" % F,
)
return r
def module_create(context, matiere_id=None, REQUEST=None): def module_create(context, matiere_id=None, REQUEST=None):
"""Creation d'un module""" """Creation d'un module"""
if not matiere_id: if not matiere_id:
raise ScoValueError("invalid matiere !") raise ScoValueError("invalid matiere !")
M = context.do_matiere_list(args={"matiere_id": matiere_id})[0] M = sco_edit_matiere.do_matiere_list(context, args={"matiere_id": matiere_id})[0]
UE = context.do_ue_list(args={"ue_id": M["ue_id"]})[0] UE = sco_edit_ue.do_ue_list(context, args={"ue_id": M["ue_id"]})[0]
Fo = context.formation_list(args={"formation_id": UE["formation_id"]})[0] Fo = sco_formations.formation_list(
context, args={"formation_id": UE["formation_id"]}
)[0]
parcours = sco_codes_parcours.get_parcours_from_code(Fo["type_parcours"]) parcours = sco_codes_parcours.get_parcours_from_code(Fo["type_parcours"])
semestres_indices = range(1, parcours.NB_SEM + 1) semestres_indices = range(1, parcours.NB_SEM + 1)
H = [ H = [
@ -72,7 +133,7 @@ def module_create(context, matiere_id=None, REQUEST=None):
_MODULE_HELP, _MODULE_HELP,
] ]
# cherche le numero adequat (pour placer le module en fin de liste) # cherche le numero adequat (pour placer le module en fin de liste)
Mods = context.do_module_list(args={"matiere_id": matiere_id}) Mods = do_module_list(context, args={"matiere_id": matiere_id})
if Mods: if Mods:
default_num = max([m["numero"] for m in Mods]) + 10 default_num = max([m["numero"] for m in Mods]) + 10
else: else:
@ -172,17 +233,52 @@ def module_create(context, matiere_id=None, REQUEST=None):
if tf[0] == 0: if tf[0] == 0:
return "\n".join(H) + tf[1] + html_sco_header.sco_footer(context, REQUEST) return "\n".join(H) + tf[1] + html_sco_header.sco_footer(context, REQUEST)
else: else:
context.do_module_create(tf[2], REQUEST) do_module_create(context, tf[2], REQUEST)
return REQUEST.RESPONSE.redirect( return REQUEST.RESPONSE.redirect(
scu.NotesURL() + "/ue_list?formation_id=" + UE["formation_id"] scu.NotesURL() + "/ue_list?formation_id=" + UE["formation_id"]
) )
def do_module_delete(context, oid, REQUEST):
"delete module"
mod = do_module_list(context, {"module_id": oid})[0]
if sco_edit_module.module_is_locked(context, mod["module_id"]):
raise ScoLockedFormError()
# S'il y a des moduleimpls, on ne peut pas detruire le module !
mods = sco_moduleimpl.do_moduleimpl_list(context, module_id=oid)
if mods:
err_page = scu.confirm_dialog(
context,
message="""<h3>Destruction du module impossible car il est utilisé dans des semestres existants !</h3>""",
helpmsg="""Il faut d'abord supprimer le semestre. Mais il est peut être préférable de laisser ce programme intact et d'en créer une nouvelle version pour la modifier.""",
dest_url="ue_list",
parameters={"formation_id": mod["formation_id"]},
REQUEST=REQUEST,
)
raise ScoGenError(err_page)
# delete
cnx = ndb.GetDBConnexion()
_moduleEditor.delete(cnx, oid)
# news
F = sco_formations.formation_list(
context, args={"formation_id": mod["formation_id"]}
)[0]
sco_news.add(
context,
REQUEST,
typ=NEWS_FORM,
object=mod["formation_id"],
text="Modification de la formation %(acronyme)s" % F,
)
def module_delete(context, module_id=None, REQUEST=None): def module_delete(context, module_id=None, REQUEST=None):
"""Delete a module""" """Delete a module"""
if not module_id: if not module_id:
raise ScoValueError("invalid module !") raise ScoValueError("invalid module !")
Mods = context.do_module_list(args={"module_id": module_id}) Mods = do_module_list(context, args={"module_id": module_id})
if not Mods: if not Mods:
raise ScoValueError("Module inexistant !") raise ScoValueError("Module inexistant !")
Mod = Mods[0] Mod = Mods[0]
@ -207,13 +303,36 @@ def module_delete(context, module_id=None, REQUEST=None):
elif tf[0] == -1: elif tf[0] == -1:
return REQUEST.RESPONSE.redirect(dest_url) return REQUEST.RESPONSE.redirect(dest_url)
else: else:
context.do_module_delete(module_id, REQUEST) do_module_delete(context, module_id, REQUEST)
return REQUEST.RESPONSE.redirect(dest_url) return REQUEST.RESPONSE.redirect(dest_url)
def do_module_edit(context, val):
"edit a module"
# check
mod = do_module_list(context, {"module_id": val["module_id"]})[0]
if module_is_locked(context, mod["module_id"]):
# formation verrouillée: empeche de modifier certains champs:
protected_fields = ("coefficient", "ue_id", "matiere_id", "semestre_id")
for f in protected_fields:
if f in val:
del val[f]
# edit
cnx = ndb.GetDBConnexion()
_moduleEditor.edit(cnx, val)
sems = sco_formsemestre.do_formsemestre_list(
context, args={"formation_id": mod["formation_id"]}
)
if sems:
sco_core.inval_cache(
context, formsemestre_id_list=[s["formsemestre_id"] for s in sems]
) # > modif module
def check_module_code_unicity(code, field, formation_id, context, module_id=None): def check_module_code_unicity(code, field, formation_id, context, module_id=None):
"true si code module unique dans la formation" "true si code module unique dans la formation"
Mods = context.do_module_list(args={"code": code, "formation_id": formation_id}) Mods = do_module_list(context, args={"code": code, "formation_id": formation_id})
if module_id: # edition: supprime le module en cours if module_id: # edition: supprime le module en cours
Mods = [m for m in Mods if m["module_id"] != module_id] Mods = [m for m in Mods if m["module_id"] != module_id]
@ -224,12 +343,14 @@ def module_edit(context, module_id=None, REQUEST=None):
"""Edit a module""" """Edit a module"""
if not module_id: if not module_id:
raise ScoValueError("invalid module !") raise ScoValueError("invalid module !")
Mod = context.do_module_list(args={"module_id": module_id}) Mod = do_module_list(context, args={"module_id": module_id})
if not Mod: if not Mod:
raise ScoValueError("invalid module !") raise ScoValueError("invalid module !")
Mod = Mod[0] Mod = Mod[0]
unlocked = not module_is_locked(context, module_id) unlocked = not module_is_locked(context, module_id)
Fo = context.formation_list(args={"formation_id": Mod["formation_id"]})[0] Fo = sco_formations.formation_list(
context, args={"formation_id": Mod["formation_id"]}
)[0]
parcours = sco_codes_parcours.get_parcours_from_code(Fo["type_parcours"]) parcours = sco_codes_parcours.get_parcours_from_code(Fo["type_parcours"])
M = ndb.SimpleDictFetch( M = ndb.SimpleDictFetch(
context, context,
@ -386,7 +507,7 @@ def module_edit(context, module_id=None, REQUEST=None):
tf[2]["ue_id"], tf[2]["matiere_id"] = tf[2]["ue_matiere_id"].split("!") tf[2]["ue_id"], tf[2]["matiere_id"] = tf[2]["ue_matiere_id"].split("!")
# Check unicité code module dans la formation # Check unicité code module dans la formation
context.do_module_edit(tf[2]) do_module_edit(context, tf[2])
return REQUEST.RESPONSE.redirect(dest_url) return REQUEST.RESPONSE.redirect(dest_url)
@ -397,11 +518,11 @@ def edit_module_set_code_apogee(context, id=None, value=None, REQUEST=None):
value = value.strip("-_ \t") value = value.strip("-_ \t")
log("edit_module_set_code_apogee: module_id=%s code_apogee=%s" % (module_id, value)) log("edit_module_set_code_apogee: module_id=%s code_apogee=%s" % (module_id, value))
modules = context.do_module_list(args={"module_id": module_id}) modules = do_module_list(context, args={"module_id": module_id})
if not modules: if not modules:
return "module invalide" # shoud not occur return "module invalide" # shoud not occur
context.do_module_edit({"module_id": module_id, "code_apogee": value}) do_module_edit(context, {"module_id": module_id, "code_apogee": value})
if not value: if not value:
value = scu.APO_MISSING_CODE_STR value = scu.APO_MISSING_CODE_STR
return value return value
@ -413,7 +534,7 @@ def module_list(context, formation_id, REQUEST=None):
""" """
if not formation_id: if not formation_id:
raise ScoValueError("invalid formation !") raise ScoValueError("invalid formation !")
F = context.formation_list(args={"formation_id": formation_id})[0] F = sco_formations.formation_list(context, args={"formation_id": formation_id})[0]
H = [ H = [
html_sco_header.sco_header( html_sco_header.sco_header(
context, REQUEST, page_title="Liste des modules de %(titre)s" % F context, REQUEST, page_title="Liste des modules de %(titre)s" % F
@ -424,7 +545,7 @@ def module_list(context, formation_id, REQUEST=None):
] ]
editable = REQUEST.AUTHENTICATED_USER.has_permission(Permission.ScoChangeFormation) editable = REQUEST.AUTHENTICATED_USER.has_permission(Permission.ScoChangeFormation)
for Mod in context.do_module_list(args={"formation_id": formation_id}): for Mod in do_module_list(context, args={"formation_id": formation_id}):
H.append('<li class="notes_module_list">%s' % Mod) H.append('<li class="notes_module_list">%s' % Mod)
if editable: if editable:
H.append('<a href="module_edit?module_id=%(module_id)s">modifier</a>' % Mod) H.append('<a href="module_edit?module_id=%(module_id)s">modifier</a>' % Mod)
@ -460,14 +581,14 @@ def module_count_moduleimpls(context, module_id):
def formation_add_malus_modules(context, formation_id, titre=None, REQUEST=None): def formation_add_malus_modules(context, formation_id, titre=None, REQUEST=None):
"""Création d'un module de "malus" dans chaque UE d'une formation""" """Création d'un module de "malus" dans chaque UE d'une formation"""
ue_list = context.do_ue_list(args={"formation_id": formation_id}) ue_list = sco_edit_ue.do_ue_list(context, args={"formation_id": formation_id})
for ue in ue_list: for ue in ue_list:
# Un seul module de malus par UE: # Un seul module de malus par UE:
nb_mod_malus = len( nb_mod_malus = len(
[ [
mod mod
for mod in context.do_module_list(args={"ue_id": ue["ue_id"]}) for mod in do_module_list(context, args={"ue_id": ue["ue_id"]})
if mod["module_type"] == scu.MODULE_MALUS if mod["module_type"] == scu.MODULE_MALUS
] ]
) )
@ -480,7 +601,7 @@ def formation_add_malus_modules(context, formation_id, titre=None, REQUEST=None)
def ue_add_malus_module(context, ue_id, titre=None, code=None, REQUEST=None): def ue_add_malus_module(context, ue_id, titre=None, code=None, REQUEST=None):
"""Add a malus module in this ue""" """Add a malus module in this ue"""
ue = context.do_ue_list(args={"ue_id": ue_id})[0] ue = sco_edit_ue.do_ue_list(context, args={"ue_id": ue_id})[0]
if titre is None: if titre is None:
titre = "" titre = ""
@ -499,13 +620,14 @@ def ue_add_malus_module(context, ue_id, titre=None, code=None, REQUEST=None):
) )
# Matiere pour placer le module malus # Matiere pour placer le module malus
Matlist = context.do_matiere_list(args={"ue_id": ue_id}) Matlist = sco_edit_matiere.do_matiere_list(context, args={"ue_id": ue_id})
numero = max([mat["numero"] for mat in Matlist]) + 10 numero = max([mat["numero"] for mat in Matlist]) + 10
matiere_id = context.do_matiere_create( matiere_id = sco_edit_matiere.do_matiere_create(
{"ue_id": ue_id, "titre": "Malus", "numero": numero}, REQUEST context, {"ue_id": ue_id, "titre": "Malus", "numero": numero}, REQUEST
) )
module_id = context.do_module_create( module_id = do_module_create(
context,
{ {
"titre": titre, "titre": titre,
"code": code, "code": code,

View File

@ -25,7 +25,7 @@
# #
############################################################################## ##############################################################################
"""Ajout/Modification/Supression UE """Ajout/Modification/Suppression UE
""" """
import notesdb as ndb import notesdb as ndb
@ -41,6 +41,135 @@ import sco_tag_module
from sco_permissions import ScoChangeFormation, ScoEditFormationTags, ScoImplement from sco_permissions import ScoChangeFormation, ScoEditFormationTags, ScoImplement
from sco_exceptions import ScoValueError, ScoLockedFormError from sco_exceptions import ScoValueError, ScoLockedFormError
_ueEditor = ndb.EditableTable(
"notes_ue",
"ue_id",
(
"ue_id",
"formation_id",
"acronyme",
"numero",
"titre",
"type",
"ue_code",
"ects",
"is_external",
"code_apogee",
"coefficient",
),
sortkey="numero",
input_formators={"type": ndb.int_null_is_zero},
output_formators={
"numero": ndb.int_null_is_zero,
"ects": ndb.float_null_is_null,
"coefficient": ndb.float_null_is_zero,
},
)
def do_ue_list(context, *args, **kw):
"list UEs"
cnx = ndb.GetDBConnexion()
return _ueEditor.list(cnx, *args, **kw)
def do_ue_create(context, args, REQUEST):
"create an ue"
cnx = ndb.GetDBConnexion()
# check duplicates
ues = do_ue_list(context,
{"formation_id": args["formation_id"], "acronyme": args["acronyme"]}
)
if ues:
raise ScoValueError('Acronyme d\'UE "%s" déjà utilisé !' % args["acronyme"])
# create
r = context._ueEditor.create(cnx, args)
# news
F = sco_formations.formation_list(
context, args={"formation_id": args["formation_id"]}
)[0]
sco_news.add(
context,
REQUEST,
typ=NEWS_FORM,
object=args["formation_id"],
text="Modification de la formation %(acronyme)s" % F,
)
return r
def do_ue_delete(context, ue_id, delete_validations=False, REQUEST=None, force=False):
"delete UE and attached matieres (but not modules (it should ?))"
cnx = ndb.GetDBConnexion()
log("do_ue_delete: ue_id=%s, delete_validations=%s" % (ue_id, delete_validations))
# check
ue = do_ue_list(context, {"ue_id": ue_id})
if not ue:
raise ScoValueError("UE inexistante !")
ue = ue[0]
if sco_edit_ue.ue_is_locked(context, ue["ue_id"]):
raise ScoLockedFormError()
# Il y a-t-il des etudiants ayant validé cette UE ?
# si oui, propose de supprimer les validations
validations = sco_parcours_dut.scolar_formsemestre_validation_list(
cnx, args={"ue_id": ue_id}
)
if validations and not delete_validations and not force:
return scu.confirm_dialog(
context,
"<p>%d étudiants ont validé l'UE %s (%s)</p><p>Si vous supprimez cette UE, ces validations vont être supprimées !</p>"
% (len(validations), ue["acronyme"], ue["titre"]),
dest_url="",
REQUEST=REQUEST,
target_variable="delete_validations",
cancel_url="ue_list?formation_id=%s" % ue["formation_id"],
parameters={"ue_id": ue_id, "dialog_confirmed": 1},
)
if delete_validations:
log("deleting all validations of UE %s" % ue_id)
ndb.SimpleQuery(
context,
"DELETE FROM scolar_formsemestre_validation WHERE ue_id=%(ue_id)s",
{"ue_id": ue_id},
)
# delete all matiere in this UE
mats = sco_edit_matiere.do_matiere_list(context, {"ue_id": ue_id})
for mat in mats:
sco_edit_matiere.do_matiere_delete(context, mat["matiere_id"], REQUEST)
# delete uecoef and events
ndb.SimpleQuery(
context,
"DELETE FROM notes_formsemestre_uecoef WHERE ue_id=%(ue_id)s",
{"ue_id": ue_id},
)
ndb.SimpleQuery(
context, "DELETE FROM scolar_events WHERE ue_id=%(ue_id)s", {"ue_id": ue_id}
)
cnx = ndb.GetDBConnexion()
context._ueEditor.delete(cnx, ue_id)
# > UE delete + supr. validations associées etudiants (cas compliqué, mais rarement utilisé: acceptable de tout invalider ?):
sco_core.inval_cache(context)
# news
F = sco_formations.formation_list(
context, args={"formation_id": ue["formation_id"]}
)[0]
sco_news.add(
context,
REQUEST,
typ=NEWS_FORM,
object=ue["formation_id"],
text="Modification de la formation %(acronyme)s" % F,
)
#
if not force:
return REQUEST.RESPONSE.redirect(
scu.NotesURL() + "/ue_list?formation_id=" + str(ue["formation_id"])
)
else:
return None
def ue_create(context, formation_id=None, REQUEST=None): def ue_create(context, formation_id=None, REQUEST=None):
"""Creation d'une UE""" """Creation d'une UE"""
@ -51,7 +180,7 @@ def ue_edit(context, ue_id=None, create=False, formation_id=None, REQUEST=None):
"""Modification ou creation d'une UE""" """Modification ou creation d'une UE"""
create = int(create) create = int(create)
if not create: if not create:
U = context.do_ue_list(args={"ue_id": ue_id}) U = do_ue_list(context, args={"ue_id": ue_id})
if not U: if not U:
raise ScoValueError("UE inexistante !") raise ScoValueError("UE inexistante !")
U = U[0] U = U[0]
@ -63,7 +192,7 @@ def ue_edit(context, ue_id=None, create=False, formation_id=None, REQUEST=None):
title = "Création d'une UE" title = "Création d'une UE"
initvalues = {} initvalues = {}
submitlabel = "Créer cette UE" submitlabel = "Créer cette UE"
Fol = context.formation_list(args={"formation_id": formation_id}) Fol = sco_formations.formation_list(context, args={"formation_id": formation_id})
if not Fol: if not Fol:
raise ScoValueError( raise ScoValueError(
"Formation %s inexistante ! (si vous avez suivi un lien valide, merci de signaler le problème)" "Formation %s inexistante ! (si vous avez suivi un lien valide, merci de signaler le problème)"
@ -201,14 +330,14 @@ def ue_edit(context, ue_id=None, create=False, formation_id=None, REQUEST=None):
context, formation_id, int(tf[2]["semestre_id"] or 0) context, formation_id, int(tf[2]["semestre_id"] or 0)
) )
ue_id = context.do_ue_create(tf[2], REQUEST) ue_id = do_ue_create(context, tf[2], REQUEST)
if parcours.UE_IS_MODULE or tf[2]["create_matiere"]: if parcours.UE_IS_MODULE or tf[2]["create_matiere"]:
matiere_id = context.do_matiere_create( matiere_id = sco_edit_matiere.do_matiere_create(context,
{"ue_id": ue_id, "titre": tf[2]["titre"], "numero": 1}, REQUEST {"ue_id": ue_id, "titre": tf[2]["titre"], "numero": 1}, REQUEST
) )
if parcours.UE_IS_MODULE: if parcours.UE_IS_MODULE:
# dans ce mode, crée un (unique) module dans l'UE: # dans ce mode, crée un (unique) module dans l'UE:
_ = context.do_module_create( _ = sco_edit_module.do_module_create(context,
{ {
"titre": tf[2]["titre"], "titre": tf[2]["titre"],
"code": tf[2]["acronyme"], "code": tf[2]["acronyme"],
@ -233,7 +362,7 @@ def _add_ue_semestre_id(context, ue_list):
qui les place à la fin de la liste. qui les place à la fin de la liste.
""" """
for ue in ue_list: for ue in ue_list:
Modlist = context.do_module_list(args={"ue_id": ue["ue_id"]}) Modlist = sco_edit_module.do_module_list(context, args={"ue_id": ue["ue_id"]})
if Modlist: if Modlist:
ue["semestre_id"] = Modlist[0]["semestre_id"] ue["semestre_id"] = Modlist[0]["semestre_id"]
else: else:
@ -244,7 +373,7 @@ def next_ue_numero(context, formation_id, semestre_id=None):
"""Numero d'une nouvelle UE dans cette formation. """Numero d'une nouvelle UE dans cette formation.
Si le semestre est specifie, cherche les UE ayant des modules de ce semestre Si le semestre est specifie, cherche les UE ayant des modules de ce semestre
""" """
ue_list = context.do_ue_list(args={"formation_id": formation_id}) ue_list = do_ue_list(context, args={"formation_id": formation_id})
if not ue_list: if not ue_list:
return 0 return 0
if semestre_id is None: if semestre_id is None:
@ -263,7 +392,7 @@ def ue_delete(
context, ue_id=None, delete_validations=False, dialog_confirmed=False, REQUEST=None context, ue_id=None, delete_validations=False, dialog_confirmed=False, REQUEST=None
): ):
"""Delete an UE""" """Delete an UE"""
ue = context.do_ue_list(args={"ue_id": ue_id}) ue = do_ue_list(context, args={"ue_id": ue_id})
if not ue: if not ue:
raise ScoValueError("UE inexistante !") raise ScoValueError("UE inexistante !")
ue = ue[0] ue = ue[0]
@ -278,8 +407,8 @@ def ue_delete(
cancel_url="ue_list?formation_id=%s" % ue["formation_id"], cancel_url="ue_list?formation_id=%s" % ue["formation_id"],
) )
return context._do_ue_delete( return do_ue_delete(
ue_id, delete_validations=delete_validations, REQUEST=REQUEST context, ue_id, delete_validations=delete_validations, REQUEST=REQUEST
) )
@ -289,14 +418,14 @@ def ue_list(context, formation_id=None, msg="", REQUEST=None):
""" """
authuser = REQUEST.AUTHENTICATED_USER authuser = REQUEST.AUTHENTICATED_USER
F = context.formation_list(args={"formation_id": formation_id}) F = sco_formations.formation_list(context, args={"formation_id": formation_id})
if not F: if not F:
raise ScoValueError("invalid formation_id") raise ScoValueError("invalid formation_id")
F = F[0] F = F[0]
parcours = sco_codes_parcours.get_parcours_from_code(F["type_parcours"]) parcours = sco_codes_parcours.get_parcours_from_code(F["type_parcours"])
locked = context.formation_has_locked_sems(formation_id) locked = sco_formations.formation_has_locked_sems(context, formation_id)
ue_list = context.do_ue_list(args={"formation_id": formation_id}) ue_list = do_ue_list(context, args={"formation_id": formation_id})
# tri par semestre et numero: # tri par semestre et numero:
_add_ue_semestre_id(context, ue_list) _add_ue_semestre_id(context, ue_list)
ue_list.sort(key=lambda u: (u["semestre_id"], u["numero"])) ue_list.sort(key=lambda u: (u["semestre_id"], u["numero"]))
@ -478,7 +607,7 @@ Si vous souhaitez modifier cette formation (par exemple pour y ajouter un module
H.append('<span class="locked">[verrouillé]</span>') H.append('<span class="locked">[verrouillé]</span>')
if not parcours.UE_IS_MODULE: if not parcours.UE_IS_MODULE:
H.append('<ul class="notes_matiere_list">') H.append('<ul class="notes_matiere_list">')
Matlist = context.do_matiere_list(args={"ue_id": UE["ue_id"]}) Matlist = sco_edit_matiere.do_matiere_list(context, args={"ue_id": UE["ue_id"]})
for Mat in Matlist: for Mat in Matlist:
if not parcours.UE_IS_MODULE: if not parcours.UE_IS_MODULE:
H.append('<li class="notes_matiere_list">') H.append('<li class="notes_matiere_list">')
@ -496,7 +625,7 @@ Si vous souhaitez modifier cette formation (par exemple pour y ajouter un module
H.append("</a>") H.append("</a>")
H.append('<ul class="notes_module_list">') H.append('<ul class="notes_module_list">')
Modlist = context.do_module_list(args={"matiere_id": Mat["matiere_id"]}) Modlist = sco_edit_module.do_module_list(context, args={"matiere_id": Mat["matiere_id"]})
im = 0 im = 0
for Mod in Modlist: for Mod in Modlist:
Mod["nb_moduleimpls"] = sco_edit_module.module_count_moduleimpls( Mod["nb_moduleimpls"] = sco_edit_module.module_count_moduleimpls(
@ -683,19 +812,23 @@ def ue_sharing_code(context, ue_code=None, ue_id=None, hide_ue_id=None):
Either ue_code or ue_id may be specified. Either ue_code or ue_id may be specified.
""" """
if ue_id: if ue_id:
ue = context.do_ue_list(args={"ue_id": ue_id})[0] ue = do_ue_list(context, args={"ue_id": ue_id})[0]
if not ue_code: if not ue_code:
ue_code = ue["ue_code"] ue_code = ue["ue_code"]
F = context.formation_list(args={"formation_id": ue["formation_id"]})[0] F = sco_formations.formation_list(
context, args={"formation_id": ue["formation_id"]}
)[0]
formation_code = F["formation_code"] formation_code = F["formation_code"]
ue_list_all = context.do_ue_list(args={"ue_code": ue_code}) ue_list_all = do_ue_list(context, args={"ue_code": ue_code})
if ue_id: if ue_id:
# retire les UE d'autres formations: # retire les UE d'autres formations:
# log('checking ucode %s formation %s' % (ue_code, formation_code)) # log('checking ucode %s formation %s' % (ue_code, formation_code))
ue_list = [] ue_list = []
for ue in ue_list_all: for ue in ue_list_all:
F = context.formation_list(args={"formation_id": ue["formation_id"]})[0] F = sco_formations.formation_list(
context, args={"formation_id": ue["formation_id"]}
)[0]
if formation_code == F["formation_code"]: if formation_code == F["formation_code"]:
ue_list.append(ue) ue_list.append(ue)
else: else:
@ -716,7 +849,9 @@ def ue_sharing_code(context, ue_code=None, ue_id=None, hide_ue_id=None):
H.append('<span class="ue_share">UE avec le code %s:</span>' % ue_code) H.append('<span class="ue_share">UE avec le code %s:</span>' % ue_code)
H.append("<ul>") H.append("<ul>")
for ue in ue_list: for ue in ue_list:
F = context.formation_list(args={"formation_id": ue["formation_id"]})[0] F = sco_formations.formation_list(
context, args={"formation_id": ue["formation_id"]}
)[0]
H.append( H.append(
'<li>%s (%s) dans <a class="stdlink" href="ue_list?formation_id=%s">%s (%s)</a>, version %s</li>' '<li>%s (%s) dans <a class="stdlink" href="ue_list?formation_id=%s">%s (%s)</a>, version %s</li>'
% ( % (
@ -736,13 +871,13 @@ def do_ue_edit(context, args, bypass_lock=False, dont_invalidate_cache=False):
"edit an UE" "edit an UE"
# check # check
ue_id = args["ue_id"] ue_id = args["ue_id"]
ue = context.do_ue_list({"ue_id": ue_id})[0] ue = do_ue_list(context, {"ue_id": ue_id})[0]
if (not bypass_lock) and ue_is_locked(context, ue["ue_id"]): if (not bypass_lock) and ue_is_locked(context, ue["ue_id"]):
raise ScoLockedFormError() raise ScoLockedFormError()
# check: acronyme unique dans cette formation # check: acronyme unique dans cette formation
if args.has_key("acronyme"): if args.has_key("acronyme"):
new_acro = args["acronyme"] new_acro = args["acronyme"]
ues = context.do_ue_list( ues = do_ue_list(context,
{"formation_id": ue["formation_id"], "acronyme": new_acro} {"formation_id": ue["formation_id"], "acronyme": new_acro}
) )
if ues and ues[0]["ue_id"] != ue_id: if ues and ues[0]["ue_id"] != ue_id:
@ -772,7 +907,7 @@ def edit_ue_set_code_apogee(context, id=None, value=None, REQUEST=None):
value = value.strip("-_ \t") value = value.strip("-_ \t")
log("edit_ue_set_code_apogee: ue_id=%s code_apogee=%s" % (ue_id, value)) log("edit_ue_set_code_apogee: ue_id=%s code_apogee=%s" % (ue_id, value))
ues = context.do_ue_list(args={"ue_id": ue_id}) ues = do_ue_list(context, args={"ue_id": ue_id})
if not ues: if not ues:
return "ue invalide" return "ue invalide"
@ -806,16 +941,16 @@ def ue_is_locked(context, ue_id):
# ---- Table recap formation # ---- Table recap formation
def formation_table_recap(context, formation_id, format="html", REQUEST=None): def formation_table_recap(context, formation_id, format="html", REQUEST=None):
"""Table recapitulant formation.""" """Table recapitulant formation."""
F = context.formation_list(args={"formation_id": formation_id}) F = sco_formations.formation_list(context, args={"formation_id": formation_id})
if not F: if not F:
raise ScoValueError("invalid formation_id") raise ScoValueError("invalid formation_id")
F = F[0] F = F[0]
T = [] T = []
ue_list = context.do_ue_list(args={"formation_id": formation_id}) ue_list = do_ue_list(context, args={"formation_id": formation_id})
for UE in ue_list: for UE in ue_list:
Matlist = context.do_matiere_list(args={"ue_id": UE["ue_id"]}) Matlist = sco_edit_matiere.do_matiere_list(context, args={"ue_id": UE["ue_id"]})
for Mat in Matlist: for Mat in Matlist:
Modlist = context.do_module_list(args={"matiere_id": Mat["matiere_id"]}) Modlist = sco_edit_module.do_module_list(context, args={"matiere_id": Mat["matiere_id"]})
for Mod in Modlist: for Mod in Modlist:
Mod["nb_moduleimpls"] = sco_edit_module.module_count_moduleimpls( Mod["nb_moduleimpls"] = sco_edit_module.module_count_moduleimpls(
context, Mod["module_id"] context, Mod["module_id"]
@ -894,5 +1029,5 @@ def ue_list_semestre_ids(context, ue):
Mais cela n'a pas toujours été le cas dans les programmes pédagogiques officiels, Mais cela n'a pas toujours été le cas dans les programmes pédagogiques officiels,
aussi ScoDoc laisse le choix. aussi ScoDoc laisse le choix.
""" """
Modlist = context.do_module_list(args={"ue_id": ue["ue_id"]}) Modlist = sco_edit_module.do_module_list(context, args={"ue_id": ue["ue_id"]})
return sorted(list(set([mod["semestre_id"] for mod in Modlist]))) return sorted(list(set([mod["semestre_id"] for mod in Modlist])))

View File

@ -342,7 +342,7 @@ def apo_semset_maq_status(
if missing: if missing:
formation_ids = {sem["formation_id"] for sem in semset.sems} formation_ids = {sem["formation_id"] for sem in semset.sems}
formations = [context.formation_list(formation_id=i)[0] for i in formation_ids] formations = [sco_formations.formation_list(context, formation_id=i)[0] for i in formation_ids]
# log('formations=%s' % formations) # log('formations=%s' % formations)
H.append( H.append(
'<div class="apo_csv_status_missing_elems"><span class="fontred">Elements Apogée absents dans ScoDoc: </span><span class="apo_elems fontred">%s</span>' '<div class="apo_csv_status_missing_elems"><span class="fontred">Elements Apogée absents dans ScoDoc: </span><span class="apo_elems fontred">%s</span>'

View File

@ -107,7 +107,7 @@ def do_evaluation_delete(context, REQUEST, evaluation_id):
M = sco_moduleimpl.do_moduleimpl_list(context, moduleimpl_id=moduleimpl_id)[0] M = sco_moduleimpl.do_moduleimpl_list(context, moduleimpl_id=moduleimpl_id)[0]
sco_core.inval_cache(context, formsemestre_id=M["formsemestre_id"]) # > eval delete sco_core.inval_cache(context, formsemestre_id=M["formsemestre_id"]) # > eval delete
# news # news
mod = context.do_module_list(args={"module_id": M["module_id"]})[0] mod = sco_edit_module.do_module_list(context, args={"module_id": M["module_id"]})[0]
mod["moduleimpl_id"] = M["moduleimpl_id"] mod["moduleimpl_id"] = M["moduleimpl_id"]
mod["url"] = ( mod["url"] = (
scu.NotesURL() + "/moduleimpl_status?moduleimpl_id=%(moduleimpl_id)s" % mod scu.NotesURL() + "/moduleimpl_status?moduleimpl_id=%(moduleimpl_id)s" % mod
@ -166,7 +166,7 @@ def do_evaluation_etat(
# ---- Liste des groupes complets et incomplets # ---- Liste des groupes complets et incomplets
E = context.do_evaluation_list(args={"evaluation_id": evaluation_id})[0] E = context.do_evaluation_list(args={"evaluation_id": evaluation_id})[0]
M = sco_moduleimpl.do_moduleimpl_list(context, moduleimpl_id=E["moduleimpl_id"])[0] M = sco_moduleimpl.do_moduleimpl_list(context, moduleimpl_id=E["moduleimpl_id"])[0]
Mod = context.do_module_list(args={"module_id": M["module_id"]})[0] Mod = sco_edit_module.do_module_list(context, args={"module_id": M["module_id"]})[0]
is_malus = Mod["module_type"] == scu.MODULE_MALUS # True si module de malus is_malus = Mod["module_type"] == scu.MODULE_MALUS # True si module de malus
formsemestre_id = M["formsemestre_id"] formsemestre_id = M["formsemestre_id"]
# Si partition_id is None, prend 'all' ou bien la premiere: # Si partition_id is None, prend 'all' ou bien la premiere:
@ -576,7 +576,7 @@ def formsemestre_evaluations_delai_correction(
M = sco_moduleimpl.do_moduleimpl_list( M = sco_moduleimpl.do_moduleimpl_list(
context, moduleimpl_id=e["moduleimpl_id"] context, moduleimpl_id=e["moduleimpl_id"]
)[0] )[0]
Mod = context.do_module_list(args={"module_id": M["module_id"]})[0] Mod = sco_edit_module.do_module_list(context, args={"module_id": M["module_id"]})[0]
if (e["evaluation_type"] != scu.EVALUATION_NORMALE) or ( if (e["evaluation_type"] != scu.EVALUATION_NORMALE) or (
Mod["module_type"] == scu.MODULE_MALUS Mod["module_type"] == scu.MODULE_MALUS
): ):
@ -742,7 +742,7 @@ def evaluation_describe(context, evaluation_id="", edit_in_place=True, REQUEST=N
E = context.do_evaluation_list({"evaluation_id": evaluation_id})[0] E = context.do_evaluation_list({"evaluation_id": evaluation_id})[0]
moduleimpl_id = E["moduleimpl_id"] moduleimpl_id = E["moduleimpl_id"]
M = sco_moduleimpl.do_moduleimpl_list(context, moduleimpl_id=moduleimpl_id)[0] M = sco_moduleimpl.do_moduleimpl_list(context, moduleimpl_id=moduleimpl_id)[0]
Mod = context.do_module_list(args={"module_id": M["module_id"]})[0] Mod = sco_edit_module.do_module_list(context, args={"module_id": M["module_id"]})[0]
formsemestre_id = M["formsemestre_id"] formsemestre_id = M["formsemestre_id"]
u = context.Users.user_info(M["responsable_id"]) u = context.Users.user_info(M["responsable_id"])
resp = u["prenomnom"] resp = u["prenomnom"]
@ -771,7 +771,7 @@ def evaluation_describe(context, evaluation_id="", edit_in_place=True, REQUEST=N
] ]
if Mod["module_type"] == scu.MODULE_MALUS: if Mod["module_type"] == scu.MODULE_MALUS:
# Indique l'UE # Indique l'UE
ue = context.do_ue_list(args={"ue_id": Mod["ue_id"]})[0] ue = sco_edit_ue.do_ue_list(context, args={"ue_id": Mod["ue_id"]})[0]
H.append("<p><b>UE : %(acronyme)s</b></p>" % ue) H.append("<p><b>UE : %(acronyme)s</b></p>" % ue)
# store min/max values used by JS client-side checks: # store min/max values used by JS client-side checks:
H.append( H.append(
@ -880,7 +880,7 @@ def evaluation_create_form(
else: else:
min_note_max_str = "0" min_note_max_str = "0"
# #
Mod = context.do_module_list(args={"module_id": M["module_id"]})[0] Mod = sco_edit_module.do_module_list(context, args={"module_id": M["module_id"]})[0]
# #
help = """<div class="help"><p class="help"> help = """<div class="help"><p class="help">
Le coefficient d'une évaluation n'est utilisé que pour pondérer les évaluations au sein d'un module. Le coefficient d'une évaluation n'est utilisé que pour pondérer les évaluations au sein d'un module.

View File

@ -62,7 +62,7 @@ def _build_results_table(context, start_date=None, end_date=None, types_parcours
semlist = [dpv["formsemestre"] for dpv in dpv_by_sem.values() if dpv] semlist = [dpv["formsemestre"] for dpv in dpv_by_sem.values() if dpv]
semlist_parcours = [] semlist_parcours = []
for sem in semlist: for sem in semlist:
sem["formation"] = context.formation_list( sem["formation"] = sco_formations.formation_list(context,
args={"formation_id": sem["formation_id"]} args={"formation_id": sem["formation_id"]}
)[0] )[0]
sem["parcours"] = sco_codes_parcours.get_parcours_from_code( sem["parcours"] = sco_codes_parcours.get_parcours_from_code(

View File

@ -61,14 +61,37 @@ _formationEditor = ndb.EditableTable(
) )
def formation_list(context, formation_id=None, args={}):
"""List formation(s) with given id, or matching args
(when args is given, formation_id is ignored).
"""
if not args:
if formation_id is None:
args = {}
else:
args = {"formation_id": formation_id}
cnx = ndb.GetDBConnexion()
r = _formationEditor.list(cnx, args=args)
# log('%d formations found' % len(r))
return r
def formation_has_locked_sems(context, formation_id):
"True if there is a locked formsemestre in this formation"
sems = sco_formsemestre.do_formsemestre_list(
context, args={"formation_id": formation_id, "etat": "0"}
)
return sems
def formation_export( def formation_export(
context, formation_id, export_ids=False, export_tags=True, format=None, REQUEST=None context, formation_id, export_ids=False, export_tags=True, format=None, REQUEST=None
): ):
"""Get a formation, with UE, matieres, modules """Get a formation, with UE, matieres, modules
in desired format in desired format
""" """
F = context.formation_list(args={"formation_id": formation_id})[0] F = formation_list(context, args={"formation_id": formation_id})[0]
ues = context.do_ue_list({"formation_id": formation_id}) ues = sco_edit_ue.do_ue_list(context, {"formation_id": formation_id})
F["ue"] = ues F["ue"] = ues
for ue in ues: for ue in ues:
ue_id = ue["ue_id"] ue_id = ue["ue_id"]
@ -77,14 +100,14 @@ def formation_export(
del ue["formation_id"] del ue["formation_id"]
if ue["ects"] is None: if ue["ects"] is None:
del ue["ects"] del ue["ects"]
mats = context.do_matiere_list({"ue_id": ue_id}) mats = sco_edit_matiere.do_matiere_list(context, {"ue_id": ue_id})
ue["matiere"] = mats ue["matiere"] = mats
for mat in mats: for mat in mats:
matiere_id = mat["matiere_id"] matiere_id = mat["matiere_id"]
if not export_ids: if not export_ids:
del mat["matiere_id"] del mat["matiere_id"]
del mat["ue_id"] del mat["ue_id"]
mods = context.do_module_list({"matiere_id": matiere_id}) mods = sco_edit_module.do_module_list(context, {"matiere_id": matiere_id})
mat["module"] = mods mat["module"] = mods
for mod in mods: for mod in mods:
if export_tags: if export_tags:
@ -188,14 +211,14 @@ def formation_import_xml(
del ue_info[1]["ue_id"] del ue_info[1]["ue_id"]
else: else:
xml_ue_id = None xml_ue_id = None
ue_id = context.do_ue_create(ue_info[1], REQUEST) ue_id = sco_edit_ue.do_ue_create(context, ue_info[1], REQUEST)
if xml_ue_id: if xml_ue_id:
ues_old2new[xml_ue_id] = ue_id ues_old2new[xml_ue_id] = ue_id
# -- create matieres # -- create matieres
for mat_info in ue_info[2]: for mat_info in ue_info[2]:
assert mat_info[0] == "matiere" assert mat_info[0] == "matiere"
mat_info[1]["ue_id"] = ue_id mat_info[1]["ue_id"] = ue_id
mat_id = context.do_matiere_create(mat_info[1], REQUEST) mat_id = sco_edit_matiere.do_matiere_create(context, mat_info[1], REQUEST)
# -- create modules # -- create modules
for mod_info in mat_info[2]: for mod_info in mat_info[2]:
assert mod_info[0] == "module" assert mod_info[0] == "module"
@ -207,7 +230,7 @@ def formation_import_xml(
mod_info[1]["formation_id"] = formation_id mod_info[1]["formation_id"] = formation_id
mod_info[1]["matiere_id"] = mat_id mod_info[1]["matiere_id"] = mat_id
mod_info[1]["ue_id"] = ue_id mod_info[1]["ue_id"] = ue_id
mod_id = context.do_module_create(mod_info[1], REQUEST) mod_id = sco_edit_module.do_module_create(context, mod_info[1], REQUEST)
if xml_module_id: if xml_module_id:
modules_old2new[xml_module_id] = mod_id modules_old2new[xml_module_id] = mod_id
if import_tags: if import_tags:
@ -223,7 +246,7 @@ def formation_list_table(context, formation_id=None, args={}, REQUEST=None):
and listing associated semestres and listing associated semestres
returns a table returns a table
""" """
formations = context.formation_list(formation_id=formation_id, args=args) formations = formation_list(context, formation_id=formation_id, args=args)
title = "Programmes pédagogiques" title = "Programmes pédagogiques"
lockicon = scu.icontag( lockicon = scu.icontag(
"lock32_img", title="Comporte des semestres verrouillés", border="0" "lock32_img", title="Comporte des semestres verrouillés", border="0"
@ -269,7 +292,7 @@ def formation_list_table(context, formation_id=None, args={}, REQUEST=None):
else: else:
f["date_fin_dernier_sem"] = "" f["date_fin_dernier_sem"] = ""
f["annee_dernier_sem"] = "" f["annee_dernier_sem"] = ""
locked = context.formation_has_locked_sems(f["formation_id"]) locked = formation_has_locked_sems(context, f["formation_id"])
# #
if locked: if locked:
but_locked = lockicon but_locked = lockicon

View File

@ -140,7 +140,7 @@ def do_formsemestre_createwithmodules(context, REQUEST=None, edit=False):
allowed_user_names = login2display.values() + [""] allowed_user_names = login2display.values() + [""]
# #
formation_id = REQUEST.form["formation_id"] formation_id = REQUEST.form["formation_id"]
F = context.formation_list(args={"formation_id": formation_id}) F = sco_formations.formation_list(context, args={"formation_id": formation_id})
if not F: if not F:
raise ScoValueError("Formation inexistante !") raise ScoValueError("Formation inexistante !")
F = F[0] F = F[0]
@ -193,11 +193,11 @@ def do_formsemestre_createwithmodules(context, REQUEST=None, edit=False):
# on pourrait faire un simple module_list( ) # on pourrait faire un simple module_list( )
# mais si on veut l'ordre du PPN (groupe par UE et matieres) il faut: # mais si on veut l'ordre du PPN (groupe par UE et matieres) il faut:
mods = [] # liste de dicts mods = [] # liste de dicts
uelist = context.do_ue_list({"formation_id": formation_id}) uelist = sco_edit_ue.do_ue_list(context, {"formation_id": formation_id})
for ue in uelist: for ue in uelist:
matlist = context.do_matiere_list({"ue_id": ue["ue_id"]}) matlist = sco_edit_matiere.do_matiere_list(context, {"ue_id": ue["ue_id"]})
for mat in matlist: for mat in matlist:
modsmat = context.do_module_list({"matiere_id": mat["matiere_id"]}) modsmat = sco_edit_module.do_module_list(context, {"matiere_id": mat["matiere_id"]})
# XXX debug checks # XXX debug checks
for m in modsmat: for m in modsmat:
if m["ue_id"] != ue["ue_id"]: if m["ue_id"] != ue["ue_id"]:
@ -747,7 +747,7 @@ def do_formsemestre_createwithmodules(context, REQUEST=None, edit=False):
"responsable_id": tf[2][module_id], "responsable_id": tf[2][module_id],
} }
moduleimpl_id = sco_moduleimpl.do_moduleimpl_create(context, modargs) moduleimpl_id = sco_moduleimpl.do_moduleimpl_create(context, modargs)
mod = context.do_module_list({"module_id": module_id})[0] mod = sco_edit_module.do_module_list(context, {"module_id": module_id})[0]
msg += ["création de %s (%s)" % (mod["code"], mod["titre"])] msg += ["création de %s (%s)" % (mod["code"], mod["titre"])]
# INSCRIPTIONS DES ETUDIANTS # INSCRIPTIONS DES ETUDIANTS
log( log(
@ -798,7 +798,7 @@ def do_formsemestre_createwithmodules(context, REQUEST=None, edit=False):
sco_moduleimpl.do_moduleimpl_edit( sco_moduleimpl.do_moduleimpl_edit(
context, modargs, formsemestre_id=formsemestre_id context, modargs, formsemestre_id=formsemestre_id
) )
mod = context.do_module_list({"module_id": module_id})[0] mod = sco_edit_module.do_module_list(context, {"module_id": module_id})[0]
if msg: if msg:
msg_html = ( msg_html = (
@ -834,7 +834,7 @@ def formsemestre_delete_moduleimpls(context, formsemestre_id, module_ids_to_del)
moduleimpl_id = sco_moduleimpl.do_moduleimpl_list( moduleimpl_id = sco_moduleimpl.do_moduleimpl_list(
context, formsemestre_id=formsemestre_id, module_id=module_id context, formsemestre_id=formsemestre_id, module_id=module_id
)[0]["moduleimpl_id"] )[0]["moduleimpl_id"]
mod = context.do_module_list({"module_id": module_id})[0] mod = sco_edit_module.do_module_list(context, {"module_id": module_id})[0]
# Evaluations dans ce module ? # Evaluations dans ce module ?
evals = context.do_evaluation_list({"moduleimpl_id": moduleimpl_id}) evals = context.do_evaluation_list({"moduleimpl_id": moduleimpl_id})
if evals: if evals:
@ -1109,7 +1109,7 @@ def formsemestre_associate_new_version(
if not dialog_confirmed: if not dialog_confirmed:
# dresse le liste des semestres de la meme formation et version # dresse le liste des semestres de la meme formation et version
sem = sco_formsemestre.get_formsemestre(context, formsemestre_id) sem = sco_formsemestre.get_formsemestre(context, formsemestre_id)
F = context.formation_list(args={"formation_id": sem["formation_id"]})[0] F = sco_formations.formation_list(context, args={"formation_id": sem["formation_id"]})[0]
othersems = sco_formsemestre.do_formsemestre_list( othersems = sco_formsemestre.do_formsemestre_list(
context, context,
args={ args={
@ -1227,7 +1227,7 @@ def _reassociate_moduleimpls(
def formsemestre_delete(context, formsemestre_id, REQUEST=None): def formsemestre_delete(context, formsemestre_id, REQUEST=None):
"""Delete a formsemestre (affiche avertissements)""" """Delete a formsemestre (affiche avertissements)"""
sem = sco_formsemestre.get_formsemestre(context, formsemestre_id) sem = sco_formsemestre.get_formsemestre(context, formsemestre_id)
F = context.formation_list(args={"formation_id": sem["formation_id"]})[0] F = sco_formations.formation_list(context, args={"formation_id": sem["formation_id"]})[0]
H = [ H = [
html_sco_header.html_sem_header( html_sco_header.html_sem_header(
context, REQUEST, "Suppression du semestre", sem context, REQUEST, "Suppression du semestre", sem
@ -1672,7 +1672,7 @@ def get_formsemestre_session_id(context, sem, F, parcours):
""" """
# sem = sco_formsemestre.get_formsemestre(context, formsemestre_id) # sem = sco_formsemestre.get_formsemestre(context, formsemestre_id)
# F = context.formation_list( args={ 'formation_id' : sem['formation_id'] } )[0] # F = sco_formations.formation_list(context, args={ 'formation_id' : sem['formation_id'] } )[0]
# parcours = sco_codes_parcours.get_parcours_from_code(F['type_parcours']) # parcours = sco_codes_parcours.get_parcours_from_code(F['type_parcours'])
ImputationDept = sco_preferences.get_preference( ImputationDept = sco_preferences.get_preference(

View File

@ -49,7 +49,7 @@ def formsemestre_ext_create(context, etudid, sem_params, REQUEST=None):
sem_params: dict nécessaire à la création du formsemestre sem_params: dict nécessaire à la création du formsemestre
""" """
# Check args # Check args
_formation = context.formation_list( _formation = sco_formations.formation_list(context,
args={"formation_id": sem_params["formation_id"]} args={"formation_id": sem_params["formation_id"]}
)[0] )[0]
if etudid: if etudid:
@ -436,7 +436,7 @@ def _list_ue_with_coef_and_validations(context, sem, etudid):
""" """
cnx = ndb.GetDBConnexion() cnx = ndb.GetDBConnexion()
formsemestre_id = sem["formsemestre_id"] formsemestre_id = sem["formsemestre_id"]
ue_list = context.do_ue_list({"formation_id": sem["formation_id"]}) ue_list = sco_edit_ue.do_ue_list(context, {"formation_id": sem["formation_id"]})
for ue in ue_list: for ue in ue_list:
# add coefficient # add coefficient
uecoef = sco_formsemestre.formsemestre_uecoef_list( uecoef = sco_formsemestre.formsemestre_uecoef_list(

View File

@ -140,7 +140,7 @@ def formsemestre_status_menubar(context, sem, REQUEST):
else: else:
change_lock_msg = "Déverrouiller" change_lock_msg = "Déverrouiller"
F = context.formation_list(args={"formation_id": sem["formation_id"]})[0] F = sco_formations.formation_list(context, args={"formation_id": sem["formation_id"]})[0]
menuSemestre = [ menuSemestre = [
{ {
@ -563,7 +563,7 @@ def fill_formsemestre(context, sem, REQUEST=None):
) )
else: else:
sem["eyelink"] = "" sem["eyelink"] = ""
F = context.formation_list(args={"formation_id": sem["formation_id"]})[0] F = sco_formations.formation_list(context, args={"formation_id": sem["formation_id"]})[0]
sem["formation"] = F sem["formation"] = F
parcours = sco_codes_parcours.get_parcours_from_code(F["type_parcours"]) parcours = sco_codes_parcours.get_parcours_from_code(F["type_parcours"])
if sem["semestre_id"] != -1: if sem["semestre_id"] != -1:
@ -605,7 +605,7 @@ def formsemestre_description_table(
use_ue_coefs = sco_preferences.get_preference( use_ue_coefs = sco_preferences.get_preference(
context, "use_ue_coefs", formsemestre_id context, "use_ue_coefs", formsemestre_id
) )
F = context.formation_list(args={"formation_id": sem["formation_id"]})[0] F = sco_formations.formation_list(context, args={"formation_id": sem["formation_id"]})[0]
parcours = sco_codes_parcours.get_parcours_from_code(F["type_parcours"]) parcours = sco_codes_parcours.get_parcours_from_code(F["type_parcours"])
Mlist = sco_moduleimpl.do_moduleimpl_withmodule_list( Mlist = sco_moduleimpl.do_moduleimpl_withmodule_list(
context, formsemestre_id=formsemestre_id context, formsemestre_id=formsemestre_id
@ -891,7 +891,7 @@ def html_expr_diagnostic(context, diagnostics):
) )
else: else:
if diag["ue_id"] != last_id or diag["msg"] != last_msg: if diag["ue_id"] != last_id or diag["msg"] != last_msg:
ue = context.do_ue_list({"ue_id": diag["ue_id"]})[0] ue = sco_edit_ue.do_ue_list(context, {"ue_id": diag["ue_id"]})[0]
H.append( H.append(
'<li>UE "%s": %s</li>' '<li>UE "%s": %s</li>'
% (ue["acronyme"] or ue["titre"] or "?", diag["msg"]) % (ue["acronyme"] or ue["titre"] or "?", diag["msg"])
@ -912,7 +912,7 @@ def formsemestre_status_head(
if not semlist: if not semlist:
raise ScoValueError("Session inexistante (elle a peut être été supprimée ?)") raise ScoValueError("Session inexistante (elle a peut être été supprimée ?)")
sem = semlist[0] sem = semlist[0]
F = context.formation_list(args={"formation_id": sem["formation_id"]})[0] F = sco_formations.formation_list(context, args={"formation_id": sem["formation_id"]})[0]
parcours = sco_codes_parcours.get_parcours_from_code(F["type_parcours"]) parcours = sco_codes_parcours.get_parcours_from_code(F["type_parcours"])
page_title = page_title or "Modules de " page_title = page_title or "Modules de "

View File

@ -1073,7 +1073,7 @@ def formsemestre_validate_previous_ue(context, formsemestre_id, etudid, REQUEST=
""" """
etud = scolars.get_etud_info(etudid=etudid, filled=True)[0] etud = scolars.get_etud_info(etudid=etudid, filled=True)[0]
sem = sco_formsemestre.get_formsemestre(context, formsemestre_id) sem = sco_formsemestre.get_formsemestre(context, formsemestre_id)
Fo = context.formation_list(args={"formation_id": sem["formation_id"]})[0] Fo = sco_formations.formation_list(context, args={"formation_id": sem["formation_id"]})[0]
H = [ H = [
html_sco_header.sco_header( html_sco_header.sco_header(
@ -1109,7 +1109,7 @@ def formsemestre_validate_previous_ue(context, formsemestre_id, etudid, REQUEST=
] ]
# Toutes les UE de cette formation sont présentées (même celles des autres semestres) # Toutes les UE de cette formation sont présentées (même celles des autres semestres)
ues = context.do_ue_list({"formation_id": Fo["formation_id"]}) ues = sco_edit_ue.do_ue_list(context, {"formation_id": Fo["formation_id"]})
ue_names = ["Choisir..."] + ["%(acronyme)s %(titre)s" % ue for ue in ues] ue_names = ["Choisir..."] + ["%(acronyme)s %(titre)s" % ue for ue in ues]
ue_ids = [""] + [ue["ue_id"] for ue in ues] ue_ids = [""] + [ue["ue_id"] for ue in ues]
tf = TrivialFormulator( tf = TrivialFormulator(
@ -1334,7 +1334,7 @@ def check_formation_ues(context, formation_id):
définition du programme: cette fonction retourne un bout de HTML définition du programme: cette fonction retourne un bout de HTML
à afficher pour prévenir l'utilisateur, ou '' si tout est ok. à afficher pour prévenir l'utilisateur, ou '' si tout est ok.
""" """
ues = context.do_ue_list({"formation_id": formation_id}) ues = sco_edit_ue.do_ue_list(context, {"formation_id": formation_id})
ue_multiples = {} # { ue_id : [ liste des formsemestre ] } ue_multiples = {} # { ue_id : [ liste des formsemestre ] }
for ue in ues: for ue in ues:
# formsemestres utilisant cette ue ? # formsemestres utilisant cette ue ?

View File

@ -242,7 +242,7 @@ def list_source_sems(context, sem, delai=None):
if s["semestre_id"] == sco_codes_parcours.NO_SEMESTRE_ID: if s["semestre_id"] == sco_codes_parcours.NO_SEMESTRE_ID:
continue continue
# #
F = context.formation_list(args={"formation_id": s["formation_id"]})[0] F = sco_formations.formation_list(context, args={"formation_id": s["formation_id"]})[0]
parcours = sco_codes_parcours.get_parcours_from_code(F["type_parcours"]) parcours = sco_codes_parcours.get_parcours_from_code(F["type_parcours"])
if not parcours.ALLOW_SEM_SKIP: if not parcours.ALLOW_SEM_SKIP:
if s["semestre_id"] < (sem["semestre_id"] - 1): if s["semestre_id"] < (sem["semestre_id"] - 1):

View File

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

View File

@ -132,9 +132,9 @@ def do_moduleimpl_withmodule_list(
del args["REQUEST"] del args["REQUEST"]
modimpls = do_moduleimpl_list(context, **args) modimpls = do_moduleimpl_list(context, **args)
for mo in modimpls: for mo in modimpls:
mo["module"] = context.do_module_list(args={"module_id": mo["module_id"]})[0] mo["module"] = sco_edit_module.do_module_list(context, args={"module_id": mo["module_id"]})[0]
mo["ue"] = context.do_ue_list(args={"ue_id": mo["module"]["ue_id"]})[0] mo["ue"] = sco_edit_ue.do_ue_list(context, args={"ue_id": mo["module"]["ue_id"]})[0]
mo["matiere"] = context.do_matiere_list( mo["matiere"] = sco_edit_matiere.do_matiere_list(context,
args={"matiere_id": mo["module"]["matiere_id"]} args={"matiere_id": mo["module"]["matiere_id"]}
)[0] )[0]

View File

@ -57,7 +57,7 @@ def moduleimpl_inscriptions_edit(
""" """
M = sco_moduleimpl.do_moduleimpl_list(context, moduleimpl_id=moduleimpl_id)[0] M = sco_moduleimpl.do_moduleimpl_list(context, moduleimpl_id=moduleimpl_id)[0]
formsemestre_id = M["formsemestre_id"] formsemestre_id = M["formsemestre_id"]
mod = context.do_module_list(args={"module_id": M["module_id"]})[0] mod = sco_edit_module.do_module_list(context, args={"module_id": M["module_id"]})[0]
sem = sco_formsemestre.get_formsemestre(context, formsemestre_id) sem = sco_formsemestre.get_formsemestre(context, formsemestre_id)
# -- check lock # -- check lock
if sem["etat"] != "1": if sem["etat"] != "1":
@ -334,7 +334,7 @@ def moduleimpl_inscriptions_stats(context, formsemestre_id, REQUEST=None):
UECaps = get_etuds_with_capitalized_ue(context, formsemestre_id) UECaps = get_etuds_with_capitalized_ue(context, formsemestre_id)
if UECaps: if UECaps:
H.append('<h3>Etudiants avec UEs capitalisées:</h3><ul class="ue_inscr_list">') H.append('<h3>Etudiants avec UEs capitalisées:</h3><ul class="ue_inscr_list">')
ues = [context.do_ue_list({"ue_id": ue_id})[0] for ue_id in UECaps.keys()] ues = [sco_edit_ue.do_ue_list(context, {"ue_id": ue_id})[0] for ue_id in UECaps.keys()]
ues.sort(key=lambda u: u["numero"]) ues.sort(key=lambda u: u["numero"])
for ue in ues: for ue in ues:
H.append( H.append(

View File

@ -161,9 +161,9 @@ def moduleimpl_status(context, moduleimpl_id=None, partition_id=None, REQUEST=No
authuser = REQUEST.AUTHENTICATED_USER authuser = REQUEST.AUTHENTICATED_USER
M = sco_moduleimpl.do_moduleimpl_list(context, moduleimpl_id=moduleimpl_id)[0] M = sco_moduleimpl.do_moduleimpl_list(context, moduleimpl_id=moduleimpl_id)[0]
formsemestre_id = M["formsemestre_id"] formsemestre_id = M["formsemestre_id"]
Mod = context.do_module_list(args={"module_id": M["module_id"]})[0] Mod = sco_edit_module.do_module_list(context, args={"module_id": M["module_id"]})[0]
sem = sco_formsemestre.get_formsemestre(context, formsemestre_id) sem = sco_formsemestre.get_formsemestre(context, formsemestre_id)
F = context.formation_list(args={"formation_id": sem["formation_id"]})[0] F = sco_formations.formation_list(context, args={"formation_id": sem["formation_id"]})[0]
ModInscrits = sco_moduleimpl.do_moduleimpl_inscription_list( ModInscrits = sco_moduleimpl.do_moduleimpl_inscription_list(
context, moduleimpl_id=M["moduleimpl_id"] context, moduleimpl_id=M["moduleimpl_id"]
) )

View File

@ -339,7 +339,7 @@ class SituationEtudParcoursGeneric:
if nb_ue > nb_max_ue: if nb_ue > nb_max_ue:
nb_max_ue = nb_ue nb_max_ue = nb_ue
# add formation_code to each sem: # add formation_code to each sem:
sem["formation_code"] = self.context.formation_list( sem["formation_code"] = self.sco_formations.formation_list(context,
args={"formation_id": sem["formation_id"]} args={"formation_id": sem["formation_id"]}
)[0]["formation_code"] )[0]["formation_code"]
# si sem peut servir à compenser le semestre courant, positionne # si sem peut servir à compenser le semestre courant, positionne
@ -1098,7 +1098,7 @@ def list_formsemestre_utilisateurs_uecap(context, formsemestre_id):
semestre): meme code formation, meme semestre_id, date posterieure""" semestre): meme code formation, meme semestre_id, date posterieure"""
cnx = ndb.GetDBConnexion() cnx = ndb.GetDBConnexion()
sem = sco_formsemestre.get_formsemestre(context, formsemestre_id) sem = sco_formsemestre.get_formsemestre(context, formsemestre_id)
F = context.formation_list(args={"formation_id": sem["formation_id"]})[0] F = sco_formations.formation_list(context, args={"formation_id": sem["formation_id"]})[0]
cursor = cnx.cursor(cursor_factory=ndb.ScoDocCursor) cursor = cnx.cursor(cursor_factory=ndb.ScoDocCursor)
cursor.execute( cursor.execute(
"""select sem.formsemestre_id """select sem.formsemestre_id

View File

@ -276,7 +276,7 @@ def do_placement(context, REQUEST):
return "<p>Aucun groupe sélectionné !</p>" return "<p>Aucun groupe sélectionné !</p>"
M = sco_moduleimpl.do_moduleimpl_list(context, moduleimpl_id=E["moduleimpl_id"])[0] M = sco_moduleimpl.do_moduleimpl_list(context, moduleimpl_id=E["moduleimpl_id"])[0]
Mod = context.do_module_list(args={"module_id": M["module_id"]})[0] Mod = sco_edit_module.do_module_list(context, args={"module_id": M["module_id"]})[0]
sem = sco_formsemestre.get_formsemestre(context, M["formsemestre_id"]) sem = sco_formsemestre.get_formsemestre(context, M["formsemestre_id"])
evalname = "%s-%s" % (Mod["code"], ndb.DateDMYtoISO(E["jour"])) evalname = "%s-%s" % (Mod["code"], ndb.DateDMYtoISO(E["jour"]))
if E["description"]: if E["description"]:

View File

@ -83,7 +83,7 @@ def _descr_decisions_ues(context, nt, etudid, decisions_ue, decision_sem):
and sco_codes_parcours.code_semestre_validant(decision_sem["code"]) and sco_codes_parcours.code_semestre_validant(decision_sem["code"])
) )
): ):
ue = context.do_ue_list(args={"ue_id": ue_id})[0] ue = sco_edit_ue.do_ue_list(context, args={"ue_id": ue_id})[0]
uelist.append(ue) uelist.append(ue)
except: except:
log("descr_decisions_ues: ue_id=%s decisions_ue=%s" % (ue_id, decisions_ue)) log("descr_decisions_ues: ue_id=%s decisions_ue=%s" % (ue_id, decisions_ue))
@ -353,7 +353,7 @@ def dict_pvjury(
"formsemestre": sem, "formsemestre": sem,
"has_prev": has_prev, "has_prev": has_prev,
"semestre_non_terminal": semestre_non_terminal, "semestre_non_terminal": semestre_non_terminal,
"formation": context.formation_list(args={"formation_id": sem["formation_id"]})[ "formation": sco_formations.formation_list(context, args={"formation_id": sem["formation_id"]})[
0 0
], ],
"decisions": L, "decisions": L,
@ -720,7 +720,7 @@ def formsemestre_pvjury_pdf(
def descrform_pvjury(context, sem): def descrform_pvjury(context, sem):
"""Définition de formulaire pour PV jury PDF""" """Définition de formulaire pour PV jury PDF"""
F = context.formation_list(formation_id=sem["formation_id"])[0] F = sco_formations.formation_list(context, formation_id=sem["formation_id"])[0]
return [ return [
( (
"date_commission", "date_commission",

View File

@ -66,7 +66,7 @@ def formsemestre_recapcomplet(
trié par moyenne générale décroissante. trié par moyenne générale décroissante.
""" """
sem = sco_formsemestre.get_formsemestre(context, formsemestre_id) sem = sco_formsemestre.get_formsemestre(context, formsemestre_id)
F = context.formation_list(args={"formation_id": sem["formation_id"]})[0] F = sco_formations.formation_list(context, args={"formation_id": sem["formation_id"]})[0]
parcours = sco_codes_parcours.get_parcours_from_code(F["type_parcours"]) parcours = sco_codes_parcours.get_parcours_from_code(F["type_parcours"])
# traduit du DTML # traduit du DTML
modejury = int(modejury) modejury = int(modejury)

View File

@ -280,7 +280,7 @@ def do_evaluation_upload_xls(context, REQUEST):
M = sco_moduleimpl.do_moduleimpl_list( M = sco_moduleimpl.do_moduleimpl_list(
context, moduleimpl_id=E["moduleimpl_id"] context, moduleimpl_id=E["moduleimpl_id"]
)[0] )[0]
mod = context.do_module_list(args={"module_id": M["module_id"]})[0] mod = sco_edit_module.do_module_list(context, args={"module_id": M["module_id"]})[0]
mod["moduleimpl_id"] = M["moduleimpl_id"] mod["moduleimpl_id"] = M["moduleimpl_id"]
mod["url"] = "Notes/moduleimpl_status?moduleimpl_id=%(moduleimpl_id)s" % mod mod["url"] = "Notes/moduleimpl_status?moduleimpl_id=%(moduleimpl_id)s" % mod
sco_news.add( sco_news.add(
@ -371,7 +371,7 @@ def do_evaluation_set_missing(
nb_changed, _, _ = _notes_add(context, authuser, evaluation_id, L, comment) nb_changed, _, _ = _notes_add(context, authuser, evaluation_id, L, comment)
# news # news
M = sco_moduleimpl.do_moduleimpl_list(context, moduleimpl_id=E["moduleimpl_id"])[0] M = sco_moduleimpl.do_moduleimpl_list(context, moduleimpl_id=E["moduleimpl_id"])[0]
mod = context.do_module_list(args={"module_id": M["module_id"]})[0] mod = sco_edit_module.do_module_list(context, args={"module_id": M["module_id"]})[0]
mod["moduleimpl_id"] = M["moduleimpl_id"] mod["moduleimpl_id"] = M["moduleimpl_id"]
mod["url"] = "Notes/moduleimpl_status?moduleimpl_id=%(moduleimpl_id)s" % mod mod["url"] = "Notes/moduleimpl_status?moduleimpl_id=%(moduleimpl_id)s" % mod
sco_news.add( sco_news.add(
@ -447,7 +447,7 @@ def evaluation_suppress_alln(context, evaluation_id, REQUEST, dialog_confirmed=F
] ]
# news # news
M = sco_moduleimpl.do_moduleimpl_list(context, moduleimpl_id=E["moduleimpl_id"])[0] M = sco_moduleimpl.do_moduleimpl_list(context, moduleimpl_id=E["moduleimpl_id"])[0]
mod = context.do_module_list(args={"module_id": M["module_id"]})[0] mod = sco_edit_module.do_module_list(context, args={"module_id": M["module_id"]})[0]
mod["moduleimpl_id"] = M["moduleimpl_id"] mod["moduleimpl_id"] = M["moduleimpl_id"]
mod["url"] = "Notes/moduleimpl_status?moduleimpl_id=%(moduleimpl_id)s" % mod mod["url"] = "Notes/moduleimpl_status?moduleimpl_id=%(moduleimpl_id)s" % mod
sco_news.add( sco_news.add(
@ -785,7 +785,7 @@ def feuille_saisie_notes(context, evaluation_id, group_ids=[], REQUEST=None):
E = evals[0] E = evals[0]
M = sco_moduleimpl.do_moduleimpl_list(context, moduleimpl_id=E["moduleimpl_id"])[0] M = sco_moduleimpl.do_moduleimpl_list(context, moduleimpl_id=E["moduleimpl_id"])[0]
formsemestre_id = M["formsemestre_id"] formsemestre_id = M["formsemestre_id"]
Mod = context.do_module_list(args={"module_id": M["module_id"]})[0] Mod = sco_edit_module.do_module_list(context, args={"module_id": M["module_id"]})[0]
sem = sco_formsemestre.get_formsemestre(context, M["formsemestre_id"]) sem = sco_formsemestre.get_formsemestre(context, M["formsemestre_id"])
if E["jour"]: if E["jour"]:
indication_date = DateDMYtoISO(E["jour"]) indication_date = DateDMYtoISO(E["jour"])
@ -863,7 +863,7 @@ def has_existing_decision(context, M, E, etudid):
return True return True
dec_ues = nt.get_etud_decision_ues(etudid) dec_ues = nt.get_etud_decision_ues(etudid)
if dec_ues: if dec_ues:
mod = context.do_module_list({"module_id": M["module_id"]})[0] mod = sco_edit_module.do_module_list(context, {"module_id": M["module_id"]})[0]
ue_id = mod["ue_id"] ue_id = mod["ue_id"]
if ue_id in dec_ues: if ue_id in dec_ues:
return True # decision pour l'UE a laquelle appartient cette evaluation return True # decision pour l'UE a laquelle appartient cette evaluation
@ -1249,7 +1249,7 @@ def save_note(
) )
E = context.do_evaluation_list({"evaluation_id": evaluation_id})[0] E = context.do_evaluation_list({"evaluation_id": evaluation_id})[0]
M = sco_moduleimpl.do_moduleimpl_list(context, moduleimpl_id=E["moduleimpl_id"])[0] M = sco_moduleimpl.do_moduleimpl_list(context, moduleimpl_id=E["moduleimpl_id"])[0]
Mod = context.do_module_list(args={"module_id": M["module_id"]})[0] Mod = sco_edit_module.do_module_list(context, args={"module_id": M["module_id"]})[0]
Mod["url"] = "Notes/moduleimpl_status?moduleimpl_id=%(moduleimpl_id)s" % M Mod["url"] = "Notes/moduleimpl_status?moduleimpl_id=%(moduleimpl_id)s" % M
result = {"nbchanged": 0} # JSON result = {"nbchanged": 0} # JSON
# Check access: admin, respformation, or responsable_id # Check access: admin, respformation, or responsable_id

View File

@ -248,7 +248,7 @@ def module_tag_set(context, module_id="", taglist=[], REQUEST=None):
taglist = [t.strip() for t in taglist] taglist = [t.strip() for t in taglist]
log("module_tag_set: module_id=%s taglist=%s" % (module_id, taglist)) log("module_tag_set: module_id=%s taglist=%s" % (module_id, taglist))
# Sanity check: # Sanity check:
Mod = context.do_module_list(args={"module_id": module_id}) Mod = sco_edit_module.do_module_list(context, args={"module_id": module_id})
if not Mod: if not Mod:
raise ScoValueError("invalid module !") raise ScoValueError("invalid module !")

View File

@ -91,7 +91,7 @@ def external_ue_create(
numero = sco_edit_ue.next_ue_numero( numero = sco_edit_ue.next_ue_numero(
context, formation_id, semestre_id=sem["semestre_id"] context, formation_id, semestre_id=sem["semestre_id"]
) )
ue_id = context.do_ue_create( ue_id = sco_edit_ue.do_ue_create(context,
{ {
"formation_id": formation_id, "formation_id": formation_id,
"titre": titre, "titre": titre,
@ -104,11 +104,11 @@ def external_ue_create(
REQUEST, REQUEST,
) )
matiere_id = context.do_matiere_create( matiere_id = sco_edit_matiere.do_matiere_create(context,
{"ue_id": ue_id, "titre": titre or acronyme, "numero": 1}, REQUEST {"ue_id": ue_id, "titre": titre or acronyme, "numero": 1}, REQUEST
) )
module_id = context.do_module_create( module_id = sco_edit_module.do_module_create(context,
{ {
"titre": "UE extérieure", "titre": "UE extérieure",
"code": acronyme, "code": acronyme,
@ -176,7 +176,7 @@ def external_ue_inscrit_et_note(
def get_existing_external_ue(context, formation_id): def get_existing_external_ue(context, formation_id):
"la liste de toutes les UE externes définies dans cette formation" "la liste de toutes les UE externes définies dans cette formation"
return context.do_ue_list(args={"formation_id": formation_id, "is_external": 1}) return sco_edit_ue.do_ue_list(context, args={"formation_id": formation_id, "is_external": 1})
def get_external_moduleimpl_id(context, formsemestre_id, ue_id): def get_external_moduleimpl_id(context, formsemestre_id, ue_id):
@ -235,7 +235,7 @@ def external_ue_create_form(context, formsemestre_id, etudid, REQUEST=None):
""", """,
] ]
html_footer = html_sco_header.sco_footer(context, REQUEST) html_footer = html_sco_header.sco_footer(context, REQUEST)
Fo = context.formation_list(args={"formation_id": sem["formation_id"]})[0] Fo = sco_formations.formation_list(context, args={"formation_id": sem["formation_id"]})[0]
parcours = sco_codes_parcours.get_parcours_from_code(Fo["type_parcours"]) parcours = sco_codes_parcours.get_parcours_from_code(Fo["type_parcours"])
ue_types = parcours.ALLOWED_UE_TYPES ue_types = parcours.ALLOWED_UE_TYPES
ue_types.sort() ue_types.sort()

View File

@ -407,33 +407,11 @@ sco_publish(
Permission.ScoChangeFormation, Permission.ScoChangeFormation,
) )
sco_publish(
@bp.route("/do_formation_delete") "/do_formation_delete",
@permission_required(Permission.ScoChangeFormation) sco_edit_formation.do_formation_delete,
@scodoc7func(context) Permission.ScoChangeFormation,
def do_formation_delete(context, oid, REQUEST): )
"""delete a formation (and all its UE, matieres, modules)
XXX delete all ues, will break if there are validations ! USE WITH CARE !
"""
F = context.formation_list(args={"formation_id": oid})[0]
if context.formation_has_locked_sems(oid):
raise ScoLockedFormError()
cnx = ndb.GetDBConnexion()
# delete all UE in this formation
ues = context.do_ue_list({"formation_id": oid})
for ue in ues:
context._do_ue_delete(ue["ue_id"], REQUEST=REQUEST, force=True)
_formationEditor.delete(cnx, oid)
# news
sco_news.add(
context,
REQUEST,
typ=NEWS_FORM,
object=oid,
text="Suppression de la formation %(acronyme)s" % F,
)
@bp.route("/formation_list") @bp.route("/formation_list")
@ -443,15 +421,7 @@ def formation_list(context, format=None, REQUEST=None, formation_id=None, args={
"""List formation(s) with given id, or matching args """List formation(s) with given id, or matching args
(when args is given, formation_id is ignored). (when args is given, formation_id is ignored).
""" """
# logCallStack() r = sco_formation.formation_list(context, formation_id=formation_id, args=args)
if not args:
if formation_id is None:
args = {}
else:
args = {"formation_id": formation_id}
cnx = ndb.GetDBConnexion()
r = sco_formations._formationEditor.list(cnx, args=args)
# log('%d formations found' % len(r))
return scu.sendResult(REQUEST, r, name="formation", format=format) return scu.sendResult(REQUEST, r, name="formation", format=format)
@ -504,7 +474,9 @@ def formation_import_xml_form(context, REQUEST):
elif tf[0] == -1: elif tf[0] == -1:
return REQUEST.RESPONSE.redirect(scu.NotesURL()) return REQUEST.RESPONSE.redirect(scu.NotesURL())
else: else:
formation_id, _, _ = context.formation_import_xml(tf[2]["xmlfile"], REQUEST) formation_id, _, _ = sco_formations.formation_import_xml(
context, tf[2]["xmlfile"], REQUEST
)
return ( return (
"\n".join(H) "\n".join(H)
@ -527,7 +499,7 @@ def formation_create_new_version(context, formation_id, redirect=True, REQUEST=N
context, REQUEST, xml context, REQUEST, xml
) )
# news # news
F = context.formation_list(args={"formation_id": new_id})[0] F = sco_formations.formation_list(context, args={"formation_id": new_id})[0]
sco_news.add( sco_news.add(
context, context,
REQUEST, REQUEST,
@ -544,382 +516,40 @@ def formation_create_new_version(context, formation_id, redirect=True, REQUEST=N
# --- UE # --- UE
_ueEditor = ndb.EditableTable( sco_publish(
"notes_ue", "/do_ue_create",
"ue_id", sco_edit_ue.do_ue_create,
( Permission.ScoChangeFormation,
"ue_id",
"formation_id",
"acronyme",
"numero",
"titre",
"type",
"ue_code",
"ects",
"is_external",
"code_apogee",
"coefficient",
),
sortkey="numero",
input_formators={"type": ndb.int_null_is_zero},
output_formators={
"numero": ndb.int_null_is_zero,
"ects": ndb.float_null_is_null,
"coefficient": ndb.float_null_is_zero,
},
) )
sco_publish(
@bp.route("/do_ue_create") "/do_ue_list",
@permission_required(Permission.ScoChangeFormation) sco_edit_ue.do_ue_list,
@scodoc7func(context) Permission.ScoView,
def do_ue_create(context, args, REQUEST): )
"create an ue"
cnx = ndb.GetDBConnexion()
# check duplicates
ues = context.do_ue_list(
{"formation_id": args["formation_id"], "acronyme": args["acronyme"]}
)
if ues:
raise ScoValueError('Acronyme d\'UE "%s" déjà utilisé !' % args["acronyme"])
# create
r = context._ueEditor.create(cnx, args)
# news
F = context.formation_list(args={"formation_id": args["formation_id"]})[0]
sco_news.add(
context,
REQUEST,
typ=NEWS_FORM,
object=args["formation_id"],
text="Modification de la formation %(acronyme)s" % F,
)
return r
def _do_ue_delete(context, ue_id, delete_validations=False, REQUEST=None, force=False):
"delete UE and attached matieres (but not modules (it should ?))"
cnx = ndb.GetDBConnexion()
log("do_ue_delete: ue_id=%s, delete_validations=%s" % (ue_id, delete_validations))
# check
ue = context.do_ue_list({"ue_id": ue_id})
if not ue:
raise ScoValueError("UE inexistante !")
ue = ue[0]
if sco_edit_ue.ue_is_locked(context, ue["ue_id"]):
raise ScoLockedFormError()
# Il y a-t-il des etudiants ayant validé cette UE ?
# si oui, propose de supprimer les validations
validations = sco_parcours_dut.scolar_formsemestre_validation_list(
cnx, args={"ue_id": ue_id}
)
if validations and not delete_validations and not force:
return scu.confirm_dialog(
context,
"<p>%d étudiants ont validé l'UE %s (%s)</p><p>Si vous supprimez cette UE, ces validations vont être supprimées !</p>"
% (len(validations), ue["acronyme"], ue["titre"]),
dest_url="",
REQUEST=REQUEST,
target_variable="delete_validations",
cancel_url="ue_list?formation_id=%s" % ue["formation_id"],
parameters={"ue_id": ue_id, "dialog_confirmed": 1},
)
if delete_validations:
log("deleting all validations of UE %s" % ue_id)
ndb.SimpleQuery(
context,
"DELETE FROM scolar_formsemestre_validation WHERE ue_id=%(ue_id)s",
{"ue_id": ue_id},
)
# delete all matiere in this UE
mats = context.do_matiere_list({"ue_id": ue_id})
for mat in mats:
context.do_matiere_delete(mat["matiere_id"], REQUEST)
# delete uecoef and events
ndb.SimpleQuery(
context,
"DELETE FROM notes_formsemestre_uecoef WHERE ue_id=%(ue_id)s",
{"ue_id": ue_id},
)
ndb.SimpleQuery(
context, "DELETE FROM scolar_events WHERE ue_id=%(ue_id)s", {"ue_id": ue_id}
)
cnx = ndb.GetDBConnexion()
context._ueEditor.delete(cnx, ue_id)
# > UE delete + supr. validations associées etudiants (cas compliqué, mais rarement utilisé: acceptable de tout invalider ?):
sco_core.inval_cache(context)
# news
F = context.formation_list(args={"formation_id": ue["formation_id"]})[0]
sco_news.add(
context,
REQUEST,
typ=NEWS_FORM,
object=ue["formation_id"],
text="Modification de la formation %(acronyme)s" % F,
)
#
if not force:
return REQUEST.RESPONSE.redirect(
scu.NotesURL() + "/ue_list?formation_id=" + str(ue["formation_id"])
)
else:
return None
@bp.route("/do_ue_list")
@permission_required(Permission.ScoView)
@scodoc7func(context)
def do_ue_list(context, *args, **kw):
"list UEs"
cnx = ndb.GetDBConnexion()
return context._ueEditor.list(cnx, *args, **kw)
# --- Matieres # --- Matieres
_matiereEditor = ndb.EditableTable( sco_publish(
"notes_matieres", "/do_matiere_create",
"matiere_id", sco_edit_matiere.do_matiere_create,
("matiere_id", "ue_id", "numero", "titre"), Permission.ScoChangeFormation,
sortkey="numero", )
output_formators={"numero": ndb.int_null_is_zero}, sco_publish(
"/do_matiere_delete",
sco_edit_matiere.do_matiere_delete,
Permission.ScoChangeFormation,
) )
@bp.route("/do_matiere_create")
@permission_required(Permission.ScoChangeFormation)
@scodoc7func(context)
def do_matiere_create(context, args, REQUEST):
"create a matiere"
cnx = ndb.GetDBConnexion()
# check
ue = context.do_ue_list({"ue_id": args["ue_id"]})[0]
# create matiere
r = context._matiereEditor.create(cnx, args)
# news
F = context.formation_list(args={"formation_id": ue["formation_id"]})[0]
sco_news.add(
context,
REQUEST,
typ=NEWS_FORM,
object=ue["formation_id"],
text="Modification de la formation %(acronyme)s" % F,
)
return r
@bp.route("/do_matiere_delete")
@permission_required(Permission.ScoChangeFormation)
@scodoc7func(context)
def do_matiere_delete(context, oid, REQUEST):
"delete matiere and attached modules"
cnx = ndb.GetDBConnexion()
# check
mat = context.do_matiere_list({"matiere_id": oid})[0]
ue = context.do_ue_list({"ue_id": mat["ue_id"]})[0]
locked = sco_edit_matiere.matiere_is_locked(context, mat["matiere_id"])
if locked:
log("do_matiere_delete: mat=%s" % mat)
log("do_matiere_delete: ue=%s" % ue)
log("do_matiere_delete: locked sems: %s" % locked)
raise ScoLockedFormError()
log("do_matiere_delete: matiere_id=%s" % oid)
# delete all modules in this matiere
mods = context.do_module_list({"matiere_id": oid})
for mod in mods:
context.do_module_delete(mod["module_id"], REQUEST)
context._matiereEditor.delete(cnx, oid)
# news
F = context.formation_list(args={"formation_id": ue["formation_id"]})[0]
sco_news.add(
context,
REQUEST,
typ=NEWS_FORM,
object=ue["formation_id"],
text="Modification de la formation %(acronyme)s" % F,
)
@bp.route("/do_matiere_list")
@permission_required(Permission.ScoView)
@scodoc7func(context)
def do_matiere_list(context, *args, **kw):
"list matieres"
cnx = ndb.GetDBConnexion()
return context._matiereEditor.list(cnx, *args, **kw)
@bp.route("/do_matiere_edit")
@permission_required(Permission.ScoChangeFormation)
@scodoc7func(context)
def do_matiere_edit(context, *args, **kw):
"edit a matiere"
cnx = ndb.GetDBConnexion()
# check
mat = context.do_matiere_list({"matiere_id": args[0]["matiere_id"]})[0]
if sco_edit_matiere.matiere_is_locked(context, mat["matiere_id"]):
raise ScoLockedFormError()
# edit
context._matiereEditor.edit(cnx, *args, **kw)
sco_core.inval_cache(context) # > modif matiere
@bp.route("/do_matiere_formation_id")
@permission_required(Permission.ScoView)
@scodoc7func(context)
def do_matiere_formation_id(context, matiere_id):
"get formation_id from matiere"
cnx = ndb.GetDBConnexion()
cursor = cnx.cursor(cursor_factory=ndb.ScoDocCursor)
cursor.execute(
"select UE.formation_id from notes_matieres M, notes_ue UE where M.matiere_id = %(matiere_id)s and M.ue_id = UE.ue_id",
{"matiere_id": matiere_id},
)
res = cursor.fetchall()
return res[0][0]
# --- Modules # --- Modules
_moduleEditor = ndb.EditableTable( sco_publish(
"notes_modules", "/do_module_delete",
"module_id", sco_edit_module.do_module_delete,
( Permission.ScoChangeFormation,
"module_id",
"titre",
"code",
"abbrev",
"heures_cours",
"heures_td",
"heures_tp",
"coefficient",
"ue_id",
"matiere_id",
"formation_id",
"semestre_id",
"numero",
"code_apogee",
"module_type"
#'ects'
),
sortkey="numero, code, titre",
output_formators={
"heures_cours": ndb.float_null_is_zero,
"heures_td": ndb.float_null_is_zero,
"heures_tp": ndb.float_null_is_zero,
"numero": ndb.int_null_is_zero,
"coefficient": ndb.float_null_is_zero,
"module_type": ndb.int_null_is_zero
#'ects' : ndb.float_null_is_null
},
) )
@bp.route("/do_module_create")
@permission_required(Permission.ScoChangeFormation)
@scodoc7func(context)
def do_module_create(context, args, REQUEST):
"create a module"
# create
cnx = ndb.GetDBConnexion()
r = context._moduleEditor.create(cnx, args)
# news
F = context.formation_list(args={"formation_id": args["formation_id"]})[0]
sco_news.add(
context,
REQUEST,
typ=NEWS_FORM,
object=args["formation_id"],
text="Modification de la formation %(acronyme)s" % F,
)
return r
@bp.route("/do_module_delete")
@permission_required(Permission.ScoChangeFormation)
@scodoc7func(context)
def do_module_delete(context, oid, REQUEST):
"delete module"
mod = context.do_module_list({"module_id": oid})[0]
if sco_edit_module.module_is_locked(context, mod["module_id"]):
raise ScoLockedFormError()
# S'il y a des moduleimpls, on ne peut pas detruire le module !
mods = sco_moduleimpl.do_moduleimpl_list(context, module_id=oid)
if mods:
err_page = scu.confirm_dialog(
context,
message="""<h3>Destruction du module impossible car il est utilisé dans des semestres existants !</h3>""",
helpmsg="""Il faut d'abord supprimer le semestre. Mais il est peut être préférable de laisser ce programme intact et d'en créer une nouvelle version pour la modifier.""",
dest_url="ue_list",
parameters={"formation_id": mod["formation_id"]},
REQUEST=REQUEST,
)
raise ScoGenError(err_page)
# delete
cnx = ndb.GetDBConnexion()
context._moduleEditor.delete(cnx, oid)
# news
F = context.formation_list(args={"formation_id": mod["formation_id"]})[0]
sco_news.add(
context,
REQUEST,
typ=NEWS_FORM,
object=mod["formation_id"],
text="Modification de la formation %(acronyme)s" % F,
)
@bp.route("/do_module_list")
@permission_required(Permission.ScoView)
@scodoc7func(context)
def do_module_list(context, *args, **kw):
"list modules"
cnx = ndb.GetDBConnexion()
return context._moduleEditor.list(cnx, *args, **kw)
@bp.route("/do_module_edit")
@permission_required(Permission.ScoChangeFormation)
@scodoc7func(context)
def do_module_edit(context, val):
"edit a module"
# check
mod = context.do_module_list({"module_id": val["module_id"]})[0]
if sco_edit_module.module_is_locked(context, mod["module_id"]):
# formation verrouillée: empeche de modifier certains champs:
protected_fields = ("coefficient", "ue_id", "matiere_id", "semestre_id")
for f in protected_fields:
if f in val:
del val[f]
# edit
cnx = ndb.GetDBConnexion()
context._moduleEditor.edit(cnx, val)
sems = sco_formsemestre.do_formsemestre_list(
context, args={"formation_id": mod["formation_id"]}
)
if sems:
sco_core.inval_cache(
context, formsemestre_id_list=[s["formsemestre_id"] for s in sems]
) # > modif module
#
@bp.route("/formation_has_locked_sems")
@permission_required(Permission.ScoView)
@scodoc7func(context)
def formation_has_locked_sems(context, formation_id):
"True if there is a locked formsemestre in this formation"
sems = sco_formsemestre.do_formsemestre_list(
context, args={"formation_id": formation_id, "etat": "0"}
)
return sems
@bp.route("/formation_count_sems") @bp.route("/formation_count_sems")
@permission_required(Permission.ScoView) @permission_required(Permission.ScoView)
@scodoc7func(context) @scodoc7func(context)
@ -949,13 +579,15 @@ sco_publish(
@scodoc7func(context) @scodoc7func(context)
def module_move(context, module_id, after=0, REQUEST=None, redirect=1): def module_move(context, module_id, after=0, REQUEST=None, redirect=1):
"""Move before/after previous one (decrement/increment numero)""" """Move before/after previous one (decrement/increment numero)"""
module = context.do_module_list({"module_id": module_id})[0] module = sco_edit_module.do_module_list(context, {"module_id": module_id})[0]
redirect = int(redirect) redirect = int(redirect)
after = int(after) # 0: deplace avant, 1 deplace apres after = int(after) # 0: deplace avant, 1 deplace apres
if after not in (0, 1): if after not in (0, 1):
raise ValueError('invalid value for "after"') raise ValueError('invalid value for "after"')
formation_id = module["formation_id"] formation_id = module["formation_id"]
others = context.do_module_list({"matiere_id": module["matiere_id"]}) others = sco_edit_module.do_module_list(
context, {"matiere_id": module["matiere_id"]}
)
# log('others=%s' % others) # log('others=%s' % others)
if len(others) > 1: if len(others) > 1:
idx = [p["module_id"] for p in others].index(module_id) idx = [p["module_id"] for p in others].index(module_id)
@ -972,8 +604,8 @@ def module_move(context, module_id, after=0, REQUEST=None, redirect=1):
module["numero"], neigh["numero"] = neigh["numero"], module["numero"] module["numero"], neigh["numero"] = neigh["numero"], module["numero"]
if module["numero"] == neigh["numero"]: if module["numero"] == neigh["numero"]:
neigh["numero"] -= 2 * after - 1 neigh["numero"] -= 2 * after - 1
context._moduleEditor.edit(cnx, module) _moduleEditor.edit(cnx, module)
context._moduleEditor.edit(cnx, neigh) _moduleEditor.edit(cnx, neigh)
# redirect to ue_list page: # redirect to ue_list page:
if redirect: if redirect:
@ -985,14 +617,14 @@ def module_move(context, module_id, after=0, REQUEST=None, redirect=1):
@scodoc7func(context) @scodoc7func(context)
def ue_move(context, ue_id, after=0, REQUEST=None, redirect=1): def ue_move(context, ue_id, after=0, REQUEST=None, redirect=1):
"""Move UE before/after previous one (decrement/increment numero)""" """Move UE before/after previous one (decrement/increment numero)"""
o = context.do_ue_list({"ue_id": ue_id})[0] o = sco_edit_ue.do_ue_list(context, {"ue_id": ue_id})[0]
# log('ue_move %s (#%s) after=%s' % (ue_id, o['numero'], after)) # log('ue_move %s (#%s) after=%s' % (ue_id, o['numero'], after))
redirect = int(redirect) redirect = int(redirect)
after = int(after) # 0: deplace avant, 1 deplace apres after = int(after) # 0: deplace avant, 1 deplace apres
if after not in (0, 1): if after not in (0, 1):
raise ValueError('invalid value for "after"') raise ValueError('invalid value for "after"')
formation_id = o["formation_id"] formation_id = o["formation_id"]
others = context.do_ue_list({"formation_id": formation_id}) others = sco_edit_ue.do_ue_list(context, {"formation_id": formation_id})
if len(others) > 1: if len(others) > 1:
idx = [p["ue_id"] for p in others].index(ue_id) idx = [p["ue_id"] for p in others].index(ue_id)
neigh = None # object to swap with neigh = None # object to swap with
@ -1554,7 +1186,7 @@ def edit_ue_expr(context, REQUEST, formsemestre_id, ue_id):
raise AccessDenied("vous n'avez pas le droit d'effectuer cette opération") raise AccessDenied("vous n'avez pas le droit d'effectuer cette opération")
cnx = ndb.GetDBConnexion() cnx = ndb.GetDBConnexion()
# #
ue = context.do_ue_list({"ue_id": ue_id})[0] ue = sco_edit_ue.do_ue_list(context, {"ue_id": ue_id})[0]
H = [ H = [
html_sco_header.html_sem_header( html_sco_header.html_sem_header(
context, context,
@ -1753,8 +1385,8 @@ def do_formsemestre_inscription_listinscrits(
r = cache.get(formsemestre_id) r = cache.get(formsemestre_id)
if r is None: if r is None:
# retreive list # retreive list
r = sco_formsemestre_inscriptions.do_formsemestre_inscription_list(context, r = sco_formsemestre_inscriptions.do_formsemestre_inscription_list(
args={"formsemestre_id": formsemestre_id, "etat": "I"} context, args={"formsemestre_id": formsemestre_id, "etat": "I"}
) )
cache.set(formsemestre_id, r) cache.set(formsemestre_id, r)
return scu.sendResult(REQUEST, r, format=format, name="inscrits") return scu.sendResult(REQUEST, r, format=format, name="inscrits")
@ -1811,8 +1443,8 @@ def formsemestre_desinscription(
sem["date_debut"], sem["date_debut"],
sem["date_fin"], sem["date_fin"],
) )
inscrits = sco_formsemestre_inscriptions.do_formsemestre_inscription_list(context, inscrits = sco_formsemestre_inscriptions.do_formsemestre_inscription_list(
args={"formsemestre_id": formsemestre_id} context, args={"formsemestre_id": formsemestre_id}
) )
nbinscrits = len(inscrits) nbinscrits = len(inscrits)
if nbinscrits <= 1: if nbinscrits <= 1:
@ -2050,7 +1682,7 @@ def do_evaluation_create(
# news # news
M = sco_moduleimpl.do_moduleimpl_list(context, moduleimpl_id=moduleimpl_id)[0] M = sco_moduleimpl.do_moduleimpl_list(context, moduleimpl_id=moduleimpl_id)[0]
mod = context.do_module_list(args={"module_id": M["module_id"]})[0] mod = sco_edit_module.do_module_list(context, args={"module_id": M["module_id"]})[0]
mod["moduleimpl_id"] = M["moduleimpl_id"] mod["moduleimpl_id"] = M["moduleimpl_id"]
mod["url"] = "Notes/moduleimpl_status?moduleimpl_id=%(moduleimpl_id)s" % mod mod["url"] = "Notes/moduleimpl_status?moduleimpl_id=%(moduleimpl_id)s" % mod
sco_news.add( sco_news.add(
@ -2127,7 +1759,7 @@ def evaluation_delete(context, REQUEST, evaluation_id):
raise ValueError("Evalution inexistante ! (%s)" % evaluation_id) raise ValueError("Evalution inexistante ! (%s)" % evaluation_id)
E = El[0] E = El[0]
M = sco_moduleimpl.do_moduleimpl_list(context, moduleimpl_id=E["moduleimpl_id"])[0] M = sco_moduleimpl.do_moduleimpl_list(context, moduleimpl_id=E["moduleimpl_id"])[0]
Mod = context.do_module_list(args={"module_id": M["module_id"]})[0] Mod = sco_edit_module.do_module_list(context, args={"module_id": M["module_id"]})[0]
tit = "Suppression de l'évaluation %(description)s (%(jour)s)" % E tit = "Suppression de l'évaluation %(description)s (%(jour)s)" % E
etat = sco_evaluations.do_evaluation_etat(context, evaluation_id) etat = sco_evaluations.do_evaluation_etat(context, evaluation_id)
H = [ H = [
@ -3156,8 +2788,10 @@ def check_sem_integrity(context, formsemestre_id, REQUEST):
bad_ue = [] bad_ue = []
bad_sem = [] bad_sem = []
for modimpl in modimpls: for modimpl in modimpls:
mod = context.do_module_list({"module_id": modimpl["module_id"]})[0] mod = sco_edit_module.do_module_list(
ue = context.do_ue_list({"ue_id": mod["ue_id"]})[0] context, {"module_id": modimpl["module_id"]}
)[0]
ue = sco_edit_ue.do_ue_list(context, {"ue_id": mod["ue_id"]})[0]
if ue["formation_id"] != mod["formation_id"]: if ue["formation_id"] != mod["formation_id"]:
modimpl["mod"] = mod modimpl["mod"] = mod
modimpl["ue"] = ue modimpl["ue"] = ue
@ -3183,12 +2817,14 @@ def check_sem_integrity(context, formsemestre_id, REQUEST):
def check_form_integrity(context, formation_id, fix=False, REQUEST=None): def check_form_integrity(context, formation_id, fix=False, REQUEST=None):
"debug" "debug"
log("check_form_integrity: formation_id=%s fix=%s" % (formation_id, fix)) log("check_form_integrity: formation_id=%s fix=%s" % (formation_id, fix))
ues = context.do_ue_list(args={"formation_id": formation_id}) ues = sco_edit_ue.do_ue_list(context, args={"formation_id": formation_id})
bad = [] bad = []
for ue in ues: for ue in ues:
mats = context.do_matiere_list(args={"ue_id": ue["ue_id"]}) mats = sco_edit_matiere.do_matiere_list(context, args={"ue_id": ue["ue_id"]})
for mat in mats: for mat in mats:
mods = context.do_module_list({"matiere_id": mat["matiere_id"]}) mods = sco_edit_module.do_module_list(
context, {"matiere_id": mat["matiere_id"]}
)
for mod in mods: for mod in mods:
if mod["ue_id"] != ue["ue_id"]: if mod["ue_id"] != ue["ue_id"]:
if fix: if fix:
@ -3197,7 +2833,7 @@ def check_form_integrity(context, formation_id, fix=False, REQUEST=None):
"fix: mod.ue_id = %s (was %s)" % (ue["ue_id"], mod["ue_id"]) "fix: mod.ue_id = %s (was %s)" % (ue["ue_id"], mod["ue_id"])
) )
mod["ue_id"] = ue["ue_id"] mod["ue_id"] = ue["ue_id"]
context.do_module_edit(mod) sco_edit_module.do_module_edit(context, mod)
bad.append(mod) bad.append(mod)
if mod["formation_id"] != formation_id: if mod["formation_id"] != formation_id:
bad.append(mod) bad.append(mod)
@ -3276,7 +2912,9 @@ def check_formsemestre_integrity(context, formsemestre_id, REQUEST=None):
def check_integrity_all(context, REQUEST=None): def check_integrity_all(context, REQUEST=None):
"debug: verifie tous les semestres et tt les formations" "debug: verifie tous les semestres et tt les formations"
# formations # formations
for F in context.formation_list(): for F in sco_formations.formation_list(
context,
):
context.check_form_integrity(F["formation_id"], REQUEST=REQUEST) context.check_form_integrity(F["formation_id"], REQUEST=REQUEST)
# semestres # semestres
for sem in sco_formsemestre.do_formsemestre_list(context): for sem in sco_formsemestre.do_formsemestre_list(context):

View File

@ -153,7 +153,9 @@ def sco_publish(route, function, permission):
"""Declare a route for a python function, """Declare a route for a python function,
protected by permission and called following ScoDoc 7 Zope standards. protected by permission and called following ScoDoc 7 Zope standards.
""" """
bp.route(route)(permission_required(permission)(scodoc7func(context)(function))) return bp.route(route)(
permission_required(permission)(scodoc7func(context)(function))
)
log.set_log_directory(Config.INSTANCE_HOME + "/log") log.set_log_directory(Config.INSTANCE_HOME + "/log")
@ -213,7 +215,7 @@ def about(context, REQUEST):
@permission_required(Permission.ScoChangePreferences) @permission_required(Permission.ScoChangePreferences)
@scodoc7func(context) @scodoc7func(context)
def edit_preferences(context, REQUEST): def edit_preferences(context, REQUEST):
"""Edit global preferences (lien eParamétrage" département)""" """Edit global preferences (lien "Paramétrage" département)"""
return sco_preferences.get_base_preferences(context).edit(REQUEST=REQUEST) return sco_preferences.get_base_preferences(context).edit(REQUEST=REQUEST)
@ -288,7 +290,7 @@ def showEtudLog(context, etudid, format="html", REQUEST=None):
# ---------- PAGE ACCUEIL (listes) -------------- # ---------- PAGE ACCUEIL (listes) --------------
sco_publish("/", sco_dept.index_html, Permission.ScoView) bp.route("/")(sco_publish("/index_html", sco_dept.index_html, Permission.ScoView))
@bp.route("/rssnews") @bp.route("/rssnews")

View File

@ -8,7 +8,7 @@ source config.sh
source utils.sh source utils.sh
# Source code version: # Source code version:
x=$(grep SCOVERSION ../VERSION.py) || terminate "can't access VERSION.py" 1 x=$(grep SCOVERSION ../app/scodoc/VERSION.py) || terminate "can't access VERSION.py" 1
x=${x#*\"} x=${x#*\"}
src_version=${x%\"*} src_version=${x%\"*}