Advertisement
randoz

views2

Jul 14th, 2018
225
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 5.70 KB | None | 0 0
  1. # -*- encoding:utf-8 -*-
  2.  
  3. from allauth.account.adapter import get_adapter
  4. from allauth.account.forms import EmailAwarePasswordResetTokenGenerator
  5. from allauth.account.models import EmailConfirmationHMAC
  6. from allauth.account.utils import complete_signup, user_pk_to_url_str, user_username
  7.  
  8. from allauth.utils import build_absolute_uri
  9. from django.contrib.auth.signals import user_logged_in
  10. from django.contrib.auth import (
  11.     login as django_login,
  12. )
  13. from django.conf import settings
  14. from django.contrib.sites.shortcuts import get_current_site
  15. from django.urls import reverse
  16. from django.utils.decorators import method_decorator
  17. from django.views.decorators.debug import sensitive_post_parameters
  18. from rest_framework import status
  19.  
  20.  
  21. from rest_framework.response import Response
  22. from rest_framework.permissions import AllowAny, IsAuthenticated
  23. from rest_framework.viewsets import ViewSet
  24. from rest_framework.authtoken.models import Token
  25.  
  26. from allauth.account import app_settings as allauth_settings
  27.  
  28. # from apps.auths.messages import AuthMessages
  29. from apps.contrib.api.exceptions import NotFound
  30. from apps.contrib.api.responses import DoneResponse
  31. from apps.auths.api.v1 import codes
  32.  
  33.  
  34. from .serializers import (
  35.     LoginSerializer, PasswordResetSerializer,
  36.     PasswordResetConfirmSerializer, VerifyEmailSerializer,
  37.     TokenSerializer, UserSerializer,
  38. )
  39.  
  40. # RegisterSerializer,
  41.  
  42.  
  43. sensitive_post_parameters_m = method_decorator(
  44.     sensitive_post_parameters(
  45.         'password', 'old_password', 'new_password1', 'new_password2'
  46.     )
  47. )
  48.  
  49. # TokenModel = import_callable(getattr(settings, 'REST_AUTH_TOKEN_MODEL', DefaultTokenModel))
  50. # create_token = import_callable(getattr(settings, 'REST_AUTH_TOKEN_CREATOR', default_create_token))
  51.  
  52.  
  53. def get_session(token, user):
  54.     return Response({
  55.         'token': token.key,
  56.         'profile': UserSerializer(user).data,
  57.     }, status=status.HTTP_200_OK)
  58.  
  59. class TokenAuthViewSet(ViewSet):
  60.  
  61.     authentication_classes = ()
  62.     permission_classes = [AllowAny]
  63.  
  64.     def login(self, request):
  65.         """
  66.        Inicio de Sesión
  67.        """
  68.         serializer = LoginSerializer(data=request.data, context={'request': request})
  69.         serializer.is_valid(raise_exception=True)
  70.  
  71.         user = serializer.validated_data['user']
  72.         token, created = Token.objects.get_or_create(user=user)
  73.  
  74.         # user_logged_in.send(sender=user.__class__, request=request, user=user)
  75.  
  76.         # if hasattr(settings, "AUTH_TOKEN_SESSION") and settings.AUTH_TOKEN_SESSION:
  77.         #     django_login(self.request, user)
  78.  
  79.         return get_session(token, user)
  80.  
  81.     def logout(self, request):
  82.         """
  83.        Clear all application sessions.
  84.        """
  85.         serializer = TokenSerializer(data=request.data)
  86.         serializer.is_valid(raise_exception=True)
  87.  
  88.         token = serializer.validated_data["token"]
  89.         token.delete()
  90.         return DoneResponse(**codes.LOGGED_OUT)
  91.  
  92.  
  93.     def register(self, request):
  94.         serializer = RegisterSerializer(data=request.data)
  95.         serializer.is_valid(raise_exception=True)
  96.  
  97.         user = serializer.save(self.request)
  98.  
  99.  
  100.         token, created = TokenModel.objects.get_or_create(user=user)
  101.         complete_signup(self.request._request,
  102.                         user, allauth_settings.EMAIL_VERIFICATION, None)
  103.  
  104.  
  105.         if allauth_settings.EMAIL_VERIFICATION == allauth_settings.EmailVerificationMethod.MANDATORY:
  106.             return DoneResponse(**codes.CONFIRMATION_EMAIL_SENT)
  107.  
  108.         return get_session(token, user)
  109.  
  110.     def confirm_email(self, request):
  111.         serializer = VerifyEmailSerializer(data=request.data)
  112.         serializer.is_valid(raise_exception=True)
  113.         confirmation = EmailConfirmationHMAC.from_key(serializer.validated_data['key'])
  114.         confirmation.confirm(self.request)
  115.         return DoneResponse(**codes.EMAIL_CONFIRMED)
  116.  
  117.  
  118.  
  119.     def password_reset(self, request):
  120.         """
  121.        Restaurar Contraseña
  122.        """
  123.         serializer = PasswordResetSerializer(data=request.data)
  124.         serializer.is_valid(raise_exception=True)
  125.         action = serializer.validated_data["action"]
  126.  
  127.         if "redirect_uri" in serializer.validated_data:
  128.             redirect_uri = serializer.validated_data["redirect_uri"]
  129.             AuthMessages.reset_password(request, action, redirect_uri=redirect_uri)
  130.         else:
  131.             self.get_allauth_reset_password(action.user)
  132.  
  133.         return DoneResponse(**codes.RESET_PASSWORD_SENT)
  134.  
  135.  
  136.     def get_allauth_reset_password(self, user):
  137.         token_generator = EmailAwarePasswordResetTokenGenerator()
  138.         temp_key = token_generator.make_token(user)
  139.  
  140.  
  141.         # send the password reset email
  142.         path = reverse("account_reset_password_from_key", kwargs=dict(uidb36=user_pk_to_url_str(user), key=temp_key))
  143.         url = build_absolute_uri(self.request, path)
  144.  
  145.         context = {"current_site": get_current_site(self.request),
  146.                    "user": user, "password_reset_url": url, "request": self.request}
  147.  
  148.         if settings.ACCOUNT_AUTHENTICATION_METHOD != 'email':
  149.             context['username'] = user_username(user)
  150.         get_adapter(self.request).send_mail('account/email/password_reset_key',user.email, context)
  151.  
  152.     def password_reset_confirm(self, request):
  153.         """
  154.        Confirmar la Restauración de Contraseña
  155.        """
  156.         serializer = PasswordResetConfirmSerializer(data=request.data)
  157.         serializer.is_valid(raise_exception=True)
  158.  
  159.         password = serializer.validated_data["password"]
  160.         action = serializer.validated_data["action"]
  161.  
  162.         action.user.set_password(password)
  163.         action.delete()
  164.         return DoneResponse(**codes.PASSWORD_UPDATED)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement