From 6f9cb34b6cd9fbd48caed0b22cb022a54461a4d6 Mon Sep 17 00:00:00 2001 From: daniel Date: Fri, 20 Mar 2026 11:32:54 +0100 Subject: [PATCH] feat: Add Password recuperation logic Added: - Phase 1 Template + Logic - Phase 2 Template + Logic --- proyecto/__pycache__/__init__.cpython-314.pyc | Bin 243 -> 243 bytes proyecto/__pycache__/settings.cpython-314.pyc | Bin 11609 -> 11793 bytes templates/jinja2/emails/reset_pass.html | 27 +++++++++++ tienda/__pycache__/admin.cpython-314.pyc | Bin 4731 -> 4731 bytes tienda/__pycache__/models.cpython-314.pyc | Bin 16229 -> 16229 bytes tienda/__pycache__/urls.cpython-314.pyc | Bin 4523 -> 4842 bytes tienda/__pycache__/vars.cpython-314.pyc | Bin 2214 -> 2214 bytes tienda/__pycache__/views.cpython-314.pyc | Bin 68105 -> 70749 bytes .../__pycache__/0001_initial.cpython-314.pyc | Bin 12698 -> 12698 bytes ...ioncode_code_mode_and_more.cpython-314.pyc | Bin 1069 -> 1069 bytes tienda/tasks.py | 28 +++++++++++- tienda/templates/tienda/login.html | 2 +- tienda/templates/tienda/reset_password.html | 34 ++++++++++++++ .../tienda/reset_password_phase2.html | 39 ++++++++++++++++ tienda/urls.py | 4 +- tienda/views.py | 43 ++++++++++++++++-- 16 files changed, 170 insertions(+), 7 deletions(-) create mode 100644 templates/jinja2/emails/reset_pass.html create mode 100644 tienda/templates/tienda/reset_password.html create mode 100644 tienda/templates/tienda/reset_password_phase2.html diff --git a/proyecto/__pycache__/__init__.cpython-314.pyc b/proyecto/__pycache__/__init__.cpython-314.pyc index 3adf1a098fe65e214eba314d02e1d5dc7d78ddbe..8250ca705cea9cfd9618ad5aed07965880649c79 100644 GIT binary patch delta 19 Zcmey&_?eMgn~#@^0SIm|?VZT|0st}J1z!LF delta 19 Zcmey&_?eMgn~#@^0SL~sZJ5aY0st|I1x)|| diff --git a/proyecto/__pycache__/settings.cpython-314.pyc b/proyecto/__pycache__/settings.cpython-314.pyc index 30642f3fb8036ca34e049bc95fc05cac355271bc..3cb50574fb9b29fb8e1b230b3b3541934504055f 100644 GIT binary patch delta 1447 zcmY+D+fy4=9LM+UX0rqchHFR(gph1fDBW!VDHkhNTE|k_;I|jGuxSI0<(7nQ4p?Xv zTCdewiN|WazB<0CJouzfzWAWSjF(9nM`!#49DH<~aXh;;X}UA}JLi0Uzw-uoa%bfP=BrwLxe4S#3FP6o?rQ-P4=L(NcLJ} zRYPr&=!T0gw-5V^#D^|)qX!S`qORzKdXGP3ui1+*Kf;01Bk&0BM;LuN;kMtl1GXL1 ziRPeOHQ&DhgUwu z$CK9Bby}Bc7tYXbyB<&9uLte1i1Z9P*&RnndX~4}IzsNVB@qYgh;dA?ayb+*5HIYB z_S=;^hx0`;V8Feqyr!6m>NVTG&Hr*=P)l zae^htcpjIrj1{gR!4+J^3wRN$oUIw7x`b^18S8R}) zyD(##t87-iMRM#P^{4W?oLg@(`#JkH@_nygaMf(q4(7|M)*Cnd+Ar1Grbo}0)vO=R jmsRI0eVa{v+mcvUzU@+E=XP_0TU>K(@7wq+`jz}Ykeycs delta 1371 zcmZvc-BVjd7{+(c$sq~lAhggBDCCPk!beUENDI_{P+JQv4fFIv#hehZG*F<@WNW_* zwN|aR*syAA$7`MOqBE9zFP-tiD`%YA3;zJGyztH$$9E4VO-D0xp561?Js6&3zLuR5$R)h4#VP`>60SxP5G)W`PSg3WeNHBWp?Cr>V(|iP{8% zOmeZA+Rv!nf;v%$dTfP{NCRr%M$ zo9OM@v=NC?nnB|TqR--_FFV@r=uV3#T%rNHgdYQ<5jCQTo^2Qu%^;hhavRY?BwS9g zyZnuk5TGs8;}x9F)Z3_ zBg9nT%?I#mG0Z-`5r$}YoDbrVT+v&XDf=TBC3~GBi{XffqgiyM8IF#09_|v|0cLlP z2RA+~SBw!)m6MG=juB7)4^I-${D-?4#%W-B%~j{I4ABFKUbS=mIAZdlE25vE_Ip>v zJo)@kMZYuS6pd6G5&d<%A-5Zm`ZqCAj8zOchx`^&a+YS;NXu0tVou_DS?*RIJR_eP zQ9dRAHsX9*#wslRZLwdCn5VJ1jt8>#p(@s+7jqk6 zM-q&ASqrm0RAh5<+?_PfV!r4!{y=8TM)`v~U@TAtEXv>A1LnD%|6UbJ^_W^|`5i13 zzbLN?k;M5lM-B$^5V(MM>DV|f;u0?73a%2nW*@b5T&MRN&ik@G9%6Q~xIe7mA#SD( zH4pFM7L~h(_YrnHt|v5y-yVcPCLg>A9rmGO365)+$8Cpv^x`b3c`g4PaoipdC+tCS z(jG#3*J1h>I7PjW<*2va{KVc<3{Ff?2{!S&@{u=k;5FPW@f7aS6|iwnr0JQ&mm))V zX$q@i+TKfv{nW0dv}?t%0t`ID;*XwG{#Lauh zX(pGur0^97EY6>v%jIs!KclPszP#1;bLCUw>hk5U%1rx@9=+PsR=j@%*C%67jDG;u CfFb|@ diff --git a/templates/jinja2/emails/reset_pass.html b/templates/jinja2/emails/reset_pass.html new file mode 100644 index 0000000..32dc1a9 --- /dev/null +++ b/templates/jinja2/emails/reset_pass.html @@ -0,0 +1,27 @@ + + + + +
+ + + + + + + + + + +
+

¡Hola {{ name }}!

+
+ alert alert +
+

¡Alguien esta intentando cambiar la contraseña de tu cuenta!

+

Si has sido tu, haga click en el siguiente enlace. Si no, Elimine el correo de inmediato

+

+

Para resetear tu contraseña, Haga click aqui

+

Este email ha sido enviado automaticamente, no responda a este correo.

+
+
\ No newline at end of file diff --git a/tienda/__pycache__/admin.cpython-314.pyc b/tienda/__pycache__/admin.cpython-314.pyc index 1b0d6563aa5156323a943f6a27323edeac0293a5..bf9e0c8a0b6e28708e9ce8dcc76a87ee32acf27b 100644 GIT binary patch delta 20 acmeyZ@>_*ln~#@^0SIm|?cK;-AOrwB`~`0S delta 20 acmeyZ@>_*ln~#@^0SJ!XT)&aKKnMUqI|d~H diff --git a/tienda/__pycache__/models.cpython-314.pyc b/tienda/__pycache__/models.cpython-314.pyc index 0a69a30866b255e44fd57e4d7b770efead912cd7..664bcdd572f4d22627ff9440246769f43a9c5d16 100644 GIT binary patch delta 20 acmaD__q2{%n~#@^0SIm|?cK;7We)&GVFnHW delta 20 acmaD__q2{%n~#@^0SI&qHg4pOvIhV{g$0BF diff --git a/tienda/__pycache__/urls.cpython-314.pyc b/tienda/__pycache__/urls.cpython-314.pyc index ab71d24a1c7947e8e67928048baad7dc5c6d154d..bcd2369a6d9e2332aafeff61735aac3f509e64a2 100644 GIT binary patch delta 990 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 delta 12540 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 diff --git a/tienda/migrations/__pycache__/0001_initial.cpython-314.pyc b/tienda/migrations/__pycache__/0001_initial.cpython-314.pyc index 851e7f431676d9c7f2be48b5710401e631313dd7..4fa3f99749326882d2ff92e3c754b0d0d852e513 100644 GIT binary patch delta 20 acmbQ0JS&-7n~#@^0SIm|?cK=TZwLT4&jo1! delta 20 acmbQ0JS&-7n~#@^0SK0zTfdRJ-w*&g^9A() diff --git a/tienda/migrations/__pycache__/0002_verificationcode_code_mode_and_more.cpython-314.pyc b/tienda/migrations/__pycache__/0002_verificationcode_code_mode_and_more.cpython-314.pyc index d4fc2a67103e40db3a6728e361acdb18e4293e6d..6d2093c18a409e0f1d4e2aa60c1cc913f8a24b0f 100644 GIT binary patch delta 20 acmZ3>v6h2dn~#@^0SIm|?cK<&!~y^;&ICUI delta 20 acmZ3>v6h2dn~#@^0SI&qHg4orVgUds@&mO1 diff --git a/tienda/tasks.py b/tienda/tasks.py index 8b76165..bdc6503 100644 --- a/tienda/tasks.py +++ b/tienda/tasks.py @@ -18,7 +18,8 @@ def enviar_correo_bienvenida(email_usuario: str, nombre_usuario: str): send_hemail(email_usuario, "Inicio de Sesión correcto", html_content, "Has iniciado sesión...") @shared_task -def enviar_correo_confirmacion(usuario: User): +def enviar_correo_confirmacion(id: int): + usuario = User.objects.get(id=id) code = VerificationCode.objects.create( user = usuario, code_mode = VerificationCode.VerificationModes.VERIFY_ACCOUNT, @@ -26,4 +27,27 @@ def enviar_correo_confirmacion(usuario: User): ) message = verify_message.format(name = usuario.get_full_name(), protocol = settings.PROTOCOL, domain = settings.DOMAIN, code = code.code) - email_result = send_email(usuario.email, "Verificación de cuenta", message) \ No newline at end of file + email_result = send_email(usuario.email, "Verificación de cuenta", message) + +@shared_task +def enviar_correo_recuperacion(email: str): + usuario = User.objects.get(email=email) + if usuario is not None: + ver_code = VerificationCode.objects.create( + code_mode = VerificationCode.VerificationModes.RESET_PASSWORD, + user = usuario, + code = ''.join(random.choices(string.digits, k=12)) + ) + ver_code.save() + html_content = render_to_string( + 'emails/reset_pass.html', + { + "name": usuario.get_full_name(), + "domain": settings.DOMAIN, + "protocol": settings.PROTOCOL, + "code": ver_code.code + }, + using='jinja2' + ) + + send_hemail(email, "Reset de Contraseña", html_content, "Estas reseteando la contraseña...") diff --git a/tienda/templates/tienda/login.html b/tienda/templates/tienda/login.html index dca6fa6..28e9028 100644 --- a/tienda/templates/tienda/login.html +++ b/tienda/templates/tienda/login.html @@ -34,7 +34,7 @@
diff --git a/tienda/templates/tienda/reset_password.html b/tienda/templates/tienda/reset_password.html new file mode 100644 index 0000000..5bd80a8 --- /dev/null +++ b/tienda/templates/tienda/reset_password.html @@ -0,0 +1,34 @@ +{% extends "tienda/base.html" %} +{% load static %} + +{% block content %} +
+
+
+
+

Recuperar contraseña

+
+
+
+ {% csrf_token %} + +
+ + +
+ +
+ +
+ +
+ +
+

¿No tienes cuenta? Regístrate aquí

+
+
+
+
+
+
+{% endblock %} diff --git a/tienda/templates/tienda/reset_password_phase2.html b/tienda/templates/tienda/reset_password_phase2.html new file mode 100644 index 0000000..27ce0df --- /dev/null +++ b/tienda/templates/tienda/reset_password_phase2.html @@ -0,0 +1,39 @@ +{% extends "tienda/base.html" %} +{% load static %} + +{% block content %} +
+
+
+
+

Recuperar contraseña

+
+
+
+ {% csrf_token %} + +
+ + +
+ +
+ + +
+ +
+ +
+ +
+ +
+

¿No tienes cuenta? Regístrate aquí

+
+
+
+
+
+
+{% endblock %} diff --git a/tienda/urls.py b/tienda/urls.py index 31fb7af..5978912 100644 --- a/tienda/urls.py +++ b/tienda/urls.py @@ -45,5 +45,7 @@ urlpatterns = [ path("usuario/direcciones//eliminar/", views.eliminar_direccion, name="eliminar_direccion"), path("usuario/mensajes/", views.mensajes_comprador, name="mensajes_comprador"), path("verify/", views.verify, name="verify"), - path("rgpd", views.rgpd, name="rgpd") + path("rgpd", views.rgpd, name="rgpd"), + path("reset-password", views.reset_password, name="reset_password"), + path("reset-password-phase2/", views.reset_password_phase2, name="reset_password_phase2") ] diff --git a/tienda/views.py b/tienda/views.py index e969241..f665639 100644 --- a/tienda/views.py +++ b/tienda/views.py @@ -1,5 +1,5 @@ from django.shortcuts import render, redirect, get_object_or_404 -from django.http import HttpRequest, HttpResponse, JsonResponse +from django.http import Http404, HttpRequest, HttpResponse, JsonResponse from django.contrib.auth import authenticate, login as auth_login, logout as auth_logout from django.contrib.auth.decorators import login_required @@ -237,7 +237,7 @@ def register(request: HttpRequest): ) - tasks.enviar_correo_confirmacion.delay(user) + tasks.enviar_correo_confirmacion.delay(user.id) messages.success(request, f"¡Cuenta creada exitosamente! Por favor, verifica tu correo entrando al Link enviado.") return redirect("index") @@ -1256,4 +1256,41 @@ def reset_password(request: HttpRequest): return render(request, "tienda/reset_password", {}) def rgpd(request: HttpRequest): - return render(request, "tienda/rgpd.html", {}) \ No newline at end of file + return render(request, "tienda/rgpd.html", {}) + +def reset_password(request: HttpRequest): + if request.method == "GET": + return render(request, "tienda/reset_password.html", {}) + else: + tasks.enviar_correo_recuperacion.delay(request.POST["email"]) + messages.info(request, "Si tienes una cuenta con ese correo electronico, se ha enviado un correo con un enlace") + return render(request, "tienda/index.html", {}) + +def reset_password_phase2(request: HttpRequest, code: str): + try: + ver_code = VerificationCode.objects.get(code=code) + except VerificationCode.DoesNotExist: + raise Http404() + + if ver_code.code_mode != VerificationCode.VerificationModes.RESET_PASSWORD: raise Http404() + + + if request.method == "GET": + return render(request, "tienda/reset_password_phase2.html", { + "code": code + }) + elif request.method == "POST": + password = request.POST["password"] + vpassword = request.POST["verify_password"] + if password != vpassword: + messages.error(request, "Las contraseñas no coinciden") + return render(request, "tienda/reset_password_phase2.html", {"code": code}) + + user = ver_code.user + user.set_password(password) + user.save() + messages.success(request, "Se ha cambiado la contraseña!") + return redirect(reverse("index")) + + else: + raise Http404()