From c500abb021f49179b92159cb6d4891b7d76ae1b4 Mon Sep 17 00:00:00 2001 From: Sergey G Date: Fri, 19 Jan 2018 12:35:44 +0500 Subject: [PATCH] LIL-27 Login/registration for facebook --- apps/auth/urls.py | 1 + apps/auth/views.py | 46 +++++++++++++++++++++++++++++++++++++++++++-- apps/user/models.py | 1 + requirements.txt | 3 ++- 4 files changed, 48 insertions(+), 3 deletions(-) diff --git a/apps/auth/urls.py b/apps/auth/urls.py index d893e6c7..e4278014 100644 --- a/apps/auth/urls.py +++ b/apps/auth/urls.py @@ -7,6 +7,7 @@ urlpatterns = [ path('logout/', views.LogoutView.as_view(), name="logout"), path('login/', views.LoginView.as_view(), name="login"), path('verification-email//', views.VerificationEmailView.as_view(), name="verification-email"), + path('facebook_login/', views.FacebookLoginOrRegistration.as_view(), name="facebook_login"), path('password_reset/', views.PasswordResetView.as_view(), name="password_reset"), path('password_reset_confirm///', views.PasswordResetConfirmView.as_view(), name="password_reset_confirm"), diff --git a/apps/auth/views.py b/apps/auth/views.py index dee5b0d8..d1fcc322 100644 --- a/apps/auth/views.py +++ b/apps/auth/views.py @@ -1,13 +1,21 @@ +from uuid import uuid4 + +from facepy import GraphAPI +from facepy.exceptions import FacepyError + from django.contrib.auth import get_user_model, logout, login, views from django.contrib.auth.forms import AuthenticationForm from django.http import JsonResponse +from django.urls import reverse_lazy +from django.utils.decorators import method_decorator +from django.views.decorators.csrf import csrf_exempt from django.views.generic import FormView, View from django.views.generic.edit import BaseFormView -from django.urls import reverse_lazy +from apps.notification.utils import send_email +from apps.user.models import LilcityUserSettings, LilcityUserProxy from .forms import LearnerRegistrationForm from .tokens import verification_email_token -from apps.notification.utils import send_email User = get_user_model() @@ -100,3 +108,37 @@ class PasswordResetConfirmView(views.PasswordResetConfirmView): class PasswordResetComplete(views.PasswordResetCompleteView): pass + + +@method_decorator(csrf_exempt, name="dispatch") +class FacebookLoginOrRegistration(View): + def post(self, requests, *args, **kwargs): + access_token = requests.POST.get('access_token') + graph = GraphAPI(access_token) + try: + data = graph.get('/me?fields=email, first_name, last_name') + except FacepyError: + return JsonResponse({"success": False}) + + facebook_id = data.get('id') + + lilcity_user_settings = LilcityUserSettings.objects.filter(facebook_id=facebook_id) + if lilcity_user_settings.count(): + login(requests, user=lilcity_user_settings[0].user) + return JsonResponse({"success": True}) + + email = requests.POST.get('email') or data.get('email') + if not email: + return JsonResponse({"success": False, + "errors": {"email": 'is field required'} + }) + else: + first_name = data.get('first_name', '') + last_name = data.get('last_name', '') + + user = LilcityUserProxy.objects.create_user(username=email, email=email, first_name=first_name, last_name=last_name, password=uuid4().hex) + + user.lilcity_user_settings.is_verification_email = True + user.lilcity_user_settings.facebook_id = facebook_id + user.lilcity_user_settings.save() + return JsonResponse({"success": True}) diff --git a/apps/user/models.py b/apps/user/models.py index ecfa5fa5..82ec3c6d 100644 --- a/apps/user/models.py +++ b/apps/user/models.py @@ -23,4 +23,5 @@ class LilcityUserProxy(User): class LilcityUserSettings(models.Model): user = models.OneToOneField(User, on_delete=models.CASCADE, related_name='lilcity_user_settings') is_verification_email = models.BooleanField(default=False) + facebook_id = models.PositiveIntegerField(null=True, blank=True, unique=True) diff --git a/requirements.txt b/requirements.txt index cd8f004f..d6d65ae2 100644 --- a/requirements.txt +++ b/requirements.txt @@ -2,4 +2,5 @@ Django==2.0.1 django-anymail[mailgun]==1.2 paymentwall-python==1.0.7 twilio==6.10.0 -psycopg2==2.7.3.2 \ No newline at end of file +psycopg2==2.7.3.2 +facepy==1.0.9 \ No newline at end of file