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

View File

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