diff --git a/locale/es_ES/LC_MESSAGES/django.po b/locale/es_ES/LC_MESSAGES/django.po index 1451319..d06afb3 100644 --- a/locale/es_ES/LC_MESSAGES/django.po +++ b/locale/es_ES/LC_MESSAGES/django.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2025-01-16 23:18+0100\n" +"POT-Creation-Date: 2025-01-16 23:42+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -738,7 +738,7 @@ msgstr "Contraseña" msgid "Mantener sesión iniciada" msgstr "Mantener sesión iniciada" -#: users/forms/reset_password.py:16 users/forms/reset_password.py:30 +#: users/forms/reset_password.py:16 users/forms/reset_password.py:32 msgid "El token no es válido o ha expirado" msgstr "El token no es válido o ha expirado" @@ -1041,8 +1041,8 @@ msgid "" "You're receiving this email because you requested a password reset for your " "user account at %(site_name)s." msgstr "" -"Ha recibido este correo electrónico porque ha solicitado restablecer la contraseña para su " -"cuenta en %(site_name)s." +"Ha recibido este correo electrónico porque ha solicitado restablecer la " +"contraseña para su cuenta en %(site_name)s." #: web/templates/mails/reset_password.html:4 msgid "Please go to the following page and choose a new password:" @@ -1059,7 +1059,7 @@ msgstr " ¡Gracias por usar nuestro sitio!" #: web/templates/mails/reset_password.html:12 #, python-format msgid "The %(site_name)s team" -msgstr "El equipo de %(site_name)" +msgstr "El equipo de %(site_name)s" #: web/templates/users/login.html:18 msgid "Inicia sesión en tu cuenta" @@ -1265,7 +1265,9 @@ msgid "reset-password/" msgstr "restablecer-contrasena/" #: web/urls.py:53 -msgid "reset///" +#, fuzzy +#| msgid "reset///" +msgid "reset-password///" msgstr "restablecer-contrasena///" #: web/urls.py:58 diff --git a/users/forms/reset_password.py b/users/forms/reset_password.py index cb5c1a9..daf19e6 100644 --- a/users/forms/reset_password.py +++ b/users/forms/reset_password.py @@ -24,7 +24,9 @@ class SetPasswordForm(BaseSetPasswordForm): ) def validate_token(self): - is_valid = default_token_generator.check_token(self.user, self.data.get('token')) + is_valid = default_token_generator.check_token( + self.user, self.data.get("token") + ) if not is_valid: raise ValidationError(_("El token no es válido o ha expirado")) diff --git a/web/tests/test_reset_password.py b/web/tests/test_reset_password.py new file mode 100644 index 0000000..c43440d --- /dev/null +++ b/web/tests/test_reset_password.py @@ -0,0 +1,79 @@ +from django.contrib.auth import get_user_model +from django.shortcuts import reverse +from django.test import TransactionTestCase +from django.contrib.auth.tokens import default_token_generator +from django.utils.http import urlsafe_base64_encode +from django.utils.encoding import force_bytes + +User = get_user_model() + + +class TestResetPassword(TransactionTestCase): + def setUp(self) -> None: + self.password = "theonering" + self.email = "sauron@mordor.middleearth" + self.first_name = "Sauron" + self.last_name = "The Lord of the Rings" + + self.user = User.objects.create_user( + username=self.email, + password=self.password, + first_name=self.first_name, + last_name=self.last_name, + ) + + def test_get_reset_password_page(self): + response = self.client.get(reverse("web:reset_password")) + assert response.status_code == 200 + + def test_reset_password(self): + response = self.client.post( + reverse("web:reset_password"), + { + "email": self.email, + }, + ) + + assert response.status_code == 302 + assert response.url == reverse("web:reset_password_email_sent") + + def test_reset_password_not_existing_user(self): + response = self.client.post( + reverse("web:reset_password"), + { + "email": 'vanpiro@noesiten.com', + }, + ) + + assert response.status_code == 302 + assert response.url == reverse("web:reset_password_email_sent") + + def test_reset_password_confirm_get(self): + token = default_token_generator.make_token(self.user) + uidb64 = urlsafe_base64_encode(force_bytes(self.user.pk)) + + response = self.client.get( + reverse("web:reset_password_confirm", kwargs={"uidb64": uidb64, "token": token}), + ) + + assert response.status_code == 200 + + def test_reset_password_confirm(self): + token = default_token_generator.make_token(self.user) + form_token = default_token_generator.make_token(self.user) + uidb64 = urlsafe_base64_encode(force_bytes(self.user.pk)) + + new_password = '89733wy29' + + response = self.client.post( + reverse("web:reset_password_confirm", kwargs={"uidb64": uidb64, "token": token}), { + "token": form_token, + "new_password1": new_password, + "new_password2": new_password, + } + ) + assert response.status_code == 302 + assert response.url == reverse('web:login') + self.user.refresh_from_db() + + assert self.user.check_password(new_password) diff --git a/web/urls.py b/web/urls.py index 7ee41ea..c5de0ff 100644 --- a/web/urls.py +++ b/web/urls.py @@ -50,7 +50,7 @@ i18n_resolvers = i18n_patterns( path(_("register/"), register, name="register"), path(_("reset-password/"), reset_password, name="reset_password"), path( - _("reset///"), + _("reset-password///"), reset_password_confirm, name="reset_password_confirm", ), diff --git a/web/views/users.py b/web/views/users.py index 3768bd0..1560100 100644 --- a/web/views/users.py +++ b/web/views/users.py @@ -210,7 +210,7 @@ class ResetPasswordConfirmView(TemplateView): return { "title": WebSettings.load().web_title, "description": _("Establecer nueva contraseña"), - "form": self.form_class(user, {'token': new_token}), + "form": self.form_class(user, {"token": new_token}), "valid_token": valid_token, "new_token": new_token, }