Projet

Général

Profil

Development #32954

afficher les champs civilité verrouillés

Ajouté par Benjamin Dauvergne il y a presque 5 ans. Mis à jour il y a presque 5 ans.

Statut:
Fermé
Priorité:
Normal
Assigné à:
Catégorie:
-
Version cible:
-
Début:
09 mai 2019
Echéance:
% réalisé:

0%

Temps estimé:
Patch proposed:
Oui
Planning:
Non

Description

Cas similaire à #25246, on utilise un RadioSelect or ça ne marche pas avec l'attribut readonly, on peut quand même changer la sélection. On ne pourra pas utiliser la même solution que w.c.s. car on a suffisamment pas la main sur le rendu des widgets et je n'ai pas envie de chercher une bidouille à base de template spécifique; le plus simple sera d'en faire un champ Select classique verrouilé.


Fichiers

0001-reorganize-views-and-forms-32934.patch (123 ko) 0001-reorganize-views-and-forms-32934.patch Benjamin Dauvergne, 09 mai 2019 19:00
0001-forms-replaces-RadioSelect-by-Select-of-locked-attri.patch (3,13 ko) 0001-forms-replaces-RadioSelect-by-Select-of-locked-attri.patch Frédéric Péters, 17 juin 2019 16:13
0001-forms-replaces-RadioSelect-by-Select-of-locked-attri.patch (3,13 ko) 0001-forms-replaces-RadioSelect-by-Select-of-locked-attri.patch Benjamin Dauvergne, 17 juin 2019 18:25
0001-forms-implement-locked-fields-by-renaming-and-widget.patch (5,42 ko) 0001-forms-implement-locked-fields-by-renaming-and-widget.patch Benjamin Dauvergne, 18 juin 2019 00:18
0001-forms-implement-locked-fields-by-renaming-and-widget.patch (7,43 ko) 0001-forms-implement-locked-fields-by-renaming-and-widget.patch Benjamin Dauvergne, 18 juin 2019 00:32
Firefox_Screenshot_2019-06-17T22-33-21.750Z.png (13,4 ko) Firefox_Screenshot_2019-06-17T22-33-21.750Z.png Benjamin Dauvergne, 18 juin 2019 00:34
0001-forms-implement-locked-fields-by-renaming-and-widget.patch (9,3 ko) 0001-forms-implement-locked-fields-by-renaming-and-widget.patch Benjamin Dauvergne, 19 juin 2019 00:00
0001-forms-implement-locked-fields-by-renaming-and-widget.patch (9,3 ko) 0001-forms-implement-locked-fields-by-renaming-and-widget.patch Benjamin Dauvergne, 19 juin 2019 09:07
0002-add-support-for-dj1.8-to-rebase-fixup.patch (1,32 ko) 0002-add-support-for-dj1.8-to-rebase-fixup.patch Benjamin Dauvergne, 19 juin 2019 09:07
0001-forms-implement-locked-fields-by-renaming-and-widget.patch (9,3 ko) 0001-forms-implement-locked-fields-by-renaming-and-widget.patch Benjamin Dauvergne, 19 juin 2019 20:51
0003-last-fixes-to-fixup-rebase.patch (4,97 ko) 0003-last-fixes-to-fixup-rebase.patch Benjamin Dauvergne, 19 juin 2019 20:51
0002-add-support-for-dj1.8-to-rebase-fixup.patch (1,32 ko) 0002-add-support-for-dj1.8-to-rebase-fixup.patch Benjamin Dauvergne, 19 juin 2019 20:51
0001-forms-implement-locked-fields-by-renaming-and-widget.patch (12,3 ko) 0001-forms-implement-locked-fields-by-renaming-and-widget.patch Benjamin Dauvergne, 19 juin 2019 23:20

Demandes liées

Bloque Hobo - Development #32876: Faire que la configuration par défaut verrouille la civilitéFermé07 mai 2019

Actions

Révisions associées

Révision 6691d564 (diff)
Ajouté par Benjamin Dauvergne il y a presque 5 ans

forms: implement locked fields by renaming and widget change (#32954)

It simplifies the code (no need to implement a special clean() method)
and it covers the case of field with widget not supporting the readonly
HTML attribute like those based on <select> or <input type="radio">
tags.

Historique

#1

Mis à jour par Benjamin Dauvergne il y a presque 5 ans

  • Bloque Development #32876: Faire que la configuration par défaut verrouille la civilité ajouté
#2

Mis à jour par Benjamin Dauvergne il y a presque 5 ans

  • Description mis à jour (diff)
#3

Mis à jour par Benjamin Dauvergne il y a presque 5 ans

Construit au dessus de #32934.

#4

Mis à jour par Benjamin Dauvergne il y a presque 5 ans

  • Fichier 0002-forms-replaces-RadioSelect-by-Select-of-locked-attri.patch supprimé
#5

Mis à jour par Nicolas Roche il y a presque 5 ans

  • Statut changé de Solution proposée à Information nécessaire

ouch, est-ce que tu pourrais rebaser stp ?
(pas trop envie valider le grand nettoyage de printemps une seconde fois)

#6

Mis à jour par Frédéric Péters il y a presque 5 ans

Il me semble que le patch attaché est en fait totalement intégré dans l'autre (#32934) et le patch qui pouvait concerner directement ce ticket, 0002-forms-replaces-RadioSelect-by-Select-of-locked-attri, supprimée; peut-être que l'objectif était l'inverse, supprimer 0001 et garder 0002 ici.

Le 0002, il se cherrypicke sans problème (cfbdd97c91771e402565796bb5b89a1f6d153ba4), le revoilà.

#7

Mis à jour par Benjamin Dauvergne il y a presque 5 ans

Frédéric Péters a écrit :

Il me semble que le patch attaché est en fait totalement intégré dans l'autre (#32934) et le patch qui pouvait concerner directement ce ticket, 0002-forms-replaces-RadioSelect-by-Select-of-locked-attri, supprimée; peut-être que l'objectif était l'inverse, supprimer 0001 et garder 0002 ici.

Le 0002, il se cherrypicke sans problème (cfbdd97c91771e402565796bb5b89a1f6d153ba4), le revoilà.

Ouaip mauvais git submit le premier patch c'était celui de #32934, c'est tout comme Fred il dit.

#9

Mis à jour par Nicolas Roche il y a presque 5 ans

merci :)

Je vois bien que les boutons radio sont transformés en liste quand le champ est passé à "vérifié" et que l'on recharge la page d'édition du profil, cependant j'ai l'impression que dans un cas comme dans l'autre on peut encore modifier la sélection.
(je lance le test avec un point d'arrêt puis je colle le contenu de la réponse dans une page html statique)

Sergei me dis que 'readonly="readonly"' n'a jamais fonctionné que sur les champs texte.
J'ai l'impression que dans les 2 cas on peut verrouiller la sélection en utilisant la "nouvelle" syntaxe :

<<<
readonly="readonly" 
---
disabled="disabled" 
>>>

#10

Mis à jour par Benjamin Dauvergne il y a presque 5 ans

Changement complet d'implémentation pour avoir une solution unique et générale :
  • les champs verrouilés sont ré-implémentés comme des CharField avec un widget TextInput read-only
  • leur valeur initiale est calculée, celle de l'attribut convertie via field.choices ou field.format_value()
  • leur nom est modifié en ajoutant le suffixe '@disabled' évitant ainsi qu'ils soient traité par la mécanique de ModelForm et de UserForm, et le dictionnaire ordonné self.fields est reconstruit en remplaçant les anciens noms par les nouveaux.
#12

Mis à jour par Benjamin Dauvergne il y a presque 5 ans

Champ texte, champ radio select, champ date

Sur le champ photo ça ne marche pas, mais je doute qu'on en verrouille.

#16

Mis à jour par Nicolas Roche il y a presque 5 ans

  • Statut changé de Solution proposée à Solution validée

Ya pas moyen, les mixins me font toujours aussi mal à la tête,
mais vu le HTML produit, on a bien le résultat attendu : les champs vérifiés sont figés.

#17

Mis à jour par Frédéric Péters il y a presque 5 ans

Sur cette partie-ci supprimée :

        # make sure verified fields are not modified
        for av in models.AttributeValue.objects.with_owner(
                self.instance).filter(verified=True):
            self.cleaned_data[av.attribute.name] = av.to_python()

pour me rassurer sur l'impossibilité qu'un POST altéré touche les données, je propose ce patch supplémentaire sur les tests :

--- a/tests/test_profile.py
+++ b/tests/test_profile.py
@@ -51,7 +51,7 @@ def test_account_edit_view(app, simple_user):
     resp = resp.form.submit().follow()
     assert phone.get_value(simple_user) == '0123456789'

-    resp = app.get(url, status=200)
+    resp = resp1 = app.get(url, status=200)
     resp.form.set('edit-profile-phone', '9876543210')
     resp = resp.form.submit('cancel').follow()
     assert phone.get_value(simple_user) == '0123456789'
@@ -74,6 +74,11 @@ def test_account_edit_view(app, simple_user):
     assert title.get_value(simple_user) == 'Mr'
     assert agreement.get_value(simple_user) is True

+    # check submitting modified data for a locked field doesn't change it
+    resp1.form.set('edit-profile-phone', '9876543210')
+    resp = resp1.form.submit().follow()
+    assert phone.get_value(simple_user) == '0123456789'
+
     phone.disabled = True
     phone.save()
     resp = app.get(url, status=200)
#18

Mis à jour par Benjamin Dauvergne il y a presque 5 ans

Avec toutes vos remarques.

#19

Mis à jour par Nicolas Roche il y a presque 5 ans

  • Statut changé de Solution proposée à Solution validée

A propos de l'intégration du patch ci-dessus,
j'ai l'impression que tu oublies de tenter de modifier la valeur quand tu re-soumets le formulaire :

++ old_resp.form.set('edit-profile-phone', '9876543210')
   resp = old_resp.form.submit()
   assert phone.get_value(simple_user) == '0123456789'

#20

Mis à jour par Benjamin Dauvergne il y a presque 5 ans

Nicolas Roche a écrit :

A propos de l'intégration du patch ci-dessus,
j'ai l'impression que tu oublies de tenter de modifier la valeur quand tu re-soumets le formulaire :
[...]

old_resp.form conserve les valeurs définie au premier usage, donc je ne pense pas qu'il y ait un souci.

#21

Mis à jour par Nicolas Roche il y a presque 5 ans

Yep, en effet.

(Pdb) old_resp.form['edit-profile-phone']._value
'1234'

C'est bon pour moi.

#22

Mis à jour par Benjamin Dauvergne il y a presque 5 ans

  • Statut changé de Solution validée à Résolu (à déployer)
commit 6691d5645253055fdee03b26780a1ca8d2e71559
Author: Benjamin Dauvergne <bdauvergne@entrouvert.com>
Date:   Thu May 9 18:51:56 2019 +0200

    forms: implement locked fields by renaming and widget change (#32954)

    It simplifies the code (no need to implement a special clean() method)
    and it covers the case of field with widget not supporting the readonly
    HTML attribute like those based on <select> or <input type="radio">
    tags.
#23

Mis à jour par Frédéric Péters il y a presque 5 ans

  • Statut changé de Résolu (à déployer) à Solution déployée

Formats disponibles : Atom PDF