forked from ScoDoc/ScoDoc
trois bugs épars
This commit is contained in:
parent
c14684a1dc
commit
dca51d1ce4
@ -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}"
|
||||
|
@ -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))
|
||||
|
@ -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")
|
||||
|
@ -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
|
||||
|
@ -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:
|
||||
|
@ -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,
|
||||
},
|
||||
),
|
||||
(
|
||||
|
@ -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
|
||||
|
@ -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 ')
|
||||
|
@ -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...
|
||||
|
@ -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
|
||||
|
Loading…
Reference in New Issue
Block a user