Advertisement
randoz

views

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