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
|
# --------- 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}"
|
||||||
|
@ -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))
|
||||||
|
@ -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")
|
||||||
|
@ -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
|
||||||
|
@ -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:
|
||||||
|
@ -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,
|
||||||
},
|
},
|
||||||
),
|
),
|
||||||
(
|
(
|
||||||
|
@ -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 = [
|
||||||
@ -506,7 +506,7 @@ def formsemestre_inscription_option(etudid, formsemestre_id, REQUEST=None):
|
|||||||
"sec_%s" % ue_id,
|
"sec_%s" % ue_id,
|
||||||
{
|
{
|
||||||
"input_type": "separator",
|
"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),
|
% (ue_descr, ue_id, ue_id),
|
||||||
},
|
},
|
||||||
)
|
)
|
||||||
@ -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
|
||||||
|
@ -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 ')
|
||||||
|
@ -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...
|
||||||
|
@ -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
|
||||||
|
Loading…
Reference in New Issue
Block a user