Améliore code création formsemestres.

This commit is contained in:
Emmanuel Viennet 2022-10-01 15:34:39 +02:00
parent 0c5e338970
commit 268b75d441
1 changed files with 89 additions and 76 deletions

View File

@ -93,8 +93,9 @@ def formsemestre_createwithmodules():
def formsemestre_editwithmodules(formsemestre_id):
"""Page modification semestre"""
# portage from dtml
sem = sco_formsemestre.get_formsemestre(formsemestre_id)
formsemestre: FormSemestre = FormSemestre.query.filter_by(
id=formsemestre_id, dept_id=g.scodoc_dept_id
).first_or_404()
H = [
html_sco_header.html_sem_header(
"Modification du semestre",
@ -103,14 +104,14 @@ def formsemestre_editwithmodules(formsemestre_id):
bodyOnLoad="init_tf_form('')",
)
]
if not sem["etat"]:
if not formsemestre.etat:
H.append(
f"""<p>{scu.icontag(
"lock_img", border="0", title="Semestre verrouillé")
}<b>Ce semestre est verrouillé.</b></p>"""
)
else:
r = do_formsemestre_createwithmodules(edit=1)
r = do_formsemestre_createwithmodules(edit=True, formsemestre=formsemestre)
if isinstance(r, str):
H.append(r)
else:
@ -133,7 +134,7 @@ def formsemestre_editwithmodules(formsemestre_id):
return "\n".join(H) + html_sco_header.sco_footer()
def can_edit_sem(formsemestre_id="", sem=None):
def can_edit_sem(formsemestre_id: int = None, sem=None):
"""Return sem if user can edit it, False otherwise"""
sem = sem or sco_formsemestre.get_formsemestre(formsemestre_id)
if not current_user.has_permission(Permission.ScoImplement): # pas chef
@ -150,20 +151,18 @@ resp_fields = [
]
def do_formsemestre_createwithmodules(edit=False):
"Form choix modules / responsables et creation formsemestre"
# Fonction accessible à tous, controle acces à la main:
def do_formsemestre_createwithmodules(edit=False, formsemestre: FormSemestre = None):
"Form choix modules / responsables et création formsemestre"
vals = scu.get_request_args()
if edit:
formsemestre_id = int(vals["formsemestre_id"])
sem = sco_formsemestre.get_formsemestre(formsemestre_id)
formsemestre = FormSemestre.query.get_or_404(formsemestre_id)
# Fonction accessible à tous, contrôle d'acces à la main:
if not current_user.has_permission(Permission.ScoImplement):
if not edit:
# il faut ScoImplement pour créer un semestre
raise AccessDenied("vous n'avez pas le droit d'effectuer cette opération")
else:
if not sem["resp_can_edit"] or current_user.id not in sem["responsables"]:
if not formsemestre.resp_can_edit or current_user.id not in (
u.id for u in formsemestre.responsables
):
raise AccessDenied(
"vous n'avez pas le droit d'effectuer cette opération"
)
@ -189,8 +188,8 @@ def do_formsemestre_createwithmodules(edit=False):
module_ids_set = set()
else:
# setup form init values
initvalues = sem
semestre_id = initvalues["semestre_id"]
initvalues = formsemestre.to_dict()
semestre_id = formsemestre.semestre_id
# add associated modules to tf-checked:
module_ids_existing = [modimpl.module.id for modimpl in formsemestre.modimpls]
module_ids_set = set(module_ids_existing)
@ -200,23 +199,23 @@ def do_formsemestre_createwithmodules(edit=False):
modimpl.responsable_id,
f"inconnu numéro {modimpl.responsable_id} resp. de {modimpl.id} !",
)
for index, resp in enumerate(sem["responsables"]):
initvalues[resp_fields[index]] = uid2display.get(resp)
for index, resp in enumerate(formsemestre.responsables):
initvalues[resp_fields[index]] = uid2display.get(resp.id)
# Liste des ID de semestres
if formation.type_parcours is not None:
parcours = sco_codes_parcours.get_parcours_from_code(formation.type_parcours)
NB_SEM = parcours.NB_SEM
nb_sem = parcours.NB_SEM
else:
NB_SEM = 10 # fallback, max 10 semestres
if NB_SEM == 1:
nb_sem = 10 # fallback, max 10 semestres
if nb_sem == 1:
semestre_id_list = [-1]
else:
if edit and is_apc:
# en APC, ne permet pas de changer de semestre
semestre_id_list = [formsemestre.semestre_id]
else:
semestre_id_list = list(range(1, NB_SEM + 1))
semestre_id_list = list(range(1, nb_sem + 1))
if not is_apc:
# propose "pas de semestre" seulement en classique
semestre_id_list.insert(0, -1)
@ -345,7 +344,7 @@ def do_formsemestre_createwithmodules(edit=False):
# et ajoute les étapes du semestre qui ne sont pas dans la liste (soit la liste a changé, soit l'étape a été ajoutée manuellement)
etapes_set = {et[0] for et in etapes}
if edit:
for etape_vdi in sem["etapes"]:
for etape_vdi in formsemestre.etapes_apo_vdi():
if etape_vdi.etape not in etapes_set:
etapes.append((etape_vdi.etape, "inconnue"))
modform.append(
@ -415,7 +414,7 @@ def do_formsemestre_createwithmodules(edit=False):
"allow_null": not sco_preferences.get_preference(
"always_require_apo_sem_codes"
)
or formsemestre.modalite == "EXT",
or (formsemestre and formsemestre.modalite == "EXT"),
},
)
)
@ -429,20 +428,23 @@ def do_formsemestre_createwithmodules(edit=False):
"allow_null": not sco_preferences.get_preference(
"always_require_apo_sem_codes"
)
or formsemestre.modalite == "EXT",
or (formsemestre and formsemestre.modalite == "EXT"),
},
)
)
if edit:
formtit = f"""
<p><a href="formsemestre_edit_uecoefs?formsemestre_id={formsemestre_id}"
>Modifier les coefficients des UE capitalisées</a></p>
<p><a href="{url_for("notes.formsemestre_edit_uecoefs",
scodoc_dept=g.scodoc_dept, formsemestre_id=formsemestre.id)
}">Modifier les coefficients des UE capitalisées</a>
</p>
<h3>Sélectionner les modules, leurs responsables et les étudiants
à inscrire:</h3>
"""
else:
formtit = """<h3>Sélectionner les modules et leurs responsables</h3>
<p class="help">Si vous avez des parcours (options), dans un premier
<p class="help">
Si vous avez des parcours (options), dans un premier temps
ne sélectionnez que les modules du tronc commun, puis après inscriptions,
revenez ajouter les modules de parcours en sélectionnant les groupes d'étudiants
à y inscrire.
@ -548,7 +550,9 @@ def do_formsemestre_createwithmodules(edit=False):
)
]
if edit:
sem["parcours"] = [str(parcour.id) for parcour in formsemestre.parcours]
initvalues["parcours"] = [
str(parcour.id) for parcour in formsemestre.parcours
]
else:
modform += [
(
@ -624,7 +628,7 @@ def do_formsemestre_createwithmodules(edit=False):
else:
disabled = ""
fcg = f'<select name="{select_name}" {disabled}>'
default_group_id = sco_groups.get_default_group(formsemestre_id)
default_group_id = sco_groups.get_default_group(formsemestre.id)
fcg += f"""<option value="{default_group_id}" {
opt_selected(default_group_id)}>Tous</option>"""
@ -698,7 +702,7 @@ def do_formsemestre_createwithmodules(edit=False):
# Etapes:
if edit:
n = 1
for etape_vdi in sem["etapes"]:
for etape_vdi in formsemestre.etapes_apo_vdi():
initvalues["etape_apo" + str(n)] = etape_vdi.etape
initvalues["vdi_apo" + str(n)] = etape_vdi.vdi
n += 1
@ -742,20 +746,23 @@ def do_formsemestre_createwithmodules(edit=False):
# check dates
if ndb.DateDMYtoISO(tf[2]["date_debut"]) > ndb.DateDMYtoISO(tf[2]["date_fin"]):
msg = '<ul class="tf-msg"><li class="tf-msg">Dates de début et fin incompatibles !</li></ul>'
if (
formsemestre.modalite
!= "EXT" # n'impose pas d'Apo pour les sem. extérieurs
and sco_preferences.get_preference("always_require_apo_sem_codes")
sco_preferences.get_preference("always_require_apo_sem_codes")
and not any(
[tf[2]["etape_apo" + str(n)] for n in range(0, scu.EDIT_NB_ETAPES + 1)]
)
# n'impose pas d'Apo pour les sem. extérieurs
and ((formsemestre is None) or formsemestre.modalite != "EXT")
):
msg = '<ul class="tf-msg"><li class="tf-msg">Code étape Apogée manquant</li></ul>'
if tf[0] == 0 or msg:
return f"""<p>Formation <a class="discretelink" href="{
url_for("notes.ue_table", scodoc_dept=g.scodoc_dept, formation_id=formation_id)
}"><em>{formation.titre}</em> ({formation.acronyme}), version {formation.version}, code {formation.formation_code}</a>
url_for("notes.ue_table", scodoc_dept=g.scodoc_dept,
formation_id=formation_id)
}"><em>{formation.titre}</em> ({formation.acronyme}), version {
formation.version}, code {formation.formation_code}</a>
</p>
{msg}
{tf[1]}
@ -849,7 +856,7 @@ def do_formsemestre_createwithmodules(edit=False):
for module_id in module_ids_tocreate:
modargs = {
"module_id": module_id,
"formsemestre_id": formsemestre_id,
"formsemestre_id": formsemestre.id,
"responsable_id": tf[2]["MI" + str(module_id)],
}
moduleimpl_id = sco_moduleimpl.do_moduleimpl_create(modargs)
@ -873,7 +880,7 @@ def do_formsemestre_createwithmodules(edit=False):
)
sco_moduleimpl.do_moduleimpl_inscrit_etuds(
moduleimpl_id,
formsemestre_id,
formsemestre.id,
etudids,
)
msg += [
@ -887,25 +894,26 @@ def do_formsemestre_createwithmodules(edit=False):
)
#
ok, diag = formsemestre_delete_moduleimpls(
formsemestre_id, module_ids_todelete
formsemestre.id, module_ids_todelete
)
msg += diag
for module_id in module_ids_toedit:
moduleimpl_id = sco_moduleimpl.moduleimpl_list(
formsemestre_id=formsemestre_id, module_id=module_id
formsemestre_id=formsemestre.id, module_id=module_id
)[0]["moduleimpl_id"]
modargs = {
"moduleimpl_id": moduleimpl_id,
"module_id": module_id,
"formsemestre_id": formsemestre_id,
"formsemestre_id": formsemestre.id,
"responsable_id": tf[2]["MI" + str(module_id)],
}
sco_moduleimpl.do_moduleimpl_edit(
modargs, formsemestre_id=formsemestre_id
modargs, formsemestre_id=formsemestre.id
)
mod = sco_edit_module.module_list({"module_id": module_id})[0]
# --- Association des parcours
formsemestre = FormSemestre.query.get(formsemestre_id)
if formsemestre is None:
formsemestre = FormSemestre.query.get(formsemestre_id)
if "parcours" in tf[2]:
formsemestre.parcours = [
ApcParcours.query.get(int(parcour_id_str))
@ -918,24 +926,29 @@ def do_formsemestre_createwithmodules(edit=False):
# --- Fin
if edit:
if msg:
msg_html = (
'<div class="ue_warning"><span>Attention !<ul><li>'
+ "</li><li>".join(msg)
+ "</li></ul></span></div>"
)
if ok:
msg_html += "<p>Modification effectuée</p>"
else:
msg_html += "<p>Modules non modifiés</p>"
msg_html += (
'<a href="formsemestre_status?formsemestre_id=%s">retour au tableau de bord</a>'
% formsemestre_id
)
return msg_html
return f"""
<div class="ue_warning"><span>Attention !<ul>
<li>
{"</li><li>".join(msg)}
</li>
</ul></span>
</div>
{"<p>Modification effectuée</p>" if ok
else "<p>Modules non modifiés</p>"
}
<a class="stdlink" href="{
url_for('notes.formsemestre_status',
scodoc_dept=g.scodoc_dept, formsemestre_id=formsemestre.id)
}">retour au tableau de bord</a>
"""
else:
flash("Semestre modifié")
return flask.redirect(
"formsemestre_status?formsemestre_id=%s&head_message=Semestre modifié"
% formsemestre_id
url_for(
"notes.formsemestre_status",
scodoc_dept=g.scodoc_dept,
formsemestre_id=formsemestre.id,
)
)
else:
flash("Nouveau semestre créé")
@ -943,7 +956,7 @@ def do_formsemestre_createwithmodules(edit=False):
url_for(
"notes.formsemestre_status",
scodoc_dept=g.scodoc_dept,
formsemestre_id=formsemestre_id,
formsemestre_id=formsemestre.id,
)
)
@ -1741,7 +1754,7 @@ def formsemestre_edit_uecoefs(formsemestre_id, err_ue_id=None):
if tf[0] == 0:
return "\n".join(H) + tf[1] + footer
elif tf[0] == -1:
return "<h4>annulation</h4>" # XXX
return "<h4>annulation</h4>"
else:
# change values
# 1- supprime les coef qui ne sont plus forcés
@ -1790,31 +1803,31 @@ def formsemestre_edit_uecoefs(formsemestre_id, err_ue_id=None):
)
if ue_modified or ue_deleted:
z = ["""<h3>Modification effectuées</h3>"""]
message = ["""<h3>Modification effectuées</h3>"""]
if ue_modified:
z.append("""<h4>Coefs modifiés dans les UE:<h4><ul>""")
message.append("""<h4>Coefs modifiés dans les UE:<h4><ul>""")
for ue in ue_modified:
z.append("<li>%(acronyme)s : %(coef)s</li>" % ue)
z.append("</ul>")
message.append("<li>%(acronyme)s : %(coef)s</li>" % ue)
message.append("</ul>")
if ue_deleted:
z.append("""<h4>Coefs supprimés dans les UE:<h4><ul>""")
message.append("""<h4>Coefs supprimés dans les UE:<h4><ul>""")
for ue in ue_deleted:
z.append("<li>%(acronyme)s</li>" % ue)
z.append("</ul>")
message.append("<li>%(acronyme)s</li>" % ue)
message.append("</ul>")
else:
z = ["""<h3>Aucune modification</h3>"""]
message = ["""<h3>Aucune modification</h3>"""]
sco_cache.invalidate_formsemestre(
formsemestre_id=formsemestre_id
) # > modif coef UE cap (modifs notes de _certains_ etudiants)
header = html_sco_header.html_sem_header("Coefficients des UE du semestre")
return (
header
+ "\n".join(z)
+ """<p><a href="formsemestre_status?formsemestre_id=%s">Revenir au tableau de bord</a></p>"""
% formsemestre_id
+ footer
)
return f"""{html_sco_header.html_sem_header("Coefficients des UE du semestre")}
{" ".join(message)}
<p><a class="stdlink" href="{url_for("notes.formsemestre_status",
scodoc_dept=g.scodoc_dept, formsemestre_id=formsemestre_id)
}">Revenir au tableau de bord</a>
</p>
{footer}
"""
# ----- identification externe des sessions (pour SOJA et autres logiciels)