EDT: édition des edt_id du groupe tous et des groupes de parcours

This commit is contained in:
Emmanuel Viennet 2023-11-13 12:16:10 +01:00
parent 78d72d2d54
commit 46288cd52d
6 changed files with 52 additions and 14 deletions

View File

@ -631,7 +631,7 @@ class FormSemestre(db.Model):
def can_change_groups(self, user: User = None) -> bool:
"""Vrai si l'utilisateur (par def. current) peut changer les groupes dans
ce semestre: vérifie permission et verrouillage.
ce semestre: vérifie permission et verrouillage (mais pas si la partition est éditable).
"""
if not self.etat:
return False # semestre verrouillé

View File

@ -282,18 +282,18 @@ class GroupDescr(db.Model):
return False
return True
def set_name(
self, group_name: str, edt_id: str | bool = False, dest_url: str = None
):
def set_name(self, group_name: str, dest_url: str = None):
"""Set group name, and optionally edt_id.
Check permission and invalidate caches. Commit session.
Check permission (partition must be groups_editable)
and invalidate caches. Commit session.
dest_url is used for error messages.
"""
if not self.partition.formsemestre.can_change_groups():
raise AccessDenied("Vous n'avez pas le droit d'effectuer cette opération !")
if self.group_name is None:
raise ValueError("can't set a name to default group")
if not self.partition.groups_editable:
raise AccessDenied("Partition non éditable")
if group_name:
group_name = group_name.strip()
if not group_name:
@ -306,16 +306,22 @@ class GroupDescr(db.Model):
)
self.group_name = group_name
if edt_id is not False:
if isinstance(edt_id, str):
edt_id = edt_id.strip() or None
self.edt_id = edt_id
db.session.add(self)
db.session.commit()
sco_cache.invalidate_formsemestre(
formsemestre_id=self.partition.formsemestre_id
)
def set_edt_id(self, edt_id: str):
"Set edt_id. Check permission. Commit session."
if not self.partition.formsemestre.can_change_groups():
raise AccessDenied("Vous n'avez pas le droit d'effectuer cette opération !")
if isinstance(edt_id, str):
edt_id = edt_id.strip() or None
self.edt_id = edt_id
db.session.add(self)
db.session.commit()
def remove_etud(self, etud: "Identite"):
"Enlève l'étudiant de ce groupe s'il en fait partie (ne fait rien sinon)"
if etud in self.etuds:

View File

@ -214,6 +214,9 @@ def do_formsemestre_createwithmodules(edit=False, formsemestre: FormSemestre = N
)
for index, resp in enumerate(formsemestre.responsables):
initvalues[resp_fields[index]] = uid2display.get(resp.id)
group_tous = formsemestre.get_default_group()
if group_tous:
initvalues["edt_promo_id"] = group_tous.edt_id or ""
# Liste des ID de semestres
if formation.type_parcours is not None:
@ -458,6 +461,18 @@ def do_formsemestre_createwithmodules(edit=False, formsemestre: FormSemestre = N
},
)
)
modform.append(
(
"edt_promo_id",
{
"size": 32,
"title": "Identifiant EDT promo",
"explanation": """optionnel, identifiant du groupe "tous"
(promotion complète) dans l'emploi du temps.""",
"allow_null": True,
},
)
)
if edit:
formtit = f"""
<p><a class="stdlink" href="{url_for("notes.formsemestre_edit_uecoefs",
@ -970,8 +985,15 @@ def do_formsemestre_createwithmodules(edit=False, formsemestre: FormSemestre = N
db.session.get(ApcParcours, int(parcour_id_str))
for parcour_id_str in tf[2]["parcours"]
]
# --- Id edt du groupe par défault
group_tous = formsemestre.get_default_group()
if group_tous:
group_tous.edt_id = tf[2]["edt_promo_id"]
db.session.add(group_tous)
db.session.add(formsemestre)
db.session.commit()
# --- Crée ou met à jour les groupes de parcours BUT
formsemestre.setup_parcours_groups()
# peut être nécessaire dans certains cas:

View File

@ -86,7 +86,10 @@ def group_rename(group_id):
"size": 12,
"allow_null": False,
"validator": lambda val, _: len(val) < GROUPNAME_STR_LEN,
"explanation": "doit être unique dans cette partition",
"explanation": "doit être unique dans cette partition"
if group.partition.groups_editable
else "groupes non modifiables dans cette partition",
"enabled": group.partition.groups_editable,
},
),
(
@ -97,7 +100,7 @@ def group_rename(group_id):
"size": 12,
"allow_null": True,
"explanation": """optionnel : identifiant du groupe dans le logiciel
d'emploi du temps, pour le cas où les noms de gropupes ne seraient pas
d'emploi du temps, pour le cas où les noms de groupes ne seraient pas
les mêmes dans ScoDoc et dans l'emploi du temps.""",
},
),
@ -123,6 +126,9 @@ def group_rename(group_id):
return flask.redirect(dest_url)
else:
# form submission
group.set_name(tf[2]["group_name"], edt_id=tf[2]["edt_id"], dest_url=dest_url)
# Si la partition n'est pas editable, on ne peut changer que l'edt_id
group.set_edt_id(tf[2]["edt_id"])
if group.partition.groups_editable:
group.set_name(tf[2]["group_name"], dest_url=dest_url)
flash("groupe modifié")
return flask.redirect(dest_url)

View File

@ -91,6 +91,10 @@ body:not(.editionActivated) .editing {
.nonEditable .editing {
display: none;
}
.nonEditable .editing.rename {
display: inline;
}
.editionActivated #zoneChoix,
.editionActivated #zoneGroupes {

View File

@ -251,7 +251,7 @@
div.innerHTML = `
<span class="editing move">||</span>
<span>${groupe.group_name} ${edt_id_str}</span>
<span class="editing"><a href="/ScoDoc/{{formsemestre.departement.acronym}}/Scolarite/group_rename?group_id=${groupe.id}">✏️</a></span>
<span class="editing rename"><a href="/ScoDoc/{{formsemestre.departement.acronym}}/Scolarite/group_rename?group_id=${groupe.id}">✏️</a></span>
<span class="editing suppr">❌</span>`;
div.addEventListener("click", filtre);