Development #29342
Connaitre le rôle de l'utilisateur connecté (filtre has_role)
0%
Description
User Story :
En tant que créateur d'une démarche, je veux pouvoir afficher un champ de formulaire dédié en fonction de rôle/s de l'utilisateur connecté sans qu'un utilisateur n'ayant pas ce/s rôle/s puisse afficher le champ, afin de pouvoir utiliser un même formulaire qui s'adaptera légèrement selon le/s rôle/s attribué à l'utilisateur connecté.
Il a été évoqué de créer une variable : session_user|has_role:"<string>"
Fichiers
Révisions associées
Historique
Mis à jour par Thomas Noël il y a plus de 5 ans
Si on passe par une condition d'affichage du champ, il faut savoir que techniquement le champ peut exister sur la page : il est juste caché. Un simple "view-source" permettrait à un usager de quand même voir des informations auxquelles il n'est pas prévu qu'il ait accès -- c'est j'imagine ce qu'on veut faire ici. Je ne suis donc pas chaud à mettre cette possibilité en avant.
(note à Frédéric, qui objectera que c'est pas vrai si la condition qui n'utilise pas de "form_var_truc" : oui, d'accord. Justement j'imagine une condition qui ferait un "form_var_truc = "chose" and session_user|has_role:"bidule", et boum)
Mis à jour par Frédéric Péters il y a plus de 5 ans
on passe par une condition d'affichage du champ, il faut savoir que techniquement le champ peut exister sur la page : il est juste caché.
Je pense utile de rappeler ça.
un usager de quand même voir des informations auxquelles il n'est pas prévu qu'il ait accès
Mais on parle d'un champ, normalement ça ne dévoile pas d'informations. (et d'accord, oui, de loin, on pourrait imaginer un champ commentaire affiché avec des instructions "confidentielles" pour les agents).
Mis à jour par Laurent Séguin il y a plus de 5 ans
Il est effectivement bon de rappeler qu'il est possible de savoir que le champ existe par une lecture du source de la page.
Dans mon user story, le « sans qu'un utilisateur n'ayant pas ce/s rôle/s puisse afficher le champ » faisait plutôt référence au fait que l'on pourra pas tester/remplir l'ensemble des champs du formulaire si on dispose pas du/des/ rôle/s de la condition.
Si l'on souhaite vraiment une confidentialité forte du/des champ/s, il sera probablement préférable de faire appel au mécanisme des pages conditionnelles, avec la même condition sur le/s rôle/s de l'utilisateur connecté, voir carrément de faire un autre formulaire qui sera réservé à un rôle.
Mis à jour par Thomas Noël il y a plus de 4 ans
Une solution serait quelque chose comme :
--- a/wcs/users.py +++ b/wcs/users.py @@ -90,6 +90,14 @@ class User(StorableObject): def get_roles(self): return (self.roles or []) + def get_roles_names(self): + from .roles import Role + for role_id in self.get_roles(): + try: + yield Role.get(role_id).name + except KeyError: # role has been deleted + pass + def set_attributes_from_formdata(self, formdata): users_cfg = get_cfg('users', {})
qui permet de faire une condition comme
"Agent" in session_user.get_roles_names
ou plus génériquement avec une fonction "truc" dans le workflow :
form_role_truc_name in session_user.get_roles_names
Le session_user fait que ça va marcher lors de la soumission, mais ces conditions ne sont plus correctes par la suite quand la demande est analysée par un autre utilisateur.
(Je reste vraiment pas intéressé par proposer ce hack sauf aux personnes de bonne volonté qui comprendront les tenants et aboutissants)
Mis à jour par Frédéric Péters il y a plus de 4 ans
Mais pourquoi pas |has_role:"...", par unité avec Combo ?
Mis à jour par Thomas Noël il y a plus de 4 ans
Frédéric Péters a écrit :
Mais pourquoi pas |has_role:"...", par unité avec Combo ?
Parce que je faignantise et que j'ai vraiment pas envie de faire de la pub à cette feature que je vois déjà utilisée de travers. Mais ok, je vais la faire, et on verra bien...
Mis à jour par Thomas Noël il y a plus de 4 ans
- Statut changé de Nouveau à En cours
- Assigné à mis à Thomas Noël
Mis à jour par Thomas Noël il y a plus de 4 ans
- Fichier 0001-misc-add-has_role-filter-29342.patch 0001-misc-add-has_role-filter-29342.patch ajouté
- Sujet changé de Connaitre le rôle de l'utilisateur connecté à Connaitre le rôle de l'utilisateur connecté (filtre has_role)
- Statut changé de En cours à Solution proposée
- Patch proposed changé de Non à Oui
Voilà donc has_role.
Note : xxx|has_role:r
renvoie faux si xxx n'est pas un objet user. L'idée est de ne pas cracher avec form_user pour un formulaire sans utilisateur (ou session_user sans session, dans un cron), ce genre de choses.
Mis à jour par Frédéric Péters il y a plus de 4 ans
- Statut changé de Solution proposée à Solution validée
Ok.
Mis à jour par Thomas Noël il y a plus de 4 ans
- Statut changé de Solution validée à Résolu (à déployer)
commit e22d2b52aeeb3c526bc9e49ef0de5500e618b59f Author: Thomas NOEL <tnoel@entrouvert.com> Date: Tue Oct 29 17:12:41 2019 +0100 misc: add has_role filter (#29342)
Mis à jour par Frédéric Péters il y a plus de 4 ans
- Statut changé de Résolu (à déployer) à Solution déployée
misc: add has_role filter (#29342)