Projet

Général

Profil

Development #31937

Le double stockage de first_name/last_name ne fonctionne pas avec les attributs vérifiés

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

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

100%

Temps estimé:
Patch proposed:
Oui
Planning:

Description

User.save() rétablit toujours le champ comme non vérifié.

user.verified_attributes.last_name/first_name = 'xxx' ne modifie pas user.last_name/user.first_name et donc au prochain user.save() la valeur est perdue.


Fichiers

0001-pep8-31937.patch (896 octets) 0001-pep8-31937.patch Benjamin Dauvergne, 02 avril 2019 18:05
0002-code-style-31937.patch (1,24 ko) 0002-code-style-31937.patch Benjamin Dauvergne, 02 avril 2019 18:05
0003-user-fix-cache-errors-on-first_name-last_name-handli.patch (12,2 ko) 0003-user-fix-cache-errors-on-first_name-last_name-handli.patch Benjamin Dauvergne, 02 avril 2019 18:05
0001-pep8-31937.patch (896 octets) 0001-pep8-31937.patch Benjamin Dauvergne, 03 avril 2019 14:00
0002-code-style-31937.patch (1,24 ko) 0002-code-style-31937.patch Benjamin Dauvergne, 03 avril 2019 14:00
0003-user-fix-cache-errors-on-first_name-last_name-handli.patch (12,2 ko) 0003-user-fix-cache-errors-on-first_name-last_name-handli.patch Benjamin Dauvergne, 03 avril 2019 14:00
0001-pep8-31937.patch (896 octets) 0001-pep8-31937.patch Benjamin Dauvergne, 04 avril 2019 15:00
0002-code-style-31937.patch (1,24 ko) 0002-code-style-31937.patch Benjamin Dauvergne, 04 avril 2019 15:00
0003-user-fix-cache-errors-on-first_name-last_name-handli.patch (12,2 ko) 0003-user-fix-cache-errors-on-first_name-last_name-handli.patch Benjamin Dauvergne, 04 avril 2019 15:00
0005-user-replace-all-uses-of-Attribute.set_value-31937.patch (4,21 ko) 0005-user-replace-all-uses-of-Attribute.set_value-31937.patch Benjamin Dauvergne, 04 avril 2019 15:00
0004-user-add-command-to-fix-storage-of-first_name-last_n.patch (4,32 ko) 0004-user-add-command-to-fix-storage-of-first_name-last_n.patch Benjamin Dauvergne, 04 avril 2019 15:00
0001-pep8-31937.patch (896 octets) 0001-pep8-31937.patch Benjamin Dauvergne, 04 avril 2019 18:47
0002-code-style-31937.patch (1,24 ko) 0002-code-style-31937.patch Benjamin Dauvergne, 04 avril 2019 18:47
0003-user-fix-cache-errors-on-first_name-last_name-handli.patch (12,4 ko) 0003-user-fix-cache-errors-on-first_name-last_name-handli.patch Benjamin Dauvergne, 04 avril 2019 18:47
0005-user-replace-all-uses-of-Attribute.set_value-31937.patch (5,78 ko) 0005-user-replace-all-uses-of-Attribute.set_value-31937.patch Benjamin Dauvergne, 04 avril 2019 18:47
0004-user-add-command-to-fix-storage-of-first_name-last_n.patch (4,34 ko) 0004-user-add-command-to-fix-storage-of-first_name-last_n.patch Benjamin Dauvergne, 04 avril 2019 18:47
0001-pep8-31937.patch (896 octets) 0001-pep8-31937.patch Benjamin Dauvergne, 05 avril 2019 13:10
0002-code-style-31937.patch (1,24 ko) 0002-code-style-31937.patch Benjamin Dauvergne, 05 avril 2019 13:10
0003-user-fix-cache-errors-on-first_name-last_name-handli.patch (12,4 ko) 0003-user-fix-cache-errors-on-first_name-last_name-handli.patch Benjamin Dauvergne, 05 avril 2019 13:10
0005-user-replace-all-uses-of-Attribute.set_value-31937.patch (5,78 ko) 0005-user-replace-all-uses-of-Attribute.set_value-31937.patch Benjamin Dauvergne, 05 avril 2019 13:10
0004-user-add-command-to-fix-storage-of-first_name-last_n.patch (4,34 ko) 0004-user-add-command-to-fix-storage-of-first_name-last_n.patch Benjamin Dauvergne, 05 avril 2019 13:10

Demandes liées

Lié à Plugin FS FranceConnect - Support #31884: La liaison de compte avec FC depuis la page mon compte ne modifie par nom et prénom et ne les verrouillent pas.Fermé01 avril 2019

Actions

Révisions associées

Révision 085a1b02 (diff)
Ajouté par Benjamin Dauvergne il y a environ 5 ans

code style (#31937)

Révision b72b11cb (diff)
Ajouté par Benjamin Dauvergne il y a environ 5 ans

user: fix cache errors on first_name/last_name handling (fixes #31937)

first_name/last_name are not updated anymore inside
Attribute.set_value() but only through the Attributes object.

In User.save() we first compare current values of first/last_name before
resetting the corresponding AttributeValue, i.e. if the value does not
change we never reset the verified status.

A map cache of attributes values is kept in user._a2_attributes_cache to
reduce the number of queries when modifying attributes.

Révision 1079ac2e (diff)
Ajouté par Benjamin Dauvergne il y a environ 5 ans

user: add command to fix storage of first_name/last_name attributes (#31937)

Révision ff92cb1f (diff)
Ajouté par Benjamin Dauvergne il y a environ 5 ans

user: replace all uses of Attribute.set_value() (#31937)

Historique

#1

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

  • Lié à Support #31884: La liaison de compte avec FC depuis la page mon compte ne modifie par nom et prénom et ne les verrouillent pas. ajouté
#2

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

Ça devrait mieux marcher, certains tests pourraient péter notamment ceux qui mesures le nombre de requêtes.

#3

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

Je vais ajouter une migration de donnée pour m'assurer qu'on a pas des utilisateurs avec un état bâtard en base (user.first_name != user.attributes.first_name), je donnerai l'avantage à user.attributes..

#4

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

  • Statut changé de Solution proposée à En cours
#7

Mis à jour par Paul Marillonnet il y a environ 5 ans

  • Statut changé de Solution proposée à Information nécessaire
Le code gagnerait à :
  • virer complètement le champ attribute_values du modèle utilisateur. Ce champ a été introduit, il me semble à la lecture du code, pour éviter les jointures de tables entre User, Attribute et AttributeValue. Il faudrait mesurer si la perte de cette optimisation est compensée par une plus grande clarté du code.
  • à faire remonter l'information de vérification du modèle AttributeValue vers le modèle Attribute (ça ne me paraît pas complètement déconnant de dire que c'est l'attribut d'un usager, qui, à un instant t et pour une valeur donnée, est vérifié -- et non pas cette valeur).

Qu'en dis-tu ?

#8

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

Paul Marillonnet a écrit :

Le code gagnerait à :
  • virer complètement le champ attribute_values du modèle utilisateur. Ce champ a été introduit, il me semble à la lecture du code, pour éviter les jointures de tables entre User, Attribute et AttributeValue. Il faudrait mesurer si la perte de cette optimisation est compensée par une plus grande clarté du code.

Et le remplacer par quoi ? Le code est plus clair qu'avant grâce à attribute_values justement, l'optimisation est anecdotique.

  • à faire remonter l'information de vérification du modèle AttributeValue vers le modèle Attribute (ça ne me paraît pas complètement déconnant de dire que c'est l'attribut d'un usager, qui, à un instant t et pour une valeur donnée, est vérifié -- et non pas cette valeur).

Incompréhension du modèle de donné, Attribute est unique, il n'y a pas un Attribute par utilisateur.

#9

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

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

Mis à jour par Paul Marillonnet il y a environ 5 ans

Benjamin Dauvergne a écrit :

Incompréhension du modèle de donné, Attribute est unique, il n'y a pas un Attribute par utilisateur.

Ok, ma faute. Et donc ça répond à ma première question.
Une erreur dans les tests (le GenericRelatedObjectsManager qui se cache derrière le attribute_values ne définit pas delete, mais clear), le build est en échec.

#12

Mis à jour par Paul Marillonnet il y a environ 5 ans

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

Quelques petits pinaillages comme à mon habitude.

  • mauvaise convention de nommage de la variable d'itération ici, je crois :
        for atv in Attribute.all_objects.all():
    
  • Un appel à :
            super(Attributes, self).__setattr__('verified', verified)
    

    en trop, il me semble, à la fin de Attributes.__init__
  • D'ailleurs sur la ligne d'avant, je crois qu'on s'en fout d'initialiser la variable values.

Par contre, plus grave à mon avis : j'ai l'impression que Attribute.set_value pour un attribut multiple est bogué : on ajoute ou met à jour des valeurs, mais on ne supprime des anciennes valeurs pour cet attribut et cet utilisateur. Si ça s'avère vrai, je peux créer un autre ticket, puisque cette partie du code est restée inchangée par tes patchs.

#13

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

Paul Marillonnet a écrit :

Quelques petits pinaillages comme à mon habitude.

  • mauvaise convention de nommage de la variable d'itération ici, je crois :
    [...]
  • Un appel à :
    [...]
    en trop, il me semble, à la fin de Attributes.__init__
  • D'ailleurs sur la ligne d'avant, je crois qu'on s'en fout d'initialiser la variable values.

Je corrige tout ça.

Par contre, plus grave à mon avis : j'ai l'impression que Attribute.set_value pour un attribut multiple est bogué : on ajoute ou met à jour des valeurs, mais on ne supprime des anciennes valeurs pour cet attribut et cet utilisateur. Si ça s'avère vrai, je peux créer un autre ticket, puisque cette partie du code est restée inchangée par tes patchs.

Jamais marché car jamais utilisé, on peut juste tout virer et remplacer par raise NotImplementedError pour l'instant.

#15

Mis à jour par Paul Marillonnet il y a environ 5 ans

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

Go.

#16

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

  • Statut changé de Solution validée à Résolu (à déployer)
  • % réalisé changé de 0 à 100
#17

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

commit ff92cb1fb9c44de2749a15e420c0e59b1ccf9673
Author: Benjamin Dauvergne <bdauvergne@entrouvert.com>
Date:   Thu Apr 4 14:58:37 2019 +0200

    user: replace all uses of Attribute.set_value() (#31937)

commit 1079ac2e00460247e057d91ecc425b6d9daaab18
Author: Benjamin Dauvergne <bdauvergne@entrouvert.com>
Date:   Wed Apr 3 16:07:02 2019 +0200

    user: add command to fix storage of first_name/last_name attributes (#31937)

commit b72b11cb83d144e2bf3a3937a052ce3603491b31
Author: Benjamin Dauvergne <bdauvergne@entrouvert.com>
Date:   Tue Apr 2 18:01:22 2019 +0200

    user: fix cache errors on first_name/last_name handling (fixes #31937)

    first_name/last_name are not updated anymore inside
    Attribute.set_value() but only through the Attributes object.

    In User.save() we first compare current values of first/last_name before
    resetting the corresponding AttributeValue, i.e. if the value does not
    change we never reset the verified status.

    A map cache of attributes values is kept in user._a2_attributes_cache to
    reduce the number of queries when modifying attributes.

commit 085a1b0270418e829a5bf4dba60cd181eadff945
Author: Benjamin Dauvergne <bdauvergne@entrouvert.com>
Date:   Tue Apr 2 16:35:19 2019 +0200

    code style (#31937)

commit 0d74afcc5d912c78d2e6835300bdf42dfa2cceb4
Author: Benjamin Dauvergne <bdauvergne@entrouvert.com>
Date:   Tue Apr 2 16:33:56 2019 +0200

    pep8 (#31937)
#18

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

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

Formats disponibles : Atom PDF