Advertisement
Guest User

Untitled

a guest
Jul 11th, 2016
81
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 8.76 KB | None | 0 0
  1. from __future__ import absolute_import
  2.  
  3. from rest_framework.decorators import api_view
  4. from rest_framework.decorators import permission_classes
  5. from rest_framework.permissions import AllowAny, IsAuthenticated
  6. from rest_framework.status import HTTP_200_OK, HTTP_400_BAD_REQUEST, HTTP_403_FORBIDDEN, HTTP_201_CREATED, \
  7.     HTTP_401_UNAUTHORIZED
  8. from rest_framework.response import Response
  9. from rest_framework.authtoken.models import Token
  10.  
  11. from django.db import transaction
  12. from django.conf import settings
  13.  
  14. from social.apps.django_app.utils import psa
  15. from push_notifications.models import GCMDevice, APNSDevice
  16.  
  17. from .utils import success_response, error_response, compose_validation_error_message
  18. from ..models import ApplicationUser, Country, PasswordResetToken, get_default_country
  19. from ..serializers import CreateUserSerializer, SignInSerializer, UpdateProfileSerializer, ChangePasswordSerializer, \
  20.     UserInfoSerializer, NotificationDeviceSerializer
  21. from ..utils import register_device
  22. from ..tasks import send_password_reset_email, send_welcome_email
  23.  
  24.  
  25. @api_view(['POST'])
  26. @permission_classes([AllowAny])
  27. def api_signup(request):
  28.     user_serializer = CreateUserSerializer(data=request.data)
  29.     notif_serializer = NotificationDeviceSerializer(data=request.data)
  30.  
  31.     if user_serializer.is_valid():
  32.  
  33.         if notif_serializer.is_valid():
  34.             device_type = notif_serializer.validated_data.get('device_type', None)
  35.             registration_id = notif_serializer.validated_data.get('registration_id', None)
  36.         else:
  37.             notif_error_message = compose_validation_error_message(notif_serializer)
  38.             return error_response(notif_error_message, status=HTTP_400_BAD_REQUEST)
  39.  
  40.         user = user_serializer.save()
  41.         token = user.update_token().key
  42.  
  43.         if device_type and registration_id:
  44.             register_device(device_type=device_type, registration_id=registration_id, user=user)
  45.  
  46.         info_serializer = UserInfoSerializer(user)
  47.         send_welcome_email.apply_async(args=[user], countdown=settings.WELCOME_EMAIL_DELAY)
  48.         return success_response("Registration complete.", data={'token': token, 'user': info_serializer.data},
  49.                                 status=HTTP_201_CREATED)
  50.  
  51.     user_error_message = compose_validation_error_message(user_serializer)
  52.     return error_response(user_error_message, status=HTTP_400_BAD_REQUEST)
  53.  
  54.  
  55. @api_view(['POST'])
  56. @permission_classes([AllowAny])
  57. def api_signin(request):
  58.     serializer = SignInSerializer(data=request.data)
  59.     notif_serializer = NotificationDeviceSerializer(data=request.data)
  60.  
  61.     if serializer.is_valid():
  62.         email = serializer.validated_data['login']
  63.         password = serializer.validated_data['password']
  64.  
  65.         if notif_serializer.is_valid():
  66.             device_type = notif_serializer.validated_data['device_type']
  67.             registration_id = notif_serializer.validated_data['registration_id']
  68.         else:
  69.             notif_error_message = compose_validation_error_message(notif_serializer)
  70.             return error_response(notif_error_message, status=HTTP_400_BAD_REQUEST)
  71.  
  72.         user = ApplicationUser.objects.filter(email__exact=email).first()
  73.  
  74.         if user is None:
  75.             return error_response("User does not exists or password is not correct.", status=HTTP_400_BAD_REQUEST)
  76.  
  77.         if user.disabled:
  78.             return error_response('Account has been deactivated. Confirm email address to continue using service.',
  79.                                  status=HTTP_400_BAD_REQUEST)
  80.  
  81.         if user.check_password(password):
  82.             register_device(device_type=device_type, registration_id=registration_id, user=user)
  83.  
  84.             info_serializer = UserInfoSerializer(user)
  85.             return success_response('Success', status=HTTP_200_OK,
  86.                                     data={
  87.                                         'token': user.update_token().key,
  88.                                         'user': info_serializer.data,
  89.                                     }, )
  90.         else:
  91.             return error_response('User does not exists or password is not correct.', HTTP_400_BAD_REQUEST)
  92.  
  93.     else:
  94.         message = compose_validation_error_message(serializer)
  95.         return error_response(message, status=HTTP_400_BAD_REQUEST)
  96.  
  97.  
  98. @api_view(['GET'])
  99. @permission_classes([IsAuthenticated])
  100. def api_user_info(request):
  101.     user = request.user
  102.     info_serializer = UserInfoSerializer(user)
  103.     return success_response('Success', status=HTTP_200_OK, data={'user': info_serializer.data,})
  104.  
  105.  
  106. @api_view(['POST'])
  107. @permission_classes([IsAuthenticated])
  108. def api_signout(request):
  109.     device = None
  110.     user = request.user
  111.     device_type = request.DATA.get('device_type', None)
  112.     if not device_type:
  113.         return error_response("No device type.", status=HTTP_400_BAD_REQUEST)
  114.  
  115.     try:
  116.         with transaction.atomic():
  117.             request.auth.delete()
  118.             GCMDevice.objects.filter(user=user).delete()
  119.             APNSDevice.objects.filter(user=user).delete()
  120.         return success_response("Log out complete.", status=HTTP_200_OK)
  121.     except KeyError:
  122.         msg = "Wrong JSON format."
  123.     except Token.DoesNotExist:
  124.         msg = "Bad token."
  125.     return error_response(msg, status=HTTP_400_BAD_REQUEST)
  126.  
  127.  
  128. @api_view(['POST'])
  129. @permission_classes([AllowAny, ])
  130. def api_password_reset_request(request):
  131.     email = request.data.get('email', None)
  132.  
  133.     if not email:
  134.         return error_response('Email is required.', status=HTTP_400_BAD_REQUEST)
  135.  
  136.     try:
  137.         user = ApplicationUser.objects.get(email=email)
  138.         if user.is_facebook_account:
  139.             return error_response("Sorry, you can't reset your password because this email "
  140.                                   "is linked to the facebook account.")
  141.         Token.objects.filter(user=user).delete()
  142.     except ApplicationUser.DoesNotExist:
  143.         return error_response('User with this email does not exist.', status=HTTP_400_BAD_REQUEST)
  144.  
  145.     token, created = PasswordResetToken.objects.get_or_create(user=user)
  146.     send_password_reset_email.delay(user=user)
  147.  
  148.     return success_response('Email with password reset link has been sent.', status=HTTP_200_OK)
  149.  
  150.  
  151. @api_view(['POST'])
  152. @permission_classes((AllowAny,))
  153. @psa('social:complete')
  154. def api_facebook_login(request, backend):
  155.     data = request.DATA
  156.     access_token = data.get('access_token')
  157.     device_type = data.get('device_type', None)
  158.     registration_id = data.get('registration_id', None)
  159.  
  160.     country_code = data.get('country')
  161.     if country_code:
  162.         try:
  163.             country = Country.objects.get(code__iexact=country_code)
  164.         except Country.DoesNotExist:
  165.             country = get_default_country()
  166.     else:
  167.         country = get_default_country()
  168.  
  169.     try:
  170.         user = request.backend.do_auth(access_token, country=country)
  171.         user.confirmed = True
  172.         user.is_facebook_account = True
  173.         user.save()
  174.  
  175.         register_device(device_type=device_type, registration_id=registration_id, user=user)
  176.         serializer = UserInfoSerializer(user)
  177.         response_data = {"token": user.update_token().key, "user": serializer.data}
  178.         return success_response(data=response_data, status=HTTP_201_CREATED)
  179.     except Exception:
  180.         return error_response("Authentication error", HTTP_401_UNAUTHORIZED)
  181.  
  182.  
  183. @api_view(['POST'])
  184. @permission_classes([IsAuthenticated])
  185. def api_set_timezone(request):
  186.     data = request.DATA
  187.     user = request.user
  188.     timezone = data.get('timezone', None)
  189.  
  190.     if not timezone:
  191.         content = {"status": "error", "message": "No timezone"}
  192.         return Response(content, 400)
  193.     else:
  194.         user.timezone = timezone
  195.         user.save()
  196.         content = {"status": "ok", "message": "Timezone successful updated"}
  197.         return Response(content, 200)
  198.  
  199.  
  200. @api_view(['POST'])
  201. @permission_classes([IsAuthenticated])
  202. def api_update_profile(request):
  203.     user = request.user
  204.     serializer = UpdateProfileSerializer(user, data=request.data)
  205.     if serializer.is_valid():
  206.         serializer.save()
  207.         return success_response("Profile has been updated.", HTTP_200_OK)
  208.     else:
  209.         message = compose_validation_error_message(serializer)
  210.         return error_response(message, HTTP_400_BAD_REQUEST)
  211.  
  212.  
  213. @api_view(['POST'])
  214. @permission_classes([IsAuthenticated])
  215. def api_change_password(request):
  216.     user = request.user
  217.     serializer = ChangePasswordSerializer(instance=user, data=request.data, context={'user': user})
  218.     if serializer.is_valid():
  219.         serializer.save()
  220.         return success_response("Password changed successfully.", HTTP_200_OK)
  221.     else:
  222.         message = compose_validation_error_message(serializer)
  223.         return error_response(message, HTTP_400_BAD_REQUEST)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement