From 9fe43135403514e525269365a2974008fcb6d314 Mon Sep 17 00:00:00 2001 From: Jean-Romain Garnier Date: Fri, 17 Apr 2020 20:23:28 +0200 Subject: [PATCH] Move some code away from the forms --- users/forms.py | 19 ------------------- users/models.py | 21 +++++++++++++++++++++ users/views.py | 24 ++++++++++-------------- 3 files changed, 31 insertions(+), 33 deletions(-) diff --git a/users/forms.py b/users/forms.py index 441d645c..effb9623 100644 --- a/users/forms.py +++ b/users/forms.py @@ -333,7 +333,6 @@ class AdherentForm(FormRevMixin, FieldPermissionFormMixin, ModelForm): self.fields["room"].label = _("Room") self.fields["room"].empty_label = _("No room") self.fields["school"].empty_label = _("Select a school") - self.is_anon = kwargs["user"].is_anonymous() class Meta: model = Adherent @@ -382,23 +381,6 @@ class AdherentForm(FormRevMixin, FieldPermissionFormMixin, ModelForm): remove_user_room(room) return - def save(self, commit=True): - """On met à jour l'état de l'utilisateur en fonction de son mail""" - user = super(AdherentForm, self).save(commit=commit) - - if not self.is_anon and self.initial["email"] and user.email != self.initial["email"]: - # Send a confirmation email - if user.state in [User.STATE_ACTIVE, User.STATE_DISABLED, User.STATE_NOT_YET_ACTIVE]: - user.email_state = User.EMAIL_STATE_PENDING - self.should_send_confirmation_email = True - - # Always keep the oldest change date - if user.email_change_date is None: - user.email_change_date = timezone.now() - - user.save() - return user - class AdherentCreationForm(AdherentForm): """Formulaire de création d'un user. @@ -518,7 +500,6 @@ class AdherentCreationForm(AdherentForm): an email to init the password should be sent""" # Save the provided password in hashed format user = super(AdherentForm, self).save(commit=False) - user.email_change_date = timezone.now() is_set_password_allowed = OptionalUser.get_cached_value("allow_set_password_during_user_creation") send_email = not is_set_password_allowed or self.cleaned_data.get("init_password_by_mail") diff --git a/users/models.py b/users/models.py index 9c43561f..b9162f5b 100755 --- a/users/models.py +++ b/users/models.py @@ -800,6 +800,26 @@ class User( ) return + def send_confirm_email_if_necessary(self, request): + """Update the user's email state + Returns whether an email was sent""" + # Only update the state if the email changed + if self.__original_email == self.email: + return False + + # Archived users shouldn't get an email + if self.state not in [self.STATE_ACTIVE, self.STATE_DISABLED, self.STATE_NOT_YET_ACTIVE]: + return False + + # Always keep the oldest change date + if self.email_change_date is None: + self.email_change_date = timezone.now() + + self.email_state = self.EMAIL_STATE_PENDING + self.confirm_email_address_mail(request) + + return True + def confirm_email_before_date(self): if self.email_change_date is None or self.email_state == self.EMAIL_STATE_VERIFIED: return None @@ -810,6 +830,7 @@ class User( def confirm_email_address_mail(self, request): """Prend en argument un request, envoie un mail pour confirmer l'adresse""" + # Create the request and send the email req = Request() req.type = Request.EMAIL req.user = self diff --git a/users/views.py b/users/views.py index a2a62316..2366e417 100644 --- a/users/views.py +++ b/users/views.py @@ -124,11 +124,9 @@ def new_user(request): is_set_password_allowed = OptionalUser.get_cached_value("allow_set_password_during_user_creation") if user.is_valid(): - user = user.save() - # Use "is False" so that if None, the email is sent - if is_set_password_allowed and user.should_send_password_reset_email is False: - user.confirm_email_address_mail(request) + if is_set_password_allowed and user.should_send_password_reset_email: + user.send_confirm_email_if_necessary(request) messages.success( request, _("The user %s was created, a confirmation email was sent.") @@ -142,6 +140,7 @@ def new_user(request): % user.pseudo, ) + user = user.save() return redirect(reverse("users:profil", kwargs={"userid": str(user.id)})) # Anonymous users are allowed to create new accounts @@ -223,13 +222,12 @@ def edit_info(request, user, userid): ) if user_form.is_valid(): if user_form.changed_data: + if user.send_confirm_email_if_necessary(request): + messages.success(request, _("Sent a new confirmation email.")) + user = user_form.save() messages.success(request, _("The user was edited.")) - if user_form.should_send_confirmation_email: - user.confirm_email_address_mail(request) - messages.success(request, _("Sent a new confirmation email.")) - return redirect(reverse("users:profil", kwargs={"userid": str(userid)})) return form( {"userform": user_form, "action_name": _("Edit")}, @@ -544,14 +542,12 @@ def edit_email_settings(request, user_instance, **_kwargs): ) if email_settings.is_valid(): if email_settings.changed_data: + if user_instance.send_confirm_email_if_necessary(request): + messages.success(request, _("An email to confirm your address was sent.")) + email_settings.save() messages.success(request, _("The email settings were edited.")) - # Send confirmation email if necessary - if email_settings.should_send_confirmation_email is True: - user_instance.confirm_email_address_mail(request) - messages.success(request, _("An email to confirm your address was sent.")) - return redirect( reverse("users:profil", kwargs={"userid": str(user_instance.id)}) ) @@ -1073,7 +1069,7 @@ def resend_confirmation_email(request, logged_user, userid): messages.error(request, _("The user doesn't exist.")) if request.method == "POST": - user.confirm_email_address_mail(request) + user.send_confirm_email_if_necessary(request) messages.success(request, _("An email to confirm your address was sent.")) return redirect(reverse("users:profil", kwargs={"userid": userid}))