Permission de modifier les inscrits à un module: dir. etud et resp. module. Closes #933

This commit is contained in:
Emmanuel Viennet 2024-06-13 22:03:17 +02:00
parent ba506d7f8e
commit 8163c6814c
5 changed files with 33 additions and 13 deletions

View File

@ -253,6 +253,27 @@ class ModuleImpl(ScoDocModel):
return False return False
return True return True
def can_change_inscriptions(self, user: User | None = None, raise_exc=True) -> bool:
"""check si user peut inscrire/désinsincrire des étudiants à ce module.
Autorise ScoEtudInscrit ou responsables semestre.
"""
user = current_user if user is None else user
if not self.formsemestre.etat:
if raise_exc:
raise ScoLockedSemError("Modification impossible: semestre verrouille")
return False
# -- check access
# resp. module ou ou perm. EtudInscrit ou resp. semestre
if (
user.id != self.responsable_id
and not user.has_permission(Permission.EtudInscrit)
and user.id not in (u.id for u in self.formsemestre.responsables)
):
if raise_exc:
raise AccessDenied(f"Modification impossible pour {user}")
return False
return True
def est_inscrit(self, etud: Identite) -> bool: def est_inscrit(self, etud: Identite) -> bool:
""" """
Vérifie si l'étudiant est bien inscrit au moduleimpl (même si DEM ou DEF au semestre). Vérifie si l'étudiant est bien inscrit au moduleimpl (même si DEM ou DEF au semestre).

View File

@ -30,9 +30,6 @@
import psycopg2 import psycopg2
from app import db
from app.models import Formation
from app.scodoc import scolog from app.scodoc import scolog
from app.scodoc import sco_cache from app.scodoc import sco_cache
import app.scodoc.notesdb as ndb import app.scodoc.notesdb as ndb
@ -56,7 +53,8 @@ _moduleimplEditor = ndb.EditableTable(
def do_moduleimpl_create(args): def do_moduleimpl_create(args):
"create a moduleimpl" "create a moduleimpl"
# TODO remplacer par une methode de ModuleImpl qui appelle super().create_from_dict() puis invalide le formsemestre # TODO remplacer par une methode de ModuleImpl qui appelle
# super().create_from_dict() puis invalide le formsemestre
cnx = ndb.GetDBConnexion() cnx = ndb.GetDBConnexion()
r = _moduleimplEditor.create(cnx, args) r = _moduleimplEditor.create(cnx, args)
sco_cache.invalidate_formsemestre( sco_cache.invalidate_formsemestre(

View File

@ -79,9 +79,9 @@ def moduleimpl_inscriptions_edit(
modimpl = ModuleImpl.get_modimpl(moduleimpl_id) modimpl = ModuleImpl.get_modimpl(moduleimpl_id)
module = modimpl.module module = modimpl.module
formsemestre = modimpl.formsemestre formsemestre = modimpl.formsemestre
# -- check lock # -- check permission (and lock)
if not formsemestre.etat: if not modimpl.can_change_inscriptions():
raise ScoValueError("opération impossible: semestre verrouille") return # can_change_inscriptions raises exception
header = html_sco_header.sco_header( header = html_sco_header.sco_header(
page_title="Inscription au module", page_title="Inscription au module",
init_qtip=True, init_qtip=True,

View File

@ -196,9 +196,7 @@ def _ue_coefs_html(modimpl: ModuleImpl) -> str:
def moduleimpl_status(moduleimpl_id=None, partition_id=None): def moduleimpl_status(moduleimpl_id=None, partition_id=None):
"""Tableau de bord module (liste des evaluations etc)""" """Tableau de bord module (liste des evaluations etc)"""
if not isinstance(moduleimpl_id, int): modimpl: ModuleImpl = ModuleImpl.get_modimpl(moduleimpl_id)
raise ScoInvalidIdType("moduleimpl_id must be an integer !")
modimpl: ModuleImpl = ModuleImpl.query.get_or_404(moduleimpl_id)
g.current_moduleimpl_id = modimpl.id g.current_moduleimpl_id = modimpl.id
module: Module = modimpl.module module: Module = modimpl.module
formsemestre_id = modimpl.formsemestre_id formsemestre_id = modimpl.formsemestre_id
@ -312,10 +310,13 @@ def moduleimpl_status(moduleimpl_id=None, partition_id=None):
H.append( H.append(
f"""<tr><td class="fichetitre2">Inscrits: </td><td> {len(mod_inscrits)} étudiants""" f"""<tr><td class="fichetitre2">Inscrits: </td><td> {len(mod_inscrits)} étudiants"""
) )
if current_user.has_permission(Permission.EtudInscrit): if modimpl.can_change_inscriptions(raise_exc=False):
H.append( H.append(
f"""<a class="stdlink" style="margin-left:2em;" f"""<a class="stdlink" style="margin-left:2em;"
href="moduleimpl_inscriptions_edit?moduleimpl_id={modimpl.id}">modifier</a>""" href="{
url_for("notes.moduleimpl_inscriptions_edit",
scodoc_dept=g.scodoc_dept, moduleimpl_id=modimpl.id
)}">modifier</a>"""
) )
H.append("</td></tr>") H.append("</td></tr>")
# Ligne: règle de calcul # Ligne: règle de calcul

View File

@ -1633,7 +1633,7 @@ sco_publish(
sco_publish( sco_publish(
"/moduleimpl_inscriptions_edit", "/moduleimpl_inscriptions_edit",
sco_moduleimpl_inscriptions.moduleimpl_inscriptions_edit, sco_moduleimpl_inscriptions.moduleimpl_inscriptions_edit,
Permission.EtudInscrit, Permission.ScoView,
methods=["GET", "POST"], methods=["GET", "POST"],
) )
sco_publish( sco_publish(