Metadata-Version: 2.1
Name: django-google-api
Version: 1.0.1
Summary: a simple app to create workflow and save credentials fro Django
Home-page: https://bitbucket.org/digidiv-pk/django-google-api/src
Author: Muhammad Usama Bin Liaqat
Author-email: usama@digidiv.pk
License: GPL License
Description: .. image:: https://img.shields.io/badge/version-v1.0.1-blue.svg
            :target: https://pypi.org/project/django-google-api/
            :alt: PyPI Version
        
        .. image:: https://img.shields.io/badge/license-GPL-blue
            :alt: GPL License
        
        .. image:: https://img.shields.io/badge/python-3.5%20%7C%203.6%20%7C%203.7-blue
            :alt: Platform & Version Support
        
        Installation
        ============
        
        Installing from PyPI is as easy as doing:
        
        .. code-block:: bash
        
          pip install django-google-api
        
        
        Intigration
        ===========
        
        django-google-api is a library to use Google API with Django
        
        step:- 1
        --------
        
        create **credentials.json** file on DJango project Base Directory where your **manage.py** file exist
        
            | django-project
            | ├── django-project
            | │   ├── __init__.py
            | │   ├── settings.py
            | │   ├── urls.py
            | │   └── wsgi.py
            | ├── **credentials.json**
            | ├── manage.py
            | └── requirements.txt
        
        
        step:- 2
        --------
        
        Add the application to ``INSTALLED_APPS`` setting, for default ORM:
        
        .. code-block:: python
        
          INSTALLED_APPS = [
             ...
             'django_google.apps.DjangoGoogleConfig',
          ]
        
        step:- 3
        --------
        
        Google OAuth credentials set ``GOOGLE_CLIENT_SECRET_FILE`` and ``GOOGLE_AUTH_SCOPES`` in **setting.py** you can add scope of your choices
        
        .. code-block:: python
        
            GOOGLE_CLIENT_SECRET_FILE = os.path.join(BASE_DIR, 'credentials.json')
            GOOGLE_AUTH_SCOPES = [
                'https://www.googleapis.com/auth/userinfo.email',
                'https://www.googleapis.com/auth/userinfo.profile',
            ]
        
        if you're using javascript authentication then add this line to your project also
        
        .. code-block:: python
        
            GOOGLE_CLIENT_ID = "xxxxxxxxxxxx-xxxxxxxxxxxxxxxxxxx.apps.googleusercontent.com"
        
        
        
        Usage:
        ======
        
        **execute commands**
        
        .. code-block:: bash
        
            python manage.py makemigrations
            python manage.py migrate
        
        Create Views in **views.py**
        
        .. code-block:: python
        
            from django.shortcuts import reverse, redirect, render
            from django_google.flow import DjangoFlow,CLIENT_SECRET_FILE, SCOPES
            from django.http.response import JsonResponse
            from django.contrib.auth import get_user_model
            from django.conf import settings
            from django_google.models import GoogleAuth
            User = get_user_model()
        
            flow = DjangoFlow.from_client_secrets_file(client_secrets_file=CLIENT_SECRET_FILE, scopes=SCOPES)
        
            # Auto Redirect to Google Authentication URL (Using Without Javascript)
            def oAuthView(request):
                    callback_url=reverse("oauth2callback") # callback Url (oAuth2CallBackView URL)
                    return redirect(flow.get_auth_url(request, callback_url=callback_url))
        
            # Google Authentication Call Back VIEW (Using Without Javascript)
            def oAuth2CallBackView(request):
                success_url = "/dashboard/"  # redirection URL on Success reverse() can b use here
                creds = flow.get_credentails_from_response_url(response_url=request.build_absolute_uri())
                userinfo = flow.get_userinfo(creds=creds)
                try:
                    user = User.objects.get(email=userinfo['email'])
                except User.DoesNotExist:
                    user = User.objects.create(email=userinfo['email'],
                                                       username=userinfo['email'],
                                                       first_name=userinfo['given_name'],
                                                       last_name=userinfo['family_name']
                                                   )
                finally:
                    try:
                        gauth = GoogleAuth.objects.get(user=user)
                    except GoogleAuth.DoesNotExist:
                        gauth = GoogleAuth.objects.create(user=user, creds=creds)
        
                # Return Response as you want or Redirect to some URL
        
            def oAuthJavascriptView(request):
                if request.is_ajax():
                    if request.method == "POST":
                        code = request.POST.get('code')
                        flow = DjangoFlow.from_client_secrets_file(client_secrets_file=CLIENT_SECRET_FILE, scopes=SCOPES)
                        creds = flow.get_credentials_from_code(code=code, javascript_callback_url="https://example.org")
                        userinfo = flow.get_userinfo(creds=creds)
                        try:
                            user = User.objects.get(email=userinfo['email'])
                        except User.DoesNotExist:
                            user = User.objects.create(email=userinfo['email'],
                                                           username=userinfo['email'],
                                                           first_name=userinfo['given_name'],
                                                           last_name=userinfo['family_name']
                                                       )
                        finally:
                            try:
                                gauth = GoogleAuth.objects.get(user=user)
                            except GoogleAuth.DoesNotExist:
                                gauth = GoogleAuth.objects.create(user=user, creds=creds)
                        # return JSON Response with Status Code of 200 for success and 400 for errors
                        return JsonResponse({}, status=200)
        
                else:
                    context = {
                        "client_id": getattr(settings, 'GOOGLE_CLIENT_ID', None),
                        "scopes": " ".join(SCOPES)
                    }
                    # Render HTML page that havs Google Authentication Page with Javasccript
                    return render(request, 'login.html', context)
        
        Create Views in **urls.py**
        
        .. code-block:: python
        
            from django.urls import path
            from .views import oAuthView, oAuth2CallBackView, oAuthJavascriptView
        
            urlpatterns = [
                path('', oAuthJavascriptView, name="login"),
                path('auth/', oAuthView, name="auth"),
                path('oauth2callback/', oAuth2CallBackView, name="oauth2callback"),
            ]
        
        **login.html** file create Button of your own choice for google auth
        
        .. code-block:: html
        
            <script src="https://apis.google.com/js/api:client.js"></script>
            <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js"></script>
            <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery-cookie/1.4.1/jquery.cookie.min.js"></script>
            <button id="g-auth-btn">Sign in with <b>Google</b></button>
            <script>
            function startApp() {
                gapi.load('auth2', function(){
                    auth2 = gapi.auth2.init({
                        client_id: '{{ client_id }}',
                        cookiepolicy: 'single_host_origin',
                    });
                });
            }
        
            $(document).on("click", "#g-auth-btn", ()=>{
                auth2.grantOfflineAccess({
                    prompt:"consent",
                    scope: '{{ scopes }}'
                }).then((signInCallback)=>{
                    $.ajax({
                        type:'post',
                        data:signInCallback,
                        cache: false,
                        headers: {"X-CSRFToken": $.cookie('csrftoken')},
                        success: function (response) {
                            console.log(response);
                            if(!!response.redirect){
                                window.location = response.redirect
                            }
                        },
                        error: function (error) {
                            console.log(error);
                            if(!!error.responseJSON.redirect){
                                window.location = error.responseJSON.redirect
                            }
                        }
                    });
                });
            });
            startApp();
            </script>
        
        
        
Platform: UNKNOWN
Classifier: Environment :: Web Environment
Classifier: Framework :: Django
Classifier: Framework :: Django :: 2.2
Classifier: Intended Audience :: Developers
Classifier: License :: OSI Approved :: BSD License
Classifier: Operating System :: OS Independent
Classifier: Programming Language :: Python
Classifier: Programming Language :: Python :: 3.5
Classifier: Programming Language :: Python :: 3.6
Classifier: Programming Language :: Python :: 3.7
Classifier: Topic :: Internet :: WWW/HTTP
Classifier: Topic :: Internet :: WWW/HTTP :: Dynamic Content
Description-Content-Type: text/x-rst
