trois bugs épars

This commit is contained in:
Emmanuel Viennet 2021-08-30 23:28:15 +02:00
parent c14684a1dc
commit dca51d1ce4
10 changed files with 53 additions and 33 deletions

View File

@ -301,9 +301,11 @@ def clear_scodoc_cache():
# --------- Logging # --------- Logging
def log(msg: str): def log(msg: str, silent_test=True):
"""log a message. """log a message.
If Flask app, use configured logger, else stderr.""" If Flask app, use configured logger, else stderr."""
if silent_test and current_app.config["TESTING"]:
return
try: try:
dept = getattr(g, "scodoc_dept", "") dept = getattr(g, "scodoc_dept", "")
msg = f" ({dept}) {msg}" msg = f" ({dept}) {msg}"

View File

@ -348,7 +348,7 @@ def module_move(module_id, after=0, REQUEST=None, redirect=1):
) )
def ue_move(ue_id, after=0, REQUEST=None, redirect=1): def ue_move(ue_id, after=0, redirect=1):
"""Move UE before/after previous one (decrement/increment numero)""" """Move UE before/after previous one (decrement/increment numero)"""
o = sco_edit_ue.do_ue_list({"ue_id": ue_id})[0] o = sco_edit_ue.do_ue_list({"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))

View File

@ -115,7 +115,7 @@ def do_ue_create(args):
return r return r
def do_ue_delete(ue_id, delete_validations=False, REQUEST=None, force=False): def do_ue_delete(ue_id, delete_validations=False, force=False):
"delete UE and attached matieres (but not modules)" "delete UE and attached matieres (but not modules)"
from app.scodoc import sco_formations from app.scodoc import sco_formations
from app.scodoc import sco_parcours_dut from app.scodoc import sco_parcours_dut
@ -420,10 +420,10 @@ def ue_delete(
cancel_url="ue_list?formation_id=%s" % ue["formation_id"], cancel_url="ue_list?formation_id=%s" % ue["formation_id"],
) )
return do_ue_delete(ue_id, delete_validations=delete_validations, REQUEST=REQUEST) return do_ue_delete(ue_id, delete_validations=delete_validations)
def ue_list(formation_id=None, msg="", REQUEST=None): def ue_list(formation_id=None, msg=""):
"""Liste des matières et modules d'une formation, avec liens pour """Liste des matières et modules d'une formation, avec liens pour
editer (si non verrouillée). editer (si non verrouillée).
""" """
@ -484,22 +484,29 @@ def ue_list(formation_id=None, msg="", REQUEST=None):
] ]
if locked: if locked:
H.append( H.append(
"""<p class="help">Cette formation est verrouillée car %d semestres verrouillés s'y réferent. f"""<p class="help">Cette formation est verrouillée car
Si vous souhaitez modifier cette formation (par exemple pour y ajouter un module), vous devez: {len(locked)} semestres verrouillés s'y réferent.
Si vous souhaitez modifier cette formation (par exemple pour y ajouter un module),
vous devez:
</p> </p>
<ul class="help"> <ul class="help">
<li>soit créer une nouvelle version de cette formation pour pouvoir l'éditer librement (vous pouvez passer par la fonction "Associer à une nouvelle version du programme" (menu "Semestre") si vous avez un semestre en cours);</li> <li>soit créer une nouvelle version de cette formation pour pouvoir l'éditer
<li>soit déverrouiller le ou les semestres qui s'y réfèrent (attention, en principe ces semestres sont archivés librement (vous pouvez passer par la fonction "Associer à une nouvelle version
et ne devraient pas être modifiés).</li> du programme" (menu "Semestre") si vous avez un semestre en cours);
</li>
<li>soit déverrouiller le ou les semestres qui s'y réfèrent (attention, en
principe ces semestres sont archivés et ne devraient pas être modifiés).
</li>
</ul>""" </ul>"""
% len(locked)
) )
if msg: if msg:
H.append('<p class="msg">' + msg + "</p>") H.append('<p class="msg">' + msg + "</p>")
if has_duplicate_ue_codes: if has_duplicate_ue_codes:
H.append( H.append(
"""<div class="ue_warning"><span>Attention: plusieurs UE de cette formation ont le même code. Il faut corriger cela ci-dessous, sinon les calculs d'ECTS seront erronés !</span></div>""" """<div class="ue_warning"><span>Attention: plusieurs UE de cette
formation ont le même code. Il faut corriger cela ci-dessous,
sinon les calculs d'ECTS seront erronés !</span></div>"""
) )
# Description de la formation # Description de la formation
@ -914,7 +921,7 @@ def do_ue_edit(args, bypass_lock=False, dont_invalidate_cache=False):
# essai edition en ligne: # essai edition en ligne:
def edit_ue_set_code_apogee(id=None, value=None, REQUEST=None): def edit_ue_set_code_apogee(id=None, value=None):
"set UE code apogee" "set UE code apogee"
ue_id = id ue_id = id
value = value.strip("-_ \t") value = value.strip("-_ \t")

View File

@ -39,6 +39,7 @@ from flask import g
from flask_login import current_user from flask_login import current_user
from flask import request from flask import request
from app import log
import app.scodoc.sco_utils as scu import app.scodoc.sco_utils as scu
import app.scodoc.notesdb as ndb import app.scodoc.notesdb as ndb
from app.scodoc.sco_exceptions import AccessDenied, ScoValueError from app.scodoc.sco_exceptions import AccessDenied, ScoValueError

View File

@ -195,7 +195,7 @@ def do_formsemestre_createwithmodules(REQUEST=None, edit=False):
if sid == "-1": if sid == "-1":
semestre_id_labels.append("pas de semestres") semestre_id_labels.append("pas de semestres")
else: else:
semestre_id_labels.append(str(sid)) semestre_id_labels.append(f"S{sid}")
# Liste des modules dans ce semestre de cette formation # Liste des modules dans ce semestre de cette formation
# 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:

View File

@ -128,7 +128,8 @@ def formsemestre_ext_create_form(etudid, formsemestre_id, REQUEST=None):
H.append("""<p class="warning">pas de semestres extérieurs possibles</p>""") H.append("""<p class="warning">pas de semestres extérieurs possibles</p>""")
return "\n".join(H) + F return "\n".join(H) + F
# Formulaire # Formulaire
semestre_ids_str = [str(x) for x in sorted(semestre_ids)] semestre_ids_list = sorted(semestre_ids)
semestre_ids_labels = [f"S{x}" for x in semestre_ids_list]
descr = [ descr = [
("formsemestre_id", {"input_type": "hidden"}), ("formsemestre_id", {"input_type": "hidden"}),
("etudid", {"input_type": "hidden"}), ("etudid", {"input_type": "hidden"}),
@ -137,8 +138,8 @@ def formsemestre_ext_create_form(etudid, formsemestre_id, REQUEST=None):
{ {
"input_type": "menu", "input_type": "menu",
"title": "Indice du semestre dans le cursus", "title": "Indice du semestre dans le cursus",
"allowed_values": semestre_ids_str, "allowed_values": semestre_ids_list,
"labels": semestre_ids_str, "labels": semestre_ids_labels,
}, },
), ),
( (

View File

@ -478,9 +478,9 @@ def formsemestre_inscription_option(etudid, formsemestre_id, REQUEST=None):
if ins["moduleimpl_id"] == mod["moduleimpl_id"]: if ins["moduleimpl_id"] == mod["moduleimpl_id"]:
key = "moduleimpls_%s" % ue_id key = "moduleimpls_%s" % ue_id
if key in initvalues: if key in initvalues:
initvalues[key].append(mod["moduleimpl_id"]) initvalues[key].append(str(mod["moduleimpl_id"]))
else: else:
initvalues[key] = [mod["moduleimpl_id"]] initvalues[key] = [str(mod["moduleimpl_id"])]
break break
descr = [ descr = [
@ -518,7 +518,7 @@ def formsemestre_inscription_option(etudid, formsemestre_id, REQUEST=None):
"input_type": "checkbox", "input_type": "checkbox",
"title": "", "title": "",
"dom_id": ue_id, "dom_id": ue_id,
"allowed_values": modimpls_by_ue_ids[ue_id], "allowed_values": [str(x) for x in modimpls_by_ue_ids[ue_id]],
"labels": modimpls_by_ue_names[ue_id], "labels": modimpls_by_ue_names[ue_id],
"vertical": True, "vertical": True,
}, },
@ -569,18 +569,21 @@ function chkbx_select(field_id, state) {
insdict[ins["moduleimpl_id"]] = ins insdict[ins["moduleimpl_id"]] = ins
for ue in ues: for ue in ues:
ue_id = ue["ue_id"] ue_id = ue["ue_id"]
for moduleimpl_id in tf[2]["moduleimpls_%s" % ue_id]: for moduleimpl_id in [int(x) for x in tf[2]["moduleimpls_%s" % ue_id]]:
if moduleimpl_id in a_desinscrire: if moduleimpl_id in a_desinscrire:
del a_desinscrire[moduleimpl_id] del a_desinscrire[moduleimpl_id]
# supprime ceux auxquel pas inscrit # supprime ceux auxquel pas inscrit
for moduleimpl_id in a_desinscrire.keys(): moduleimpls_a_desinscrire = list(a_desinscrire.keys())
for moduleimpl_id in moduleimpls_a_desinscrire:
if moduleimpl_id not in insdict: if moduleimpl_id not in insdict:
del a_desinscrire[moduleimpl_id] del a_desinscrire[moduleimpl_id]
a_inscrire = set() a_inscrire = set()
for ue in ues: for ue in ues:
ue_id = ue["ue_id"] ue_id = ue["ue_id"]
a_inscrire.update(tf[2]["moduleimpls_%s" % ue_id]) a_inscrire.update(
int(x) for x in tf[2]["moduleimpls_%s" % ue_id]
) # conversion en int !
# supprime ceux auquel deja inscrit: # supprime ceux auquel deja inscrit:
for ins in inscr: for ins in inscr:
if ins["moduleimpl_id"] in a_inscrire: if ins["moduleimpl_id"] in a_inscrire:
@ -638,8 +641,8 @@ function chkbx_select(field_id, state) {
+ "</p>" + "</p>"
) )
H.append("</li></ul>") H.append("</li></ul>")
modulesimpls_ainscrire = ",".join(a_inscrire) modulesimpls_ainscrire = ",".join(str(x) for x in a_inscrire)
modulesimpls_adesinscrire = ",".join(a_desinscrire) modulesimpls_adesinscrire = ",".join(str(x) for x in a_desinscrire)
H.append( H.append(
"""<form action="do_moduleimpl_incription_options"> """<form action="do_moduleimpl_incription_options">
<input type="hidden" name="etudid" value="%s"/> <input type="hidden" name="etudid" value="%s"/>
@ -665,12 +668,16 @@ def do_moduleimpl_incription_options(
""" """
Effectue l'inscription et la description aux modules optionnels Effectue l'inscription et la description aux modules optionnels
""" """
if isinstance(modulesimpls_ainscrire, int):
modulesimpls_ainscrire = str(modulesimpls_ainscrire)
if isinstance(modulesimpls_adesinscrire, int):
modulesimpls_adesinscrire = str(modulesimpls_adesinscrire)
if modulesimpls_ainscrire: if modulesimpls_ainscrire:
a_inscrire = modulesimpls_ainscrire.split(",") a_inscrire = [int(x) for x in modulesimpls_ainscrire.split(",")]
else: else:
a_inscrire = [] a_inscrire = []
if modulesimpls_adesinscrire: if modulesimpls_adesinscrire:
a_desinscrire = modulesimpls_adesinscrire.split(",") a_desinscrire = [int(x) for x in modulesimpls_adesinscrire.split(",")]
else: else:
a_desinscrire = [] a_desinscrire = []
# inscriptions # inscriptions

View File

@ -317,8 +317,10 @@ def formsemestre_validation_etud_form(
H.append(form_decision_manuelle(Se, formsemestre_id, etudid)) H.append(form_decision_manuelle(Se, formsemestre_id, etudid))
H.append( H.append(
"""<div class="link_defaillance">Ou <a class="stdlink" href="formDef?etudid=%s&formsemestre_id=%s">déclarer l'étudiant comme défaillant dans ce semestre</a></div>""" f"""<div class="link_defaillance">Ou <a class="stdlink" href="{
% (etudid, formsemestre_id) url_for("scolar.formDef", scodoc_dept=g.scodoc_dept, etudid=etudid,
formsemestre_id=formsemestre_id)
}">déclarer l'étudiant comme défaillant dans ce semestre</a></div>"""
) )
H.append('<p style="font-size: 50%;">Formation ') H.append('<p style="font-size: 50%;">Formation ')

View File

@ -320,13 +320,13 @@ def dict_pvjury(
# Cherche la date de decision (sem ou UE) la plus récente: # Cherche la date de decision (sem ou UE) la plus récente:
if d["decision_sem"]: if d["decision_sem"]:
date = ndb.DateDMYtoISO(d["decision_sem"]["event_date"]) date = ndb.DateDMYtoISO(d["decision_sem"]["event_date"])
if date > max_date: # decision plus recente if date and date > max_date: # decision plus recente
max_date = date max_date = date
if d["decisions_ue"]: if d["decisions_ue"]:
for dec_ue in d["decisions_ue"].values(): for dec_ue in d["decisions_ue"].values():
if dec_ue: if dec_ue:
date = ndb.DateDMYtoISO(dec_ue["event_date"]) date = ndb.DateDMYtoISO(dec_ue["event_date"])
if date > max_date: # decision plus recente if date and date > max_date: # decision plus recente
max_date = date max_date = date
# Code semestre precedent # Code semestre precedent
if with_prev: # optionnel car un peu long... if with_prev: # optionnel car un peu long...

View File

@ -56,7 +56,7 @@ from PIL import Image as PILImage
from flask import g, url_for, request from flask import g, url_for, request
from config import Config from config import Config
from app import log
from app.scodoc.sco_vdi import ApoEtapeVDI from app.scodoc.sco_vdi import ApoEtapeVDI
from app.scodoc.sco_xml import quote_xml_attr from app.scodoc.sco_xml import quote_xml_attr
from app.scodoc.sco_codes_parcours import NOTES_TOLERANCE, CODES_EXPL from app.scodoc.sco_codes_parcours import NOTES_TOLERANCE, CODES_EXPL