amélioration formulaire création module

This commit is contained in:
Emmanuel Viennet 2022-02-02 21:13:39 +01:00
parent 154dc5283e
commit 4469d61221
5 changed files with 109 additions and 91 deletions

View File

@ -227,7 +227,6 @@ class BulletinBUT(ResultatsSemestreBUT):
"date_debut": formsemestre.date_debut.isoformat(), "date_debut": formsemestre.date_debut.isoformat(),
"date_fin": formsemestre.date_fin.isoformat(), "date_fin": formsemestre.date_fin.isoformat(),
"annee_universitaire": self.formsemestre.annee_scolaire_str(), "annee_universitaire": self.formsemestre.annee_scolaire_str(),
"inscription": "TODO-MM-JJ", # XXX TODO
"numero": formsemestre.semestre_id, "numero": formsemestre.semestre_id,
"groupes": [], # XXX TODO "groupes": [], # XXX TODO
"absences": { "absences": {

View File

@ -123,9 +123,6 @@ def module_create(
Sinon, donne le choix de l'UE de rattachement et utilise la première Sinon, donne le choix de l'UE de rattachement et utilise la première
matière de cette UE (si elle n'existe pas, la crée). matière de cette UE (si elle n'existe pas, la crée).
""" """
from app.scodoc import sco_formations
from app.scodoc import sco_edit_ue
if matiere_id: if matiere_id:
matiere = Matiere.query.get_or_404(matiere_id) matiere = Matiere.query.get_or_404(matiere_id)
ue = matiere.ue ue = matiere.ue
@ -160,7 +157,7 @@ def module_create(
else: else:
H += [ H += [
f"""<h2>Création {object_name} dans la matière {matiere.titre}, f"""<h2>Création {object_name} dans la matière {matiere.titre},
(UE {ue.acronyme})</h2> (UE {ue.acronyme}), semestre {ue.semestre_idx}</h2>
""" """
] ]
@ -534,19 +531,15 @@ def module_edit(module_id=None):
formsemestres=FormSemestre.query.filter( formsemestres=FormSemestre.query.filter(
ModuleImpl.formsemestre_id == FormSemestre.id, ModuleImpl.formsemestre_id == FormSemestre.id,
ModuleImpl.module_id == module_id, ModuleImpl.module_id == module_id,
).all(), )
.order_by(FormSemestre.date_debut)
.all(),
), ),
] ]
if not unlocked: if not unlocked:
H.append( H.append(
"""<div class="ue_warning"><span>Formation verrouillée, seuls certains éléments peuvent être modifiés</span></div>""" """<div class="ue_warning"><span>Formation verrouillée, seuls certains éléments peuvent être modifiés</span></div>"""
) )
if in_use:
H.append(
"""<div class="ue_warning"><span>Module déjà utilisé dans des semestres,
soyez prudents !
</span></div>"""
)
if is_apc: if is_apc:
module_types = scu.ModuleType # tous les types module_types = scu.ModuleType # tous les types
else: else:
@ -728,30 +721,9 @@ def module_edit(module_id=None):
initvalues=module, initvalues=module,
submitlabel="Modifier ce module", submitlabel="Modifier ce module",
) )
# Affiche liste des formseemstre utilisant ce module
if in_use:
formsemestre_ids = {modimpl.formsemestre_id for modimpl in a_module.modimpls}
formsemestres = [FormSemestre.query.get(fid) for fid in formsemestre_ids]
formsemestres.sort(key=lambda f: f.date_debut)
items = [
f"""<a class="stdlink" href="{
url_for("notes.formsemestre_status", scodoc_dept=g.scodoc_dept, formsemestre_id=f.id )
}">{f.titre}</a>"""
for f in formsemestres
]
sem_descr = f"""
<div class="ue_warning">
<div>Ce module est utilisé dans les formsemestres suivants:</div>
<ul><li>
{"</li><li>".join( items )}
</li></ul>
</div>
"""
else:
sem_descr = ""
# #
if tf[0] == 0: if tf[0] == 0:
return "\n".join(H) + tf[1] + sem_descr + html_sco_header.sco_footer() return "\n".join(H) + tf[1] + html_sco_header.sco_footer()
elif tf[0] == -1: elif tf[0] == -1:
return flask.redirect( return flask.redirect(
url_for( url_for(

View File

@ -244,18 +244,19 @@ def ue_edit(ue_id=None, create=False, formation_id=None, default_semestre_idx=No
"""Formulaire modification ou création d'une UE""" """Formulaire modification ou création d'une UE"""
create = int(create) create = int(create)
if not create: if not create:
U = ue_list(args={"ue_id": ue_id}) ue: UniteEns = UniteEns.query.get_or_404(ue_id)
if not U: ue_dict = ue.to_dict()
raise ScoValueError("UE inexistante !") formation_id = ue.formation_id
U = U[0] title = f"Modification de l'UE {ue.acronyme} {ue.titre}"
formation_id = U["formation_id"] initvalues = ue_dict
title = "Modification de l'UE %(titre)s" % U
initvalues = U
submitlabel = "Modifier les valeurs" submitlabel = "Modifier les valeurs"
can_change_semestre_id = ue.modules.count() == 0
else: else:
ue = None
title = "Création d'une UE" title = "Création d'une UE"
initvalues = {"semestre_idx": default_semestre_idx} initvalues = {"semestre_idx": default_semestre_idx}
submitlabel = "Créer cette UE" submitlabel = "Créer cette UE"
can_change_semestre_id = True
formation = Formation.query.get(formation_id) formation = Formation.query.get(formation_id)
if not formation: if not formation:
raise ScoValueError(f"Formation inexistante ! (id={formation_id})") raise ScoValueError(f"Formation inexistante ! (id={formation_id})")
@ -282,7 +283,7 @@ def ue_edit(ue_id=None, create=False, formation_id=None, default_semestre_idx=No
ue_types_names = [sco_codes_parcours.UE_TYPE_NAME[k] for k in ue_types] ue_types_names = [sco_codes_parcours.UE_TYPE_NAME[k] for k in ue_types]
ue_types = [str(x) for x in ue_types] ue_types = [str(x) for x in ue_types]
fw = [ form_descr = [
("ue_id", {"input_type": "hidden"}), ("ue_id", {"input_type": "hidden"}),
("create", {"input_type": "hidden", "default": create}), ("create", {"input_type": "hidden", "default": create}),
("formation_id", {"input_type": "hidden", "default": formation_id}), ("formation_id", {"input_type": "hidden", "default": formation_id}),
@ -296,18 +297,28 @@ def ue_edit(ue_id=None, create=False, formation_id=None, default_semestre_idx=No
"type": "int", "type": "int",
}, },
), ),
( ]
"semestre_idx", if can_change_semestre_id:
{ form_descr += [
"input_type": "menu", (
"type": "int", "semestre_idx",
"allow_null": False, {
"title": parcours.SESSION_NAME.capitalize(), "input_type": "menu",
"explanation": "%s de l'UE dans la formation" % parcours.SESSION_NAME, "type": "int",
"labels": ["non spécifié"] + [str(x) for x in semestres_indices], "allow_null": False,
"allowed_values": [""] + semestres_indices, "title": parcours.SESSION_NAME.capitalize(),
}, "explanation": "%s de l'UE dans la formation"
), % parcours.SESSION_NAME,
"labels": ["non spécifié"] + [str(x) for x in semestres_indices],
"allowed_values": [""] + semestres_indices,
},
),
]
else:
form_descr += [
("semestre_idx", {"default": ue.semestre_idx, "input_type": "hidden"}),
]
form_descr += [
( (
"type", "type",
{ {
@ -377,7 +388,7 @@ def ue_edit(ue_id=None, create=False, formation_id=None, default_semestre_idx=No
), ),
] ]
if create and not parcours.UE_IS_MODULE and not is_apc: if create and not parcours.UE_IS_MODULE and not is_apc:
fw.append( form_descr.append(
( (
"create_matiere", "create_matiere",
{ {
@ -391,14 +402,33 @@ def ue_edit(ue_id=None, create=False, formation_id=None, default_semestre_idx=No
tf = TrivialFormulator( tf = TrivialFormulator(
request.base_url, request.base_url,
scu.get_request_args(), scu.get_request_args(),
fw, form_descr,
initvalues=initvalues, initvalues=initvalues,
submitlabel=submitlabel, submitlabel=submitlabel,
) )
if tf[0] == 0: if tf[0] == 0:
ue_div = """<div id="ue_list_code"></div>""" if ue and ue.modules.count():
modules_div = f"""<div id="ue_list_modules">
<div><b>{ue.modules.count()} modules sont rattachés
à cette UE</b> du semestre S{ue.semestre_idx},
elle ne peut donc pas être changée de semestre.</div>
<ul>"""
for m in ue.modules:
modules_div += f"""<li><a class="stdlink" href="{url_for(
"notes.module_edit",scodoc_dept=g.scodoc_dept, module_id=m.id)}">{m.code} {m.titre}</a></li>"""
modules_div += """</ul></div>"""
else:
modules_div = ""
bonus_div = """<div id="bonus_description"></div>""" bonus_div = """<div id="bonus_description"></div>"""
return "\n".join(H) + tf[1] + bonus_div + ue_div + html_sco_header.sco_footer() ue_div = """<div id="ue_list_code"></div>"""
return (
"\n".join(H)
+ tf[1]
+ modules_div
+ bonus_div
+ ue_div
+ html_sco_header.sco_footer()
)
else: else:
if create: if create:
if not tf[2]["ue_code"]: if not tf[2]["ue_code"]:

View File

@ -1771,40 +1771,54 @@ ul.notes_module_list {
} }
div#ue_list_code { div#ue_list_code {
background-color: rgb(220,220,220); background-color: rgb(155, 218, 155);
font-size: small; padding: 10px;
padding-left: 4px; border: 1px solid blue;
padding-bottom: 1px; border-radius: 10px;
padding: 10px;
margin-top: 10px; margin-top: 10px;
margin: 3ex; margin-right: 15px;
} }
ul.notes_module_list { ul.notes_module_list {
list-style-type: none; list-style-type: none;
} }
div#ue_list_modules {
background-color: rgb(191, 242, 255);
border: 1px solid blue;
border-radius: 10px;
padding: 10px;
margin-top: 10px;
margin-right: 15px;
}
div#ue_list_etud_validations { div#ue_list_etud_validations {
background-color: rgb(220,250,220); background-color: rgb(220,250,220);
padding-left: 4px; padding-left: 4px;
padding-bottom: 1px; padding-bottom: 1px;
margin: 3ex; margin: 3ex;
} }
div#ue_list_etud_validations span { div#ue_list_etud_validations span {
font-weight: bold; font-weight: bold;
} }
span.ue_share { span.ue_share {
font-weight: bold; font-weight: bold;
} }
div.ue_warning { div.ue_warning {
border: 1px solid red; border: 1px solid red;
background-color: rgb(250,220,220); border-radius: 10px;
margin: 3ex; background-color: rgb(250,220,220);
padding-left: 1ex; margin-top: 10px;
padding-right: 1ex; margin-right: 15px;
margin-bottom: 10px;
padding: 10px;
}
div.ue_warning:first-child {
font-weight: bold;
} }
div.ue_warning span:before { div.ue_warning span:before {
content: url(/ScoDoc/static/icons/warning_img.png); content: url(/ScoDoc/static/icons/warning_img.png);
vertical-align: -80%; vertical-align: -80%;

View File

@ -1,3 +1,4 @@
{# -*- mode: jinja-html -*- #}
<div class="help"> <div class="help">
<p class="help"> <p class="help">
Les modules sont décrits dans le programme pédagogique. Un module est pour ce Les modules sont décrits dans le programme pédagogique. Un module est pour ce
@ -24,24 +25,26 @@
<a href="https://scodoc.org/BUT" target="_blank">la documentation</a>. <a href="https://scodoc.org/BUT" target="_blank">la documentation</a>.
</p> </p>
{%endif%} {%endif%}
</div>
{% if formsemestres %} {% if formsemestres %}
<p class="help"> <div class="ue_warning"> <span><b>Module déjà utilisé dans des semestres, soyez prudents !</b></span>
Ce module est utilisé dans des semestres déjà mis en place, il faut prêter attention <p class="help">
aux conséquences des changements effectués ici: par exemple les coefficients vont modifier Ce module est utilisé dans des semestres déjà mis en place, il faut prêter attention
les notes moyennes calculées. Les modules déjà utilisés ne peuvent pas être changés de semestre, ni détruits. aux conséquences des changements effectués ici: par exemple les coefficients vont modifier
Si vous souhaitez faire cela, allez d'abord modifier les semestres concernés pour déselectionner le module. les notes moyennes calculées. Les modules déjà utilisés ne peuvent pas être changés de semestre, ni détruits.
</p> Si vous souhaitez faire cela, allez d'abord modifier les semestres concernés pour déselectionner le module.
<h4>Semestres utilisant ce module:</h4> </p>
<ul> <h4>Semestres utilisant ce module:</h4>
<ul>
{%for formsemestre in formsemestres %} {%for formsemestre in formsemestres %}
<li><a class="stdlink" href="{{ <li><a class="stdlink" href="{{
url_for('notes.formsemestre_status', url_for('notes.formsemestre_status',
scodoc_dept=g.scodoc_dept, formsemestre_id=formsemestre.id) scodoc_dept=g.scodoc_dept, formsemestre_id=formsemestre.id)
}}">{{formsemestre.titre_mois()}}</a> }}">{{formsemestre.titre_mois()}}</a>
</li> </li>
{% endfor %} {% endfor %}
</ul> </ul>
{%endif%} </div>
{%endif%}
</div>