From 2e5cb9fffc2f13cfb895f261b1986557ff80e2da Mon Sep 17 00:00:00 2001 From: Xarv Date: Wed, 19 Feb 2020 10:24:40 +0100 Subject: [PATCH 1/3] WIP: graphql --- package/api/schema.py | 16 ++++++++++++++++ requirements.txt | 1 + schema.py | 9 +++++++++ settings/base.py | 7 +++++++ urls.py | 3 +++ 5 files changed, 36 insertions(+) create mode 100644 package/api/schema.py create mode 100644 schema.py diff --git a/package/api/schema.py b/package/api/schema.py new file mode 100644 index 00000000..c9d33b74 --- /dev/null +++ b/package/api/schema.py @@ -0,0 +1,16 @@ +import graphene +from graphene_django.types import DjangoObjectType +from package.models import Category + + +class CategoryType(DjangoObjectType): + class Meta: + model = Category + + +class Query(object): + all_categories = graphene.List(CategoryType) + + # @graphene.resolve_only_args + # def resolve_all_categories(self, info, **kwargs): + # return Category.objects.all() diff --git a/requirements.txt b/requirements.txt index 89601ee6..b25de217 100644 --- a/requirements.txt +++ b/requirements.txt @@ -37,6 +37,7 @@ Pillow==4.2.1 rocketchat-API==0.6.3 markdown==2.6.11 python-dotenv==0.8.0 +graphene_django==2.8.2 # Redis support django-redis==4.6.0 diff --git a/schema.py b/schema.py new file mode 100644 index 00000000..9762b2d7 --- /dev/null +++ b/schema.py @@ -0,0 +1,9 @@ +import graphene +import package.api.schema + + +class Query(package.api.schema.Query, graphene.ObjectType): + pass + + +schema = graphene.Schema(query=Query) diff --git a/settings/base.py b/settings/base.py index dba6c542..0bf37f93 100644 --- a/settings/base.py +++ b/settings/base.py @@ -141,6 +141,7 @@ "social_auth_local", "im", "timeline", + ] PREREQ_APPS = [ @@ -154,6 +155,7 @@ "django.contrib.humanize", "django.contrib.staticfiles", + # external "crispy_forms", "dj_pagination", @@ -167,6 +169,7 @@ 'rest_framework', 'chroniker', 'dynamic_preferences', + 'graphene_django', ] INSTALLED_APPS = PREREQ_APPS + PROJECT_APPS @@ -541,3 +544,7 @@ CHRONIKER_CHECK_LOCK_FILE = False CHRONIKER_DISABLE_RAW_COMMAND = True CHRONIKER_EMAIL_SENDER = 'Chroniker' + +GRAPHENE = { + 'SCHEMA': 'schema.schema' +} diff --git a/urls.py b/urls.py index bbeee78a..93174d7d 100644 --- a/urls.py +++ b/urls.py @@ -19,6 +19,7 @@ from homepage.views import homepage, error_404_view, error_500_view, health_check_view, SitemapView from package.views import category, python3_list from django.contrib.auth.views import logout as contrib_logout_view +from graphene_django.views import GraphQLView urlpatterns = [ @@ -81,6 +82,8 @@ view=apiv1_gone, name="apiv1_gone", ), + url(r'^graphql/$', GraphQLView.as_view(graphiql=True)), + # url(r'^api/v1/', include('core.apiv1', namespace="apitest")), From b9b5faf625485a042f5d887ed461f9be6c01c806 Mon Sep 17 00:00:00 2001 From: Xarv Date: Wed, 19 Feb 2020 12:29:38 +0100 Subject: [PATCH 2/3] create project and category schema --- package/api/schema.py | 30 +++++++++++++++++++++++++----- 1 file changed, 25 insertions(+), 5 deletions(-) diff --git a/package/api/schema.py b/package/api/schema.py index c9d33b74..f1195417 100644 --- a/package/api/schema.py +++ b/package/api/schema.py @@ -1,16 +1,36 @@ import graphene from graphene_django.types import DjangoObjectType -from package.models import Category +from package.models import Category, Project, ProjectImage class CategoryType(DjangoObjectType): class Meta: model = Category + fields = ('title', 'description') + + +class ProjectType(DjangoObjectType): + repository_url = graphene.Field(graphene.String) + + class Meta: + model = Project + fields = ('name', 'description', 'url', 'category', 'images',) + + def resolve_repository_url(self, info): + return self.repo_url + + +class ProjectImageType(DjangoObjectType): + class Meta: + model = ProjectImage class Query(object): - all_categories = graphene.List(CategoryType) + categories = graphene.List(CategoryType) + projects = graphene.List(ProjectType) + + def resolve_categories(self, info, **kwargs): + return Category.objects.all() - # @graphene.resolve_only_args - # def resolve_all_categories(self, info, **kwargs): - # return Category.objects.all() + def resolve_projects(self, info, **kwargs): + return Project.objects.all() From 702b4b3180ee72517b41873c5942cac3ee2ecc74 Mon Sep 17 00:00:00 2001 From: Xarv Date: Thu, 20 Feb 2020 11:19:38 +0100 Subject: [PATCH 3/3] fix cors and csrf problem --- requirements.txt | 1 + settings/base.py | 8 ++++++++ urls.py | 6 ++++-- 3 files changed, 13 insertions(+), 2 deletions(-) diff --git a/requirements.txt b/requirements.txt index b25de217..141dbf96 100644 --- a/requirements.txt +++ b/requirements.txt @@ -38,6 +38,7 @@ rocketchat-API==0.6.3 markdown==2.6.11 python-dotenv==0.8.0 graphene_django==2.8.2 +django-cors-headers==3.2.1 # Redis support django-redis==4.6.0 diff --git a/settings/base.py b/settings/base.py index 0bf37f93..dca22751 100644 --- a/settings/base.py +++ b/settings/base.py @@ -82,6 +82,7 @@ 'django.middleware.clickjacking.XFrameOptionsMiddleware', 'dj_pagination.middleware.PaginationMiddleware', 'social_auth_local.middleware.SocialAuthLocalExceptionMiddleware', + 'corsheaders.middleware.CorsMiddleware', ] TEMPLATES = [ @@ -170,6 +171,7 @@ 'chroniker', 'dynamic_preferences', 'graphene_django', + 'corsheaders', ] INSTALLED_APPS = PREREQ_APPS + PROJECT_APPS @@ -548,3 +550,9 @@ GRAPHENE = { 'SCHEMA': 'schema.schema' } +CORS_ORIGIN_WHITELIST = [ + 'http://localhost:8080', + 'https://localhost:8080', + ] + +CORS_ALLOW_CREDENTIALS = True diff --git a/urls.py b/urls.py index 93174d7d..3d17a878 100644 --- a/urls.py +++ b/urls.py @@ -20,6 +20,7 @@ from package.views import category, python3_list from django.contrib.auth.views import logout as contrib_logout_view from graphene_django.views import GraphQLView +from django.views.decorators.csrf import csrf_exempt urlpatterns = [ @@ -82,8 +83,9 @@ view=apiv1_gone, name="apiv1_gone", ), - url(r'^graphql/$', GraphQLView.as_view(graphiql=True)), - + # url(r'^graphql/$', GraphQLView.as_view(graphiql=True)), + url(r'^explore', GraphQLView.as_view(graphiql=True)), + url(r'^graphql', csrf_exempt(GraphQLView.as_view())), # url(r'^api/v1/', include('core.apiv1', namespace="apitest")),