1+ from base64 import urlsafe_b64encode
12from drf_yasg .utils import swagger_auto_schema
23from rest_framework import generics , status
34from rest_framework .response import Response
45from rest_framework .views import APIView
56from rest_framework_simplejwt .authentication import JWTAuthentication
67from rest_framework_simplejwt .exceptions import InvalidToken , TokenError
78from rest_framework_simplejwt .serializers import TokenRefreshSerializer
9+ from account .api .base .tokens import TokenGenerator
10+ from django .utils .encoding import force_bytes
11+ from django .utils .http import urlsafe_base64_encode
812
913from account .models import User
1014from utils .base .general import get_tokens_for_user
@@ -60,28 +64,6 @@ def post(self, request, *args, **kwargs):
6064 )
6165
6266
63- class ValidateForgetPasswordOtpView (generics .GenericAPIView ):
64- """
65- Validate the forget password otp sent to user's email.
66-
67- Return a token to be used for resetting password.
68- """
69- permission_classes = []
70- serializer_class = serializers .ValidateRegistrationOtpSerializer
71-
72- def post (self , request , * args , ** kwargs ):
73- serializer = self .serializer_class (data = request .data )
74- serializer .is_valid (raise_exception = True )
75-
76- # Create a token for user to reset password
77- # uidb64 and token are used to identify the user
78-
79- return Response (
80- data = serializer .data ,
81- status = status .HTTP_201_CREATED
82- )
83-
84-
8567class TokenVerifyAPIView (APIView ):
8668 """
8769 An authentication plugin that checks if a jwt
@@ -170,6 +152,12 @@ def get_queryset(self):
170152
171153
172154class RequestForgetPasswordView (generics .GenericAPIView ):
155+ """
156+ Request a password reset email (otp).
157+
158+ Otp is sent to user's email.
159+ """
160+
173161 serializer_class = serializers .RequestForgetPasswordSerializer
174162 permission_classes = []
175163
@@ -180,7 +168,45 @@ def post(self, request, *args, **kwargs):
180168 return Response (data = serializer .data )
181169
182170
171+ class ValidateForgetPasswordOtpView (generics .GenericAPIView ):
172+ """
173+ Validate the forget password otp sent to user's email.
174+
175+ Return a token to be used for resetting password.
176+ """
177+ permission_classes = []
178+ serializer_class = serializers .ValidateOtpSerializer
179+
180+ @swagger_auto_schema (
181+ responses = {200 : serializers .ForgetPasswordTokenSerializer }
182+ )
183+ def post (self , request , * args , ** kwargs ):
184+ serializer = self .serializer_class (data = request .data )
185+ serializer .is_valid (raise_exception = True )
186+
187+ # Create a token for user to reset password
188+ generator = TokenGenerator ()
189+ user = serializer .validated_data ['email' ]
190+ uidb64 = urlsafe_base64_encode (force_bytes (user .pk ))
191+ token = generator .make_token (user )
192+ # uidb64 and token are used to identify the user
193+
194+ return Response (
195+ data = {
196+ 'uidb64' : uidb64 ,
197+ 'token' : token
198+ },
199+ status = status .HTTP_201_CREATED
200+ )
201+
202+
183203class ForgetPasswordView (generics .GenericAPIView ):
204+ """
205+ Reset password using the token received by validating the otp.
206+
207+ User password will be reset to the new password.
208+ Returns a new access and refresh token including user details.
209+ """
184210 serializer_class = serializers .ForgetPasswordSerializer
185211 permission_classes = []
186212
@@ -192,7 +218,7 @@ class ForgetPasswordView(generics.GenericAPIView):
192218 def post (self , request , * args , ** kwargs ):
193219 serializer = self .serializer_class (data = request .data )
194220 serializer .is_valid (raise_exception = True )
195- user : User = serializer .validated_data . get ( 'user' )
221+ user = serializer .save ( )
196222 user_details = serializers .UserSerializer (user ).data
197223 response_data = {
198224 'tokens' : get_tokens_for_user (user ),
0 commit comments