zds-site
zds-site copied to clipboard
Interdire aux membres en lecture seule de modifier leurs profils
Suite à une discussion sur le forum.
Comportement observé : en tant que membre en lecture seule, je peux modifier mon profil (biographie, signature, ...).
Comportement souhaité : en tant que membre en lecture seule, je ne peux pas modifier mon profil (biographie, signature, site web, ...).
Il faut ajouter un @method_decorator(can_write_and_read_now)
à la vue qui gère le formulaire et modifier ce bloc pour n'afficher le formulaire que si l'utilisateur a les droits. On vérifie qu'il a le droit d'écrire avec user.profile.can_write_now
. S'il n'a pas les droits, on peut afficher un bloc indiquant qu'il ne les a pas et ne peut donc pas modifier son profil.
Je veux bien m'y coller s'il n'y a personne dessus.
ll faut ajouter un
@method_decorator(can_write_and_read_now)
à la vue qui gère le formulaire.
En faisant ça, on ne laisse plus l'accès à la totalité du gestionnaire de compte (incluant le changement de mot de passe ou la désincription).
Cette page est effectivement la page d'accueil des paramètres de l'utilisateur donc on ne peut pas la bloquer entièrement avec une erreur 403.
Solution 1
Il faut modifier le gabarit :
{% block content %}
<div class="content-wrapper">
{% if ≤condition quand l'utilisateur n'est pas en lecture seule> %}
{% crispy form %}
{% else %}
{% trans "Vous n'avez pas accès aux paramètres du profil car vous êtes en lecture seule" %}
{% endif %}
</div>
{% endblock %}
En théorie il faudrait aussi modifier la vue pour retourner une erreur 403 au cas où un petit malin envoie une requête POST à la main, mais je ne sais pas si ça vaut le coup de le faire.
Solution 2 (la meilleure je pense, si c'est réalisable)
Si jamais on souhaite bloquer seulement l'édition de la biographie, de la signature, du site web et de l'avatar mais laisser l'accès au reste (la licence et les options), alors il faut modifier le formulaire. Je pense (je n'ai jamais testé) que c'est faisable comme ceci :
if "l'utilisateur n'est pas en lecture seule":
liste = ["Vous n'avez pas accès à certains paramètres du profil car vous êtes en lecture seule"]
else:
liste = [Field('biography'),
ButtonHolder(StrictButton(_('Aperçu'), type='preview', name='preview',
css_class='btn btn-grey preview-btn'),),
HTML("""
{% if form.biographie.value %}
{% include "misc/preview.part.html" with text=form.biographie.value %}
{% endif %}
"""),
Field('site'),
Field('avatar_url'),
HTML(_("""
<p>
<a href="{% url 'gallery-list' %}">Choisir un avatar dans une galerie</a><br/>
Naviguez vers l'image voulue et cliquez sur le bouton "<em>Choisir comme avatar</em>".<br/>
Créez une galerie et importez votre avatar si ce n'est pas déjà fait !
</p>
""")),
Field('sign')
]
layout = Layout(
*liste,
Field('licence'),
Field('options'),
ButtonHolder(StrictButton(_('Enregistrer'), type='submit'),)
)
Bon la forme n'est pas là mais l'idée est là.
Pour ce qui est de savoir si un membre est en lecteure seule ou pas, je te laisse t'inspirer de cette ligne.
Je trouve le problème intéressant et j'aimerai bien m'y coller. Cependant, j'ai deux questions :
-
Est ce que @Helmasaur veut toujours le prendre en charge ?
-
Si non, est ce que quelqu'un pourrait m'expliquer un peu, préférablement en vocal sur le serveur Discord, comment le code fonctionne pour que je comprenne mieux ?
Merci !
Pour info, il n'y a pas de travail actif sur ce ticket, donc n'importe qui peut reprendre ce sujet à son compte.
Je voudrais le prendre en charge si c'est OK ?
~~Oui tu peux prendre ce ticket en charge, sans aucun soucis !~~
(Édition) @Arnaud-D a fait la remarque sur Discord que Donknacki travaille déjà dessus donc le ticket est déjà pris.
je ne suis pas sûr d'avoir le temps de finir le travail donc libre à toi EleCTus0 de prendre le sujet
ça marche, merci