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: def can_change_groups(self, user: User = None) -> bool:
"""Vrai si l'utilisateur (par def. current) peut changer les groupes dans """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: if not self.etat:
return False # semestre verrouillé return False # semestre verrouillé

View File

@ -282,18 +282,18 @@ class GroupDescr(db.Model):
return False return False
return True return True
def set_name( def set_name(self, group_name: str, dest_url: str = None):
self, group_name: str, edt_id: str | bool = False, dest_url: str = None
):
"""Set group name, and optionally edt_id. """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. dest_url is used for error messages.
""" """
if not self.partition.formsemestre.can_change_groups(): if not self.partition.formsemestre.can_change_groups():
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 !")
if self.group_name is None: if self.group_name is None:
raise ValueError("can't set a name to default group") raise ValueError("can't set a name to default group")
if not self.partition.groups_editable:
raise AccessDenied("Partition non éditable")
if group_name: if group_name:
group_name = group_name.strip() group_name = group_name.strip()
if not group_name: if not group_name:
@ -306,16 +306,22 @@ class GroupDescr(db.Model):
) )
self.group_name = group_name 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.add(self)
db.session.commit() db.session.commit()
sco_cache.invalidate_formsemestre( sco_cache.invalidate_formsemestre(
formsemestre_id=self.partition.formsemestre_id 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"): def remove_etud(self, etud: "Identite"):
"Enlève l'étudiant de ce groupe s'il en fait partie (ne fait rien sinon)" "Enlève l'étudiant de ce groupe s'il en fait partie (ne fait rien sinon)"
if etud in self.etuds: 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): for index, resp in enumerate(formsemestre.responsables):
initvalues[resp_fields[index]] = uid2display.get(resp.id) 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 # Liste des ID de semestres
if formation.type_parcours is not None: 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: if edit:
formtit = f""" formtit = f"""
<p><a class="stdlink" href="{url_for("notes.formsemestre_edit_uecoefs", <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)) db.session.get(ApcParcours, int(parcour_id_str))
for parcour_id_str in tf[2]["parcours"] 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.add(formsemestre)
db.session.commit() db.session.commit()
# --- Crée ou met à jour les groupes de parcours BUT # --- Crée ou met à jour les groupes de parcours BUT
formsemestre.setup_parcours_groups() formsemestre.setup_parcours_groups()
# peut être nécessaire dans certains cas: # peut être nécessaire dans certains cas:

View File

@ -86,7 +86,10 @@ def group_rename(group_id):
"size": 12, "size": 12,
"allow_null": False, "allow_null": False,
"validator": lambda val, _: len(val) < GROUPNAME_STR_LEN, "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, "size": 12,
"allow_null": True, "allow_null": True,
"explanation": """optionnel : identifiant du groupe dans le logiciel "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.""", 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) return flask.redirect(dest_url)
else: else:
# form submission # 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é") flash("groupe modifié")
return flask.redirect(dest_url) return flask.redirect(dest_url)

View File

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

View File

@ -251,7 +251,7 @@
div.innerHTML = ` div.innerHTML = `
<span class="editing move">||</span> <span class="editing move">||</span>
<span>${groupe.group_name} ${edt_id_str}</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>`; <span class="editing suppr">❌</span>`;
div.addEventListener("click", filtre); div.addEventListener("click", filtre);