From 543d827322a9528d3a6eb4e932d017b98fede82a Mon Sep 17 00:00:00 2001 From: Yakser Date: Mon, 21 Aug 2023 23:53:10 +0300 Subject: [PATCH 1/4] Started working on password resetting --- procollab/settings.py | 2 +- procollab/urls.py | 4 ++++ templates/email/password_reset_email.html | 18 ++++++++++++++ templates/email/password_reset_email.txt | 3 +++ users/signals.py | 29 ++++++++++++++++++++++- users/urls.py | 24 +++++++++---------- 6 files changed, 65 insertions(+), 15 deletions(-) create mode 100644 templates/email/password_reset_email.html create mode 100644 templates/email/password_reset_email.txt diff --git a/procollab/settings.py b/procollab/settings.py index 1c8568a0..7d57f687 100644 --- a/procollab/settings.py +++ b/procollab/settings.py @@ -73,7 +73,6 @@ "django.contrib.messages", "django.contrib.staticfiles", "debug_toolbar", - "django_rest_passwordreset", # My apps "core.apps.CoreConfig", "industries.apps.IndustriesConfig", @@ -92,6 +91,7 @@ "rest_framework_simplejwt", "rest_framework_simplejwt.token_blacklist", "django_cleanup.apps.CleanupConfig", + "django_rest_passwordreset", # "rest_framework.authtoken", # Plugins "corsheaders", diff --git a/procollab/urls.py b/procollab/urls.py index afdd895d..74222714 100644 --- a/procollab/urls.py +++ b/procollab/urls.py @@ -50,6 +50,10 @@ path("api/token/", TokenObtainPairView.as_view(), name="token_obtain_pair"), path("api/token/refresh/", TokenRefreshView.as_view(), name="token_refresh"), path("api/token/verify/", TokenVerifyView.as_view(), name="token_verify"), + path( + "reset_password/", + include("django_rest_passwordreset.urls", namespace="password_reset"), + ), path("", include("metrics.urls", namespace="metrics")), ] diff --git a/templates/email/password_reset_email.html b/templates/email/password_reset_email.html new file mode 100644 index 00000000..f754ea2b --- /dev/null +++ b/templates/email/password_reset_email.html @@ -0,0 +1,18 @@ + + + + Сброс пароля | Procollab + + +

С возвращением, {{ user.first_name }} 👋

+

+ Ты можешь сбросить пароль, перейдя по ссылке ниже. +

+

+ Если ты не запрашивал новый пароль, пожалуйста игнорируй это письмо. +

+

+ {{ reset_password_url }} +

+ + \ No newline at end of file diff --git a/templates/email/password_reset_email.txt b/templates/email/password_reset_email.txt new file mode 100644 index 00000000..b662c0b8 --- /dev/null +++ b/templates/email/password_reset_email.txt @@ -0,0 +1,3 @@ +С возвращением, {{user.first_name}}! 👋 Ты можешь сбросить пароль, перейдя по ссылке ниже. +Если ты не запрашивал новый пароль, пожалуйста игнорируй это письмо. +{{ reset_password_url }} \ No newline at end of file diff --git a/users/signals.py b/users/signals.py index aae00293..ac7e6471 100644 --- a/users/signals.py +++ b/users/signals.py @@ -1,7 +1,10 @@ +from django.core.mail import EmailMultiAlternatives from django.db.models.signals import post_save from django.dispatch import receiver +from django.template.loader import render_to_string +from django_rest_passwordreset.signals import reset_password_token_created -from users.models import CustomUser, Member, Mentor, Expert, Investor +from users.models import CustomUser, Expert, Investor, Member, Mentor @receiver(post_save, sender=CustomUser) @@ -20,3 +23,27 @@ def create_or_update_user_types(sender, instance, created, **kwargs): if instance.ordering_score != current_ordering_score: instance.ordering_score = current_ordering_score instance.save() + + +@receiver(reset_password_token_created) +def password_reset_token_created(sender, instance, reset_password_token, *args, **kwargs): + reset_password_url = ( + f"https://app.procollab.ru/auth/reset_password/?token={reset_password_token.key}" + ) + context = { + "user": reset_password_token.user, + "email": reset_password_token.user.email, + "reset_password_url": reset_password_url, + } + + email_html_message = render_to_string("email/password_reset_email.html", context) + email_plaintext_message = render_to_string("email/password_reset_email.txt", context) + + msg = EmailMultiAlternatives( + "Сброс пароля | Procollab", + email_plaintext_message, + "procollab2022@gmail.com", + [reset_password_token.user.email], + ) + msg.attach_alternative(email_html_message, "text/html") + msg.send() diff --git a/users/urls.py b/users/urls.py index 20a202b7..a711ae63 100644 --- a/users/urls.py +++ b/users/urls.py @@ -18,8 +18,6 @@ ResendVerifyEmail, CurrentUserPrograms, CurrentUserProgramsTags, - ResetCurrentUserPassword, - EmailResetPassword, ) app_name = "users" @@ -36,7 +34,7 @@ path("users//", UserDetail.as_view()), path("users//set_onboarding_stage/", SetUserOnboardingStage.as_view()), path("users/current/", CurrentUser.as_view()), - path("users/current/email_reset_password/", EmailResetPassword.as_view()), + # path("users/current/email_reset_password/", EmailResetPassword.as_view()), # todo: change password view path("users/current/programs/", CurrentUserPrograms.as_view()), path("users/current/programs/tags/", CurrentUserProgramsTags.as_view()), @@ -59,14 +57,14 @@ VerifyEmail.as_view(), name="account_confirm_email", ), - re_path( - r"^password-reset/", - ResetCurrentUserPassword.as_view(), - name="password_reset_sent", - ), - re_path( - r"^password-reset/(?P[-:\w]+)/$", - ResetCurrentUserPassword.as_view(), - name="password_reset", - ), + # re_path( + # r"^password-reset/", + # ResetCurrentUserPassword.as_view(), + # name="password_reset_sent", + # ), + # re_path( + # r"^password-reset/(?P[-:\w]+)/$", + # ResetCurrentUserPassword.as_view(), + # name="password_reset", + # ), ] From 887486ba24c54c81a3014909006445d74342b1cd Mon Sep 17 00:00:00 2001 From: Yakser Date: Tue, 22 Aug 2023 00:04:07 +0300 Subject: [PATCH 2/4] Terrible version of html email --- templates/email/password_reset_email.html | 480 +++++++++++++++++++++- 1 file changed, 462 insertions(+), 18 deletions(-) diff --git a/templates/email/password_reset_email.html b/templates/email/password_reset_email.html index f754ea2b..44d3dd26 100644 --- a/templates/email/password_reset_email.html +++ b/templates/email/password_reset_email.html @@ -1,18 +1,462 @@ - - - - Сброс пароля | Procollab - - -

С возвращением, {{ user.first_name }} 👋

-

- Ты можешь сбросить пароль, перейдя по ссылке ниже. -

-

- Если ты не запрашивал новый пароль, пожалуйста игнорируй это письмо. -

-

- {{ reset_password_url }} -

- - \ No newline at end of file + + + + + + + + + + + + + + + + + + + + + + + + +
Ваш аккаунт верифицирован
+ + +
+ + + + + + + +
+ + + + + +
+ + + + + + + +
+ + + +
+ + + + + + + +
+ + +
+ + + + + + + + + +
+ + + + + + + +
+ + + +
+ +
+ +
+ + +
+ +
+ + + + + +
+ + + + + + + +
+ + + +
+ + + + + + + +
+ + +
+ + + + + + + + + +
+ +
С возвращением, {{ user.first_name }} 👋
+ +
+ +
+ + +
+ +
+ + + + + +
+ + + + + + + +
+ + +
+ + + + + + + + + + + + + + + + + +
+ +
Ты можешь сбросить пароль, перейдя по ссылке ниже.
+ +
+ +
+ + + + + + + +
+ + + +
+ +
+ +
+ +
Если ты не запрашивал новый пароль, пожалуйста игнорируй это письмо.
+ +
+ +
+ + +
+ +
+ + + + + +
+ + + + + + + +
+ + +
+ + + + + + + +
+ + + + + + + + + +
+ + + + + + + +
+ + Сбросить пароль + +
+ +
+ +
+ +
+ + +
+ +
+ + + + + +
+ + + + + + + +
+ + +
+ + + + + + + + + +
+ + + +
+ +
+ + +
+ +
+ + + +
+ +
+ + + +
+ +
+ + + + + +
+ +
+ + + From 86bc12dc3f187b4657965d61370959ab559b4ecf Mon Sep 17 00:00:00 2001 From: Yakser Date: Tue, 22 Aug 2023 21:09:16 +0300 Subject: [PATCH 3/4] Move django_rest_passwordreset.urls to users app --- procollab/urls.py | 8 ++++---- users/urls.py | 17 +++++------------ 2 files changed, 9 insertions(+), 16 deletions(-) diff --git a/procollab/urls.py b/procollab/urls.py index 74222714..f9e9a7b0 100644 --- a/procollab/urls.py +++ b/procollab/urls.py @@ -50,10 +50,10 @@ path("api/token/", TokenObtainPairView.as_view(), name="token_obtain_pair"), path("api/token/refresh/", TokenRefreshView.as_view(), name="token_refresh"), path("api/token/verify/", TokenVerifyView.as_view(), name="token_verify"), - path( - "reset_password/", - include("django_rest_passwordreset.urls", namespace="password_reset"), - ), + # path( + # "reset_password/", + # include("django_rest_passwordreset.urls", namespace="password_reset"), + # ), path("", include("metrics.urls", namespace="metrics")), ] diff --git a/users/urls.py b/users/urls.py index a711ae63..59408138 100644 --- a/users/urls.py +++ b/users/urls.py @@ -1,4 +1,4 @@ -from django.urls import path, re_path +from django.urls import path, re_path, include from users.views import ( AchievementDetail, @@ -34,7 +34,6 @@ path("users//", UserDetail.as_view()), path("users//set_onboarding_stage/", SetUserOnboardingStage.as_view()), path("users/current/", CurrentUser.as_view()), - # path("users/current/email_reset_password/", EmailResetPassword.as_view()), # todo: change password view path("users/current/programs/", CurrentUserPrograms.as_view()), path("users/current/programs/tags/", CurrentUserProgramsTags.as_view()), @@ -57,14 +56,8 @@ VerifyEmail.as_view(), name="account_confirm_email", ), - # re_path( - # r"^password-reset/", - # ResetCurrentUserPassword.as_view(), - # name="password_reset_sent", - # ), - # re_path( - # r"^password-reset/(?P[-:\w]+)/$", - # ResetCurrentUserPassword.as_view(), - # name="password_reset", - # ), + path( + "reset_password/", + include("django_rest_passwordreset.urls", namespace="password_reset"), + ), ] From 575b5861d5115d35586b88773764fd65312ecf74 Mon Sep 17 00:00:00 2001 From: Yakser Date: Tue, 22 Aug 2023 21:14:27 +0300 Subject: [PATCH 4/4] Remove comment --- procollab/urls.py | 4 ---- 1 file changed, 4 deletions(-) diff --git a/procollab/urls.py b/procollab/urls.py index f9e9a7b0..afdd895d 100644 --- a/procollab/urls.py +++ b/procollab/urls.py @@ -50,10 +50,6 @@ path("api/token/", TokenObtainPairView.as_view(), name="token_obtain_pair"), path("api/token/refresh/", TokenRefreshView.as_view(), name="token_refresh"), path("api/token/verify/", TokenVerifyView.as_view(), name="token_verify"), - # path( - # "reset_password/", - # include("django_rest_passwordreset.urls", namespace="password_reset"), - # ), path("", include("metrics.urls", namespace="metrics")), ]