zds-site icon indicating copy to clipboard operation
zds-site copied to clipboard

Interdire aux membres en lecture seule de modifier leurs profils

Open Arnaud-D opened this issue 4 years ago • 10 comments

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, ...).

Arnaud-D avatar Apr 07 '20 17:04 Arnaud-D

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.

Karnaj avatar Apr 16 '20 12:04 Karnaj

Je veux bien m'y coller s'il n'y a personne dessus.

helmasaur avatar Jun 26 '20 00:06 helmasaur

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).

helmasaur avatar Jul 08 '20 21:07 helmasaur

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.

Situphen avatar Jul 22 '20 18:07 Situphen

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 !

Benallegue-Mehdi avatar Oct 20 '20 02:10 Benallegue-Mehdi

Pour info, il n'y a pas de travail actif sur ce ticket, donc n'importe qui peut reprendre ce sujet à son compte.

Arnaud-D avatar Oct 01 '22 11:10 Arnaud-D

Je voudrais le prendre en charge si c'est OK ?

rayandfz avatar Oct 29 '22 20:10 rayandfz

~~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.

Situphen avatar Oct 29 '22 20:10 Situphen

je ne suis pas sûr d'avoir le temps de finir le travail donc libre à toi EleCTus0 de prendre le sujet

DonKnacki avatar Nov 14 '22 14:11 DonKnacki

ça marche, merci

rayandfz avatar Dec 06 '22 16:12 rayandfz