Permissions pour lister ou inspecter un modèle avec wagtail
Wagtail a un comportement par défaut un peu déconcertant sur les
autorisation d'accès aux éléments d'un modèle. Par exemple,
considérons un modèle Teacher
et sa représentation TeacherAdmin
dans
la page admin
de wagtail.
# fichier models.py
pass
# fichier wagtail_hooks.py
=
On dispose d'une interface nous permettant d'attribuer des
permissions, par défaut add_teacher
, change_teacher
, delete_teacher
et
view_teacher
sont présentes.
Un utilisateur n'ayant pas les droits view_teacher
, ne pourra donc pas
lister ou inspecter un enseignant dans la page admin. Mais, si une
seule autre permission lui est assignée, ce sera le cas.
Cela paraît logique: si un utilisateur peut modifier un enseignant, alors il doit pouvoir les lister ou l'inspecter. Seulement, on peut parfois avoir besoin d'ajouter une permission spéciale, qui ne nécessite pas de lister les enseignants, mais autorise l'utilisateur à réaliser certaines actions (en lui laissant accéder à une vue personnalisée). Dans ce cas, lui donner cette permission aura pour effet de lui permettre de lister tous les enseignants, ce qui n'est pas forcément souhaité.
Si on regarde l'implémentation de user_can_list()
ou
user_can_inspect_object()
dans wagtail, on remarque que la
permission est accordée si user_has_any_permissions()
, i.e. si
l'utilisateur a au moins une autre permission sur le modèle. On va
changer ce comportement en définissant une nouvelle classe
StrictModelAdmin
qui nous convient.
"""
Ne peut accéder ou lister les éléments modèle que si la permission
view_<model_name> est spécifiée et pas une autre.
"""
=
return
return
return and
=
On peut utiliser StrictModelAdmin
dans les fichiers wagtail_hooks.py
en remplacement de ModelAdmin
. Il faudra dès lors obligatoirement
cocher la permission view_<model_name>
si l'on souhaite qu'un
utilisateur fasse des opérations CRUD
sur des objets du modèle.