Skip to content

Commit cdd332a

Browse files
authored
Merge pull request #101 from PROCOLLAB-github/feature/auth
refactoring f-string and send email
2 parents dbec192 + bbf5697 commit cdd332a

2 files changed

Lines changed: 60 additions & 50 deletions

File tree

users/helpers.py

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,10 @@
1+
from rest_framework_simplejwt.tokens import RefreshToken
2+
from django.contrib.sites.shortcuts import get_current_site
3+
from django.urls import reverse
4+
5+
from core.utils import Email
6+
7+
18
ADMIN = 0
29
MEMBER = 1
310
MENTOR = 2
@@ -16,3 +23,43 @@
1623
(EXPERT, "Эксперт"),
1724
(INVESTOR, "Инвестор"),
1825
)
26+
27+
REDIRECT_URL = "https://app.procollab.ru/auth/verification/"
28+
29+
30+
def reset_email(user, request):
31+
access_token = RefreshToken.for_user(user).access_token
32+
refresh_token = RefreshToken.for_user(user)
33+
34+
relative_link = reverse("users:password_reset_sent")
35+
36+
current_site = get_current_site(request).domain
37+
absolute_url = f"https://{current_site}{relative_link}?access_token={access_token}&refresh_token={refresh_token}"
38+
39+
email_body = f"Hi, {user.first_name} {user.last_name}! Use link below for reset password {absolute_url}"
40+
41+
data = {
42+
"email_body": email_body,
43+
"email_subject": "Reset password",
44+
"to_email": user.email,
45+
}
46+
47+
Email.send_email(data)
48+
49+
50+
def verify_email(user, request):
51+
token = RefreshToken.for_user(user).access_token
52+
53+
relative_link = reverse("users:account_email_verification_sent")
54+
current_site = get_current_site(request).domain
55+
absolute_url = f"https://{current_site}{relative_link}?token={token}"
56+
57+
email_body = f"Hi, {user.first_name} {user.last_name}! Use link below verify your email {absolute_url}"
58+
59+
data = {
60+
"email_body": email_body,
61+
"email_subject": "Verify your email",
62+
"to_email": user.email,
63+
}
64+
65+
Email.send_email(data)

users/views.py

Lines changed: 13 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -3,12 +3,10 @@
33
import jwt
44
from django.apps import apps
55
from django.conf import settings
6-
from django.contrib.auth import get_user_model
7-
from django.contrib.sites.shortcuts import get_current_site
86
from django.db import transaction
97
from django.db.models import Q
108
from django.shortcuts import redirect
11-
from django.urls import reverse
9+
from django.contrib.auth import get_user_model
1210
from django_filters import rest_framework as filters
1311
from rest_framework import status
1412
from rest_framework.generics import (
@@ -24,9 +22,14 @@
2422
from rest_framework_simplejwt.tokens import RefreshToken, TokenError
2523

2624
from core.permissions import IsOwnerOrReadOnly, IsAuthenticatedOrWriteOnly
27-
from core.utils import Email
2825
from projects.serializers import ProjectListSerializer
29-
from users.helpers import VERBOSE_ROLE_TYPES, VERBOSE_USER_TYPES
26+
from users.helpers import (
27+
REDIRECT_URL,
28+
VERBOSE_ROLE_TYPES,
29+
VERBOSE_USER_TYPES,
30+
reset_email,
31+
verify_email,
32+
)
3033
from users.models import UserAchievement, LikesOnProject
3134
from users.permissions import IsAchievementOwnerOrReadOnly
3235
from users.serializers import (
@@ -59,23 +62,7 @@ def post(self, request, *args, **kwargs):
5962

6063
user = User.objects.get(email=serializer.data["email"])
6164

62-
token = RefreshToken.for_user(user).access_token
63-
64-
relative_link = reverse("users:account_email_verification_sent")
65-
current_site = get_current_site(request).domain
66-
absolute_url = "http://" + current_site + relative_link + "?token=" + str(token)
67-
68-
email_body = "Hi, {} {}! Use link below verify your email {}".format(
69-
user.first_name, user.last_name, absolute_url
70-
)
71-
72-
data = {
73-
"email_body": email_body,
74-
"email_subject": "Verify your email",
75-
"to_email": user.email,
76-
}
77-
78-
Email.send_email(data)
65+
verify_email(user, request)
7966

8067
return Response(serializer.data, status=status.HTTP_201_CREATED, headers=headers)
8168

@@ -171,7 +158,6 @@ class VerifyEmail(GenericAPIView):
171158

172159
def get(self, request):
173160
token = request.GET.get("token")
174-
REDIRECT_URL = "https://app.procollab.ru/auth/verification/"
175161
try:
176162
payload = jwt.decode(jwt=token, key=settings.SECRET_KEY, algorithms=["HS256"])
177163
user = User.objects.get(id=payload["user_id"])
@@ -212,30 +198,7 @@ def post(self, request, *args, **kwargs):
212198

213199
user = User.objects.get(email=serializer.data["email"])
214200

215-
access_token = RefreshToken.for_user(user).access_token
216-
refresh_token = RefreshToken.for_user(user)
217-
218-
relative_link = reverse("users:password_reset_sent")
219-
220-
current_site = get_current_site(request).domain
221-
absolute_url = (
222-
"http://"
223-
+ current_site
224-
+ relative_link
225-
+ f"?access_token={access_token}&refresh_token={refresh_token}"
226-
)
227-
228-
email_body = "Hi, {} {}! Use link below for reset password {}".format(
229-
user.first_name, user.last_name, absolute_url
230-
)
231-
232-
data = {
233-
"email_body": email_body,
234-
"email_subject": "Reset password",
235-
"to_email": user.email,
236-
}
237-
238-
Email.send_email(data)
201+
reset_email(user, request)
239202

240203
return Response(serializer.data, status=status.HTTP_201_CREATED)
241204

@@ -312,13 +275,13 @@ def create(self, request, *args, **kwargs):
312275
serializer.validated_data["user"] = request.user
313276
# warning for someone who tries to set user variable (the user will always be yourself anyway)
314277
if (
315-
request.data.get("user") is not None
316-
and request.data.get("user") != request.user.id
278+
request.data.get("user") is not None
279+
and request.data.get("user") != request.user.id
317280
):
318281
return Response(
319282
{
320283
"error": "you can't edit USER field for this view since "
321-
"you can't create achievements for other people"
284+
"you can't create achievements for other people"
322285
},
323286
status=status.HTTP_403_FORBIDDEN,
324287
)

0 commit comments

Comments
 (0)