Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Connexion: Utilisation du modèle EmailAddress et refonte du parcours de modification d'adresse mail [GEN-2216] #5088

Draft
wants to merge 4 commits into
base: master
Choose a base branch
from

Conversation

calummackervoy
Copy link
Contributor

@calummackervoy calummackervoy commented Nov 12, 2024

🤔 Pourquoi ?

Quand un utilisateur modifie son email, l'accès à son compte est bloqué jusqu'à ce qu'il soit vérifié. S'il s'est trompé, il n'aura pas accès à son compte jusqu'à il peut accèder l'adresse mail ou il est débloqué par le support. Toutefois, il ne recevra cet e-mail avant qu'il essaie de se connecter avec le nouvelle adresse.

🍰 Comment ?

Ce PR propose une refonte du parcours de modification plus clair, et que la notification soit envoyée immédiatement, et que l'utilisateur soit rédirigé vers la page d'instruction.

Un utilisateur peut démander une seconde adresse mail, et le moment que il le vérifie son user.email sera remplacé. Si l'utilisateur se connecte avec son ancien e-mail il peut, mais ça va annuler sa réquête à changement d'adresse mail. S'il démande un 3ème la réquête sera remplacée et l'adresse mail en cours de vérification annulée/relâchée.

Tandis qu'un e-mail est en cours de vérification, il est réservé et un tiers ne peut pas inscrire sur notre plate-forme en l'utilisant.

Impliqué par ces changements est que le modèle EmailAddress doit être utilisé lorsque que l'unicité d'adresse mail est importante, car un EmailAddress en cours de vérification est quand même réservé au utilisateur qui l'a démandé. Il inclut donc des changements au User.save pour gerer la création / modification des adresses mails, et une migration temporaire pour remplir toutes les adresses mails manquante sur le base de données du prod.

🚨 À vérifier

  • Mettre à jour le CHANGELOG_breaking_changes.md ?

🏝️ Comment tester

@calummackervoy calummackervoy added 1-recette-jetable [Payé à l’heure] Crée une recette jetable sur CC no-changelog Ne doit pas figurer dans le journal des changements. labels Nov 12, 2024
@calummackervoy calummackervoy self-assigned this Nov 12, 2024
@calummackervoy calummackervoy force-pushed the calum/modification-adresse-mail branch from 8ba6071 to b9f6941 Compare November 12, 2024 16:04
@calummackervoy calummackervoy added 1-recette-jetable [Payé à l’heure] Crée une recette jetable sur CC and removed 1-recette-jetable [Payé à l’heure] Crée une recette jetable sur CC labels Nov 12, 2024
Copy link

🥁 La recette jetable est prête ! 👉 Je veux tester cette PR !

itou/www/dashboard/views.py Outdated Show resolved Hide resolved
@calummackervoy calummackervoy marked this pull request as draft November 20, 2024 16:30
@calummackervoy calummackervoy force-pushed the calum/modification-adresse-mail branch from b9f6941 to 9092579 Compare November 20, 2024 16:56
Comment on lines +1 to +10
{% autoescape off %}
Nous avons bien enregistré votre demande d'inscription et vous remercions de votre confiance.

Afin de finaliser votre inscription, cliquez sur le lien suivant :

{{ activate_url }}

Si vous n'êtes pas à l'origine de cette demande, merci de ne pas prendre en compte ce message.
{% include "layout/base_email_signature.txt" %}
{% endautoescape %}
Copy link
Contributor Author

@calummackervoy calummackervoy Nov 25, 2024

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Fonctionnalité de django-allauth, ce gabarit sera utilisé lorsque signup=True (docs)

@calummackervoy calummackervoy force-pushed the calum/modification-adresse-mail branch from 9092579 to 6a40156 Compare November 26, 2024 11:58
@calummackervoy calummackervoy removed the 1-recette-jetable [Payé à l’heure] Crée une recette jetable sur CC label Nov 26, 2024
@calummackervoy calummackervoy force-pushed the calum/modification-adresse-mail branch from 6a40156 to 8827113 Compare November 26, 2024 13:51
@calummackervoy calummackervoy marked this pull request as ready for review November 26, 2024 13:52
Comment on lines 17 to 19
EmailAddress.objects.bulk_create(
EmailAddress(user=x.user, email=x.email, primary=True, verified=False) for x in users_missing_addresses
)
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

J'aurais aimé éviter verified=False dans le mesure de possible. Avec notre système du courant la logique verified=(x.last_login_date > x.modified_at) serait fiable, mais on ne stocke pas un champ modified_at

@calummackervoy calummackervoy added the 1-recette-jetable [Payé à l’heure] Crée une recette jetable sur CC label Nov 26, 2024
Copy link

🥁 La recette jetable est prête ! 👉 Je veux tester cette PR !

@calummackervoy calummackervoy changed the title Connexion: Envoie de confirmation pendant la modification d'adresse mail [GEN-2216] Connexion: Utilisation du modèle EmailAddress et refonte du parcours de modification d'adresse mail [GEN-2216] Nov 26, 2024
@calummackervoy calummackervoy force-pushed the calum/modification-adresse-mail branch from 8827113 to 10f0e77 Compare November 26, 2024 15:43
Previously the user would need to try to login before the notification was sent

Fix requesting email modification does not lock users out of their account

Better conflict handling in EditUserEmailForm

Ensure EmailAddress consistency when user email changes
Use EmailAddress model in user query email_already_exists

Override create_user to prevent EmailAddress conflicts

Fix language in error of create_user

May be shown to users

Creation of candidate by third party considers EmailAddress (JobSeekerExistsForm)
Many users on production have User.email set with no corresponding email address model

Fix migration should assume emails are not verified

Fix migration typo
Emails are case insensitive (RFC 5321 Part 2.4)
@calummackervoy calummackervoy force-pushed the calum/modification-adresse-mail branch from 10f0e77 to 2602f6d Compare November 26, 2024 16:15
Copy link
Contributor

@xavfernandez xavfernandez left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

J'ai un peu l'impression qu'on profite de l'existence du modèle EmailAddress de django-allauth pour implémenter notre changement d'adresse email.
Je me demande s'il ne faudrait pas plutôt le faire avec notre modèle à nous plutôt que de donner l'impression d'utiliser (en la détournant fortement) la fonctionnalité de django-allauth ?

@@ -173,13 +173,15 @@ def inclusion_connect_activate_account(request):
return HttpResponseRedirect(params.get("previous_url", reverse("search:employers_home")))

user_kind = params.get("user_kind")
user = User.objects.filter(email=email).first()
email_address = EmailAddress.objects.filter(email__iexact=email).first()
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
email_address = EmailAddress.objects.filter(email__iexact=email).first()
email_address = EmailAddress.objects.filter(email__iexact=email).select_related("user").first()

Et a priori à chaque fois qu'on utilise EmailAddress pour récupérer un User.

.values("id", "email")
)

EmailAddress.objects.bulk_create(
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Il y en a beaucoup ? Ça vaudrait ptet le coup de faire un migration atomic = False.

migrations.RunPython(
create_email_addresses_for_users,
reverse_code=migrations.RunPython.noop,
),
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Tu peux rajouter elidable=True si elle peut être squashée.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Bien vu merci !

Comment on lines +723 to 727
queryset = cls.objects.filter(
id__in=EmailAddress.objects.filter(email__iexact=email).values_list("user_id", flat=True)
)
if exclude_pk:
queryset = queryset.exclude(pk=exclude_pk)
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
queryset = cls.objects.filter(
id__in=EmailAddress.objects.filter(email__iexact=email).values_list("user_id", flat=True)
)
if exclude_pk:
queryset = queryset.exclude(pk=exclude_pk)
queryset = EmailAddress.objects.filter(email__iexact=email)
if exclude_pk:
queryset = queryset.exclude(user_id=exclude_pk)

@calummackervoy
Copy link
Contributor Author

@xavfernandez

Je me demande s'il ne faudrait pas plutôt le faire avec notre modèle à nous plutôt que de donner l'impression d'utiliser (en la détournant fortement) la fonctionnalité de django-allauth ?

Je suis pour l'utilisation du modèle de django-allauth je pense, car ces adresses sont bien imbriquées dans les concernes d'allauth (l'envoie des e-emails, leur verification, leur association au compte utilisateur) - et on gère les EmailAddress ici avec le fonctionnement d'allauth bien en tête.

Qu'est ce que tu penses ?

# We want to control how EmailAddress is managed during this view
re_path(
r"^accounts/confirm-email/(?P<key>[-:\w]+)/$",
signup_views.ItouConfirmEmailView.as_view(),
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pourquoi ne pas garder celle de django-allauth ?

@tonial
Copy link
Contributor

tonial commented Dec 10, 2024

Je suis pas forcément très convaincu de la direction de la PR :
On utilise assez peu de fonctionnalités de la lib (connexion avec l'email au lieu du username, et confirmation de l'email)
À côté de ça on a les connexions SSO (ProConnect, FranceConnect et FTConnect) qui sont gérées séparément et que tu es obligé de rebrancher sur la gestion des EmailAdresse de django-allauth.
On se rend compte qu'on a des vues qui sont présentes sans qu'on s'en rendre compte (mais un hackeur pourrait le savoir
Je pense qu'on ferait mieux de retirer django-allauth

@calummackervoy calummackervoy removed the 1-recette-jetable [Payé à l’heure] Crée une recette jetable sur CC label Dec 12, 2024
@calummackervoy calummackervoy marked this pull request as draft December 12, 2024 18:04
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
bug no-changelog Ne doit pas figurer dans le journal des changements.
Projects
None yet
Development

Successfully merging this pull request may close these issues.

4 participants