74 lines
2.9 KiB
Python
74 lines
2.9 KiB
Python
"""Web account views"""
|
|
from django.conf import settings
|
|
from django.contrib.auth.tokens import default_token_generator as password_token_generator
|
|
from django.shortcuts import get_object_or_404
|
|
from django.utils.encoding import force_text
|
|
from django.utils.http import urlsafe_base64_decode
|
|
from rest_framework import permissions, status, generics
|
|
from rest_framework.response import Response
|
|
|
|
from account import tasks, models
|
|
from account.serializers import web as serializers
|
|
from utils import exceptions as utils_exceptions
|
|
from utils.views import JWTGenericViewMixin
|
|
|
|
|
|
class PasswordResetView(generics.GenericAPIView):
|
|
"""View for resetting user password"""
|
|
permission_classes = (permissions.AllowAny, )
|
|
serializer_class = serializers.PasswordResetSerializer
|
|
|
|
def post(self, request, *args, **kwargs):
|
|
"""Override create method"""
|
|
serializer = self.get_serializer(data=request.data)
|
|
serializer.is_valid(raise_exception=True)
|
|
if not serializer.validated_data.get('user').is_anonymous:
|
|
user = serializer.validated_data.pop('user')
|
|
if settings.USE_CELERY:
|
|
tasks.send_reset_password_email.delay(user_id=user.id,
|
|
country_code=self.request.country_code)
|
|
else:
|
|
tasks.send_reset_password_email(user_id=user.id,
|
|
country_code=self.request.country_code)
|
|
return Response(status=status.HTTP_200_OK)
|
|
|
|
|
|
class PasswordResetConfirmView(JWTGenericViewMixin):
|
|
"""View for confirmation new password"""
|
|
serializer_class = serializers.PasswordResetConfirmSerializer
|
|
permission_classes = (permissions.AllowAny,)
|
|
queryset = models.User.objects.active()
|
|
|
|
def get_object(self):
|
|
"""Override get_object method"""
|
|
queryset = self.filter_queryset(self.get_queryset())
|
|
uidb64 = self.kwargs.get('uidb64')
|
|
|
|
user_id = force_text(urlsafe_base64_decode(uidb64))
|
|
token = self.kwargs.get('token')
|
|
|
|
obj = get_object_or_404(queryset, id=user_id)
|
|
|
|
if not password_token_generator.check_token(user=obj, token=token):
|
|
raise utils_exceptions.NotValidTokenError()
|
|
|
|
# May raise a permission denied
|
|
self.check_object_permissions(self.request, obj)
|
|
|
|
return obj
|
|
|
|
def patch(self, request, *args, **kwargs):
|
|
"""Implement PATCH method"""
|
|
instance = self.get_object()
|
|
serializer = self.get_serializer(instance=instance,
|
|
data=request.data)
|
|
serializer.is_valid(raise_exception=True)
|
|
serializer.save()
|
|
# Create tokens
|
|
tokens = instance.create_jwt_tokens()
|
|
return self._put_cookies_in_response(
|
|
cookies=self._put_data_in_cookies(
|
|
access_token=tokens.get('access_token'),
|
|
refresh_token=tokens.get('refresh_token')),
|
|
response=Response(status=status.HTTP_200_OK))
|