Bug #20564
Le courriel de changement d'adresse de courriel envoyé lors d'une modification de courriel en backoffice indique deux fois la même adresse
100%
Description
L'ancienne adresse indiquée est la nouvelle et non l'ancienne, exemple :
Hi Mik ! And administrator requested for changing your email on authentic-demo.dev.entrouvert.org from: mates+ca04@entrouvert.com to: mates+ca04@entrouvert.com To validate this change please click on the following link: https://authentic-demo.dev.entrouvert.org/accounts/change-email/verify/?token=eyJ1c2VyX3BrIjo3NywiZW1haWwiOiJtYXRlcytjYTA0QGVudHJvdXZlcnQuY29tIn0:1eOLUp:3mxMWe-cAjGmfkS04giMrG2Sqj0 This link will be valid for 2 heures. -- authentic-demo.dev.entrouvert.org
Fichiers
Révisions associées
Historique
Mis à jour par Benjamin Dauvergne il y a plus de 6 ans
- Statut changé de Nouveau à En cours
- Assigné à mis à Benjamin Dauvergne
Mis à jour par Benjamin Dauvergne il y a plus de 6 ans
- Fichier 0001-manager-send-new-email-in-the-email-change-verificat.patch 0001-manager-send-new-email-in-the-email-change-verificat.patch ajouté
Il suffit de renommer le champ pour que le modèle ne soit pas modifié par le ModelForm.save() standard.
Mis à jour par Emmanuel Cazenave il y a plus de 6 ans
Bon j'ai du mal à comprendre.
Benjamin Dauvergne a écrit :
Il suffit de renommer le champ pour que le modèle ne soit pas modifié par le ModelForm.save() standard.
Elle faisait rien d'autre que return self.instance cette méthode, je pige pas.
C'est le hook manager-change-email-request
qui à la charge de faire persister quelque part les changements ? (ce serait le rôle de UserChangeEmailForm.save
dans une application lambda ?)
Pourquoi fields
devient vide ?
Mis à jour par Benjamin Dauvergne il y a plus de 6 ans
Désolé je ne suis pas précis, l'application des modifications des champs au modèle est faite pendant la validation et pas dans le save()
le fait d'utiliser un champ nommé différemment évite ça, mais même si save() ne sauve pas le modèle il y a un effet de bord qui pourrait surprendre dans le futur et si par exemple un hook décide de faire une modification au user et un .save() l'effet de bord se retrouve sauvé en base. Ha et aussi comme cet effet de bord avait l'effet que c'est la nouvelle email qui se trouvait dans user.email
et donc send_email_change_email
mettait deux fois la même email dans son texte (en voulant citer l'ancienne email il remettait la nouvelle). Et puis surcharger save pour juste faire return self.instance
c'est super moche. Là j'ai le comportement métier qui est bien encapsulé dans le Form
et simplement le hook dans la vue (parce qu'on veut pouvoir passer plus de contexte au hook, request, view, etc..).
Mis à jour par Emmanuel Cazenave il y a plus de 6 ans
Ok, j'ai compris, à peu près, ack.
Pour ma culture quand même, t'aurais pas pu t'en sortir avec ça : https://docs.djangoproject.com/en/1.11/ref/forms/api/#django.forms.Form.has_changed ?
Et pourquoi tu as besoin de rendre fields
vide ?
Mis à jour par Benjamin Dauvergne il y a environ 6 ans
- Statut changé de En cours à Résolu (à déployer)
- % réalisé changé de 0 à 100
Appliqué par commit authentic2|08253fb2d34cffce1d71d3c8d8e0385be2e108fd.
Mis à jour par Benjamin Dauvergne il y a environ 6 ans
J'ai une contrainte que je m'impose tout seul: utiliser une vue générique d'édition de modèle et donc avoir une ModelForm.
has_changed() ça ne me sert à rien ici, je ne cherche pas à savoir si un truc a changé ou pas, je veux juste que la ModelForm ne modifie pas le champs email une fois le formulaire validé qui est sont comportement par défaut quand on appelle clean() (ou is_valid() qui fait pareil). À mon avis c'est un défaut de conception le modèle ne devrait pas bouger avant qu'on fasse save(), mais bon c'est comme ça.
Mis à jour par Mikaël Ates (de retour le 29 avril) il y a environ 6 ans
- Statut changé de Résolu (à déployer) à Fermé
Passé en prod.
manager: send new email in the email change verification mail (fixes #20564)
Use of a ModelForm keeping the original email field for the
UserChangeEmailForm makes keeping the original email value after clean()
is called impossible, as clean() is also responsible of transfering
value from the form into the model instance.
We keep using a ModelForm but we use a new field not present in the
model to get the new email and we override the save() method so that the
behaviour of sending the validation mail is kept inside the form and not
in the view. Only the call to the manager's hook
manager-change-email-request is kept in the view.