From 984d8de0148ca7b350f75e445deb82b7c45cf289 Mon Sep 17 00:00:00 2001 From: Nicolas Joyard Date: Fri, 16 Sep 2016 10:09:56 +0200 Subject: [PATCH] Graphene API experiment --- memopol/settings.py | 3 +++ memopol/urls.py | 8 ++++++++ memopol_graphene_api/__init__.py | 0 memopol_graphene_api/schema.py | 11 +++++++++++ memopol_graphene_api/schemas/__init__.py | 0 .../schemas/representative.py | 19 +++++++++++++++++++ setup.py | 2 ++ 7 files changed, 43 insertions(+) create mode 100644 memopol_graphene_api/__init__.py create mode 100644 memopol_graphene_api/schema.py create mode 100644 memopol_graphene_api/schemas/__init__.py create mode 100644 memopol_graphene_api/schemas/representative.py diff --git a/memopol/settings.py b/memopol/settings.py index 2f1e2c6..3eefe96 100644 --- a/memopol/settings.py +++ b/memopol/settings.py @@ -52,13 +52,16 @@ INSTALLED_APPS = ( 'bootstrap3', 'datetimewidget', 'django_filters', + 'django_graphiql', 'fontawesome', + 'graphene.contrib.django', 'rest_framework', 'taggit', # memopol apps 'core', 'memopol', + 'memopol_graphene_api', 'memopol_scores', 'memopol_settings', 'memopol_themes', diff --git a/memopol/urls.py b/memopol/urls.py index 9815346..ff26fd1 100644 --- a/memopol/urls.py +++ b/memopol/urls.py @@ -2,6 +2,11 @@ from django.conf.urls import include, url from django.contrib import admin +from django.views.decorators.csrf import csrf_exempt + +from graphene.contrib.django.views import GraphQLView + +from memopol_graphene_api.schema import schema from views.home import HomeView @@ -47,6 +52,9 @@ urlpatterns = [ url(r'^api/', include(api.router.urls)), + url(r'^graphql', csrf_exempt(GraphQLView.as_view(schema=schema))), + url(r'^graphiql', include('django_graphiql.urls')), + # Homepage url(r'^$', HomeView.as_view(), name='home'), diff --git a/memopol_graphene_api/__init__.py b/memopol_graphene_api/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/memopol_graphene_api/schema.py b/memopol_graphene_api/schema.py new file mode 100644 index 0000000..6f38d87 --- /dev/null +++ b/memopol_graphene_api/schema.py @@ -0,0 +1,11 @@ +import graphene + +from .schemas.representative import RepresentativeQuery + + +class Query(RepresentativeQuery): + pass + + +schema = graphene.Schema(name='Memopol Schema') +schema.query = Query diff --git a/memopol_graphene_api/schemas/__init__.py b/memopol_graphene_api/schemas/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/memopol_graphene_api/schemas/representative.py b/memopol_graphene_api/schemas/representative.py new file mode 100644 index 0000000..75cfbb3 --- /dev/null +++ b/memopol_graphene_api/schemas/representative.py @@ -0,0 +1,19 @@ +from graphene import relay, ObjectType +from graphene.contrib.django.filter import DjangoFilterConnectionField +from graphene.contrib.django.types import DjangoNode + +from representatives.models import Representative + + +class RepresentativeNode(DjangoNode): + class Meta: + model = Representative + filter_fields = ['full_name'] + + +class RepresentativeQuery(ObjectType): + representative = relay.NodeField(RepresentativeNode) + all_representatives = DjangoFilterConnectionField(RepresentativeNode) + + class Meta: + abstract = True diff --git a/setup.py b/setup.py index 9e535a1..f1fea53 100644 --- a/setup.py +++ b/setup.py @@ -17,12 +17,14 @@ setup(name='political-memory', 'django-datetime-widget>=0.9,<1.0', 'django-filter>=0.13,<0.14', 'django-fontawesome>=0.2,<0.3', + 'django-graphiql>=0.4,<0.5', 'django-representatives-votes==0.0.24', 'django-representatives==0.0.35', 'django-rql-filter>=0.1.3,<0.2', 'django-taggit>=0.17,<0.18', 'django>=1.8,<1.9', 'djangorestframework>=3,<4', + 'graphene[django]>=0.10,<1', 'hamlpy>=0.82,<0.83', 'ijson>=2.2,<2.3', 'python-dateutil>=2.4,<2.5', -- GitLab