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
def log(msg: str):
def log(msg: str, silent_test=True):
"""log a message.
If Flask app, use configured logger, else stderr."""
if silent_test and current_app.config["TESTING"]:
return
try:
dept = getattr(g, "scodoc_dept", "")
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)"""
o = sco_edit_ue.do_ue_list({"ue_id": ue_id})[0]
# 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
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)"
from app.scodoc import sco_formations
from app.scodoc import sco_parcours_dut
@ -420,10 +420,10 @@ def ue_delete(
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
editer (si non verrouillée).
"""
@ -484,22 +484,29 @@ def ue_list(formation_id=None, msg="", REQUEST=None):
]
if locked:
H.append(
"""<p class="help">Cette formation est verrouillée car %d semestres verrouillés s'y réferent.
Si vous souhaitez modifier cette formation (par exemple pour y ajouter un module), vous devez:
f"""<p class="help">Cette formation est verrouillée car
{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>
<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 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>
<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 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>"""
% len(locked)
)
if msg:
H.append('<p class="msg">' + msg + "</p>")
if has_duplicate_ue_codes:
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
@ -914,7 +921,7 @@ def do_ue_edit(args, bypass_lock=False, dont_invalidate_cache=False):
# 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"
ue_id = id
value = value.strip("-_ \t")

View File

@ -39,6 +39,7 @@ from flask import g
from flask_login import current_user
from flask import request
from app import log
import app.scodoc.sco_utils as scu
import app.scodoc.notesdb as ndb
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":
semestre_id_labels.append("pas de semestres")
else:
semestre_id_labels.append(str(sid))
semestre_id_labels.append(f"S{sid}")
# Liste des modules dans ce semestre de cette formation
# on pourrait faire un simple module_list( )
# 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>""")
return "\n".join(H) + F
# 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 = [
("formsemestre_id", {"input_type": "hidden"}),
("etudid", {"input_type": "hidden"}),
@ -137,8 +138,8 @@ def formsemestre_ext_create_form(etudid, formsemestre_id, REQUEST=None):
{
"input_type": "menu",
"title": "Indice du semestre dans le cursus",
"allowed_values": semestre_ids_str,
"labels": semestre_ids_str,
"allowed_values": semestre_ids_list,
"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"]:
key = "moduleimpls_%s" % ue_id
if key in initvalues:
initvalues[key].append(mod["moduleimpl_id"])
initvalues[key].append(str(mod["moduleimpl_id"]))
else:
initvalues[key] = [mod["moduleimpl_id"]]
initvalues[key] = [str(mod["moduleimpl_id"])]
break
descr = [
@ -506,7 +506,7 @@ def formsemestre_inscription_option(etudid, formsemestre_id, REQUEST=None):
"sec_%s" % ue_id,
{
"input_type": "separator",
"title": """<b>%s :</b> <a href="#" onclick="chkbx_select('%s', true);">inscrire</a>|<a href="#" onclick="chkbx_select('%s', false);">désinscrire</a> à tous les modules"""
"title": """<b>%s :</b> <a href="#" onclick="chkbx_select('%s', true);">inscrire</a> | <a href="#" onclick="chkbx_select('%s', false);">désinscrire</a> à tous les modules"""
% (ue_descr, ue_id, ue_id),
},
)
@ -518,7 +518,7 @@ def formsemestre_inscription_option(etudid, formsemestre_id, REQUEST=None):
"input_type": "checkbox",
"title": "",
"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],
"vertical": True,
},
@ -569,18 +569,21 @@ function chkbx_select(field_id, state) {
insdict[ins["moduleimpl_id"]] = ins
for ue in ues:
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:
del a_desinscrire[moduleimpl_id]
# 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:
del a_desinscrire[moduleimpl_id]
a_inscrire = set()
for ue in ues:
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:
for ins in inscr:
if ins["moduleimpl_id"] in a_inscrire:
@ -638,8 +641,8 @@ function chkbx_select(field_id, state) {
+ "</p>"
)
H.append("</li></ul>")
modulesimpls_ainscrire = ",".join(a_inscrire)
modulesimpls_adesinscrire = ",".join(a_desinscrire)
modulesimpls_ainscrire = ",".join(str(x) for x in a_inscrire)
modulesimpls_adesinscrire = ",".join(str(x) for x in a_desinscrire)
H.append(
"""<form action="do_moduleimpl_incription_options">
<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
"""
if isinstance(modulesimpls_ainscrire, int):
modulesimpls_ainscrire = str(modulesimpls_ainscrire)
if isinstance(modulesimpls_adesinscrire, int):
modulesimpls_adesinscrire = str(modulesimpls_adesinscrire)
if modulesimpls_ainscrire:
a_inscrire = modulesimpls_ainscrire.split(",")
a_inscrire = [int(x) for x in modulesimpls_ainscrire.split(",")]
else:
a_inscrire = []
if modulesimpls_adesinscrire:
a_desinscrire = modulesimpls_adesinscrire.split(",")
a_desinscrire = [int(x) for x in modulesimpls_adesinscrire.split(",")]
else:
a_desinscrire = []
# inscriptions

View File

@ -317,8 +317,10 @@ def formsemestre_validation_etud_form(
H.append(form_decision_manuelle(Se, formsemestre_id, etudid))
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>"""
% (etudid, formsemestre_id)
f"""<div class="link_defaillance">Ou <a class="stdlink" href="{
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 ')

View File

@ -320,13 +320,13 @@ def dict_pvjury(
# Cherche la date de decision (sem ou UE) la plus récente:
if d["decision_sem"]:
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
if d["decisions_ue"]:
for dec_ue in d["decisions_ue"].values():
if dec_ue:
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
# Code semestre precedent
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 config import Config
from app import log
from app.scodoc.sco_vdi import ApoEtapeVDI
from app.scodoc.sco_xml import quote_xml_attr
from app.scodoc.sco_codes_parcours import NOTES_TOLERANCE, CODES_EXPL