Metadata-Version: 2.0
Name: graphene-django-extras
Version: 0.0.1b5
Summary: Graphene-Django-Extras add some extra funcionalities to graphene-django to facilitate the graphql use without Relay and allow pagination and filtering integration
Home-page: https://github.com/eamigo86/graphene-django-extras
Author: Ernesto Perez Amigo
Author-email: eamigo@nauta.cu
License: MIT
Keywords: api graphql protocol rest graphene django
Platform: any
Classifier: Development Status :: 3 - Alpha
Classifier: Intended Audience :: Developers
Classifier: Topic :: Software Development :: Libraries
Classifier: Programming Language :: Python :: 2
Classifier: Programming Language :: Python :: 2.7
Classifier: Programming Language :: Python :: 3
Classifier: Programming Language :: Python :: 3.3
Classifier: Programming Language :: Python :: 3.4
Classifier: Programming Language :: Python :: 3.5
Classifier: Programming Language :: Python :: Implementation :: PyPy
Requires-Dist: graphene-django (>=2.0.dev)
Requires-Dist: Django (>=1.8.0)
Requires-Dist: django-filter
Requires-Dist: djangorestframework (>=3.6.3)


Graphene-Django-Extras
======================

This package add some extra funcionalities to graphene-django to facilitate the graphql use without Relay and 
allow pagination and filtering integration.

Installation:
-------------

For installing graphene-django-extras, just run this command in your shell:

.. code:: bash

    pip install "graphene-django-extras"

Documentation:
--------------
Extra functionalities:
    Fields:
        1.	DjangoListField
        2.	DjangoFilterListField
        3.	DjangoFilterPaginateListField
        4.	DjangoListObjectField

    Mutations:
        1.	DjangoSerializerMutation

    Types:
        1.  DjangoObjectTypeExtra
        2.	DjangoInputObjectType
        3.	DjangoPaginatedObjectListType

    Pagination:
        1.	LimitOffsetGraphqlPagination
        2.	PageGraphqlPagination
        3.	CursosGraphqlPagination (cooming soon)

Examples:
---------

Here is a simple use of graphene-django-extras:

1- Types Definition:

.. code:: python

    from django.contrib.auth.models import User
    from graphene_django_extras import DjangoObjectType, DjangoPaginatedObjectListType    
    from graphene_django_extras.pagination import LimitOffsetGraphqlPagination

    class UserType(DjangoObjectType):
        """
            The DjangoObjectType have a ID field to filter to avoid resolve method definition on Queries 
        """

        class Meta:
            model = User
            description = "Type for User Model"
            filter_fields = {
                'id': ['exact', ],
                'first_name': ['icontains', 'iexact'],
                'last_name': ['icontains', 'iexact'],
                'username': ['icontains', 'iexact'],
                'email': ['icontains', 'iexact']
            }

    class UserListType(DjangoPaginatedObjectListType):
        class Meta:
            description = "User list query definition"
            model = User
            pagination = LimitOffsetGraphqlPagination()


2- Input Types can be defined for use on mutations:

.. code:: python

    from graphene_django_extras import DjangoInputObjectType

    class UserInput(DjangoInputObjectType):
        class Meta:
            description = " Input Type for User Model "
            model = User


3- You can define traditional mutations that use Input Types or Mutations based on DRF SerializerClass:

.. code:: python        

    import graphene
    from .serializers import UserSerializer
    from graphene_django_extras import DjangoSerializerMutation     
    from .types import UserType
    from .input_types import UserInputType

    class UserSerializerMutation(DjangoSerializerMutation):
        class Meta:
            description = " Serializer based Mutation for Users "
            serializer_class = UserSerializer


    class UserMutation(graphene.mutation):
        """
            You must implement the mutate function
        """

        user = graphene.Field(UserType, required=False)

        class Arguments:
            new_user = graphene.Argument(UserInput)

        class Meta:
            description = "Normal mutation for Users"

        @classmethod
        def mutate(cls, info, **kwargs):
            ...


4- Defining schemes:

.. code:: python  

    import graphene
    from graphene_django_extras import DjangoObjectField, DjangoListObjectField
    from .types import UserType, UserListType
    from .mutations import UserMutation, UserSerializerMutation

    class Queries(graphene.ObjectType):
        # Posible User list queries definitions
        all_users = DjangoListObjectField(UserListType, description=_('All Usersquery'))
        all_users1 = DjangoFilterPaginateListField(UserType, pagination=LimitOffsetGraphqlPagination())
        all_users2 = DjangoFilterListField(UserType)
        all_users3 = DjangoListObjectField(UserListType, filterset_class=UserFilter, description=_('All Users query'))

        # Single user queries definitions
        user = DjangoObjectField(UserType, description=_('Single User query'))  
        other_way_user = DjangoObjectField(UserListType.getOne(), description=_('Other way to query a single User query'))  

    class Mutations(graphene.ObjectType):
        user_create = UserSerializerMutation.CreateField(deprecation_reason='Deprecation message')
        user_delete = UserSerializerMutation.DeleteField()
        user_update = UserSerializerMutation.UpdateField()

        traditional_user_mutation = UserMutation.Field()


5- Examples of queries:

.. code:: python

    {
        allUsers(username_Icontains:"john"){
            results(limit:5, offset:5){
                id
                username
                firstName
                lastName
            }
            totalCount
        }

        allUsers1(lastName_Iexact:"Doe", limit:5, offset:0){
            id
            username
            firstName
            lastName    
        }

        allUsers2(firstName_Icontains: "J"){
            id
            username
            firstName
            lastName
        }

        user(id:2){
            id
            username
            firstName
        }
    }


6- Examples of Mutations:

.. code:: python

    mutation{
        userCreate(newUser:{password:"test*123", email: "test@test.com", username:"test"}){
            user{
                id
                username
                firstName
                lastName
            }
            ok
            errors{
                field
                messages
            }
        }

        userDelete(id:1){
            ok
            errors{
                field
                messages
            }
        }

        userUpdate(newUser:{id:1, username:"John"}){
            user{
                id
                username
            }
            ok
            errors{
                field
                messages
            }
        }
    }


