From e982579711da3c7e7015b3c9d7dc0fb37e03c1bf Mon Sep 17 00:00:00 2001 From: Christian Cueni Date: Tue, 1 Oct 2019 14:41:36 +0200 Subject: [PATCH] Add public graphql endpoint --- server/api/public_schema.py | 25 ++++++++++++++ server/api/schema.py | 8 +++-- server/api/urls.py | 8 +++++ server/users/schema.py | 46 +++---------------------- server/users/schema_public.py | 63 +++++++++++++++++++++++++++++++++++ 5 files changed, 106 insertions(+), 44 deletions(-) create mode 100644 server/api/public_schema.py create mode 100644 server/users/schema_public.py diff --git a/server/api/public_schema.py b/server/api/public_schema.py new file mode 100644 index 00000000..f0c2abae --- /dev/null +++ b/server/api/public_schema.py @@ -0,0 +1,25 @@ +import graphene +from django.conf import settings +from graphene import relay +from graphene_django.debug import DjangoDebug + + +from users.schema_public import UsersQuery +from users.mutations import ProfileMutations + + +class Query(UsersQuery, graphene.ObjectType): + node = relay.Node.Field() + + if settings.DEBUG: + debug = graphene.Field(DjangoDebug, name='__debug') + + +# class Mutation(BookMutations, RoomMutations, AssignmentMutations, ObjectiveMutations, CoreMutations, PortfolioMutations, +# ProfileMutations, SurveysMutations, graphene.ObjectType): + + if settings.DEBUG: + debug = graphene.Field(DjangoDebug, name='__debug') + + +schema = graphene.Schema(query=Query) diff --git a/server/api/schema.py b/server/api/schema.py index 68436053..24953121 100644 --- a/server/api/schema.py +++ b/server/api/schema.py @@ -19,12 +19,14 @@ from surveys.schema import SurveysQuery from surveys.mutations import SurveysMutations from rooms.mutations import RoomMutations from rooms.schema import RoomsQuery, ModuleRoomsQuery -from users.schema import UsersQuery +from users.schema_public import UsersQuery +from users.schema import AllUsersQuery from users.mutations import ProfileMutations -class Query(UsersQuery, ModuleRoomsQuery, RoomsQuery, ObjectivesQuery, BookQuery, AssignmentsQuery, StudentSubmissionQuery, - BasicKnowledgeQuery, PortfolioQuery, MyActivityQuery, SurveysQuery, graphene.ObjectType): +class Query(UsersQuery, AllUsersQuery, ModuleRoomsQuery, RoomsQuery, ObjectivesQuery, BookQuery, AssignmentsQuery, + StudentSubmissionQuery, BasicKnowledgeQuery, PortfolioQuery, MyActivityQuery, SurveysQuery, + graphene.ObjectType): node = relay.Node.Field() if settings.DEBUG: diff --git a/server/api/urls.py b/server/api/urls.py index 92f2eef5..b3002aea 100644 --- a/server/api/urls.py +++ b/server/api/urls.py @@ -1,13 +1,21 @@ from django.conf import settings from django.conf.urls import url from django.views.decorators.csrf import csrf_exempt +from graphene_django.views import GraphQLView + +from api.public_schema import schema from core.views import PrivateGraphQLView app_name = 'api' urlpatterns = [ + url(r'^graphql-public', csrf_exempt(GraphQLView.as_view(schema=schema))), url(r'^graphql', csrf_exempt(PrivateGraphQLView.as_view())), ] if settings.DEBUG: + urlpatterns += [url(r'^graphiql-public', csrf_exempt(GraphQLView.as_view(schema=schema, graphiql=True, + pretty=True)))] urlpatterns += [url(r'^graphiql', csrf_exempt(PrivateGraphQLView.as_view(graphiql=True, pretty=True)))] + + diff --git a/server/users/schema.py b/server/users/schema.py index 40aa2146..7b84653f 100644 --- a/server/users/schema.py +++ b/server/users/schema.py @@ -1,54 +1,18 @@ import graphene -from graphene import relay -from graphene_django import DjangoObjectType from graphene_django.filter import DjangoFilterConnectionField -from users.models import SchoolClass, User +from users.models import User +from users.schema_public import UserNode -class SchoolClassNode(DjangoObjectType): - pk = graphene.Int() - - class Meta: - model = SchoolClass - filter_fields = ['name'] - interfaces = (relay.Node,) - - def resolve_pk(self, *args, **kwargs): - return self.id - - -class UserNode(DjangoObjectType): - pk = graphene.Int() - permissions = graphene.List(graphene.String) - selected_class = graphene.Field(SchoolClassNode) - - class Meta: - model = User - filter_fields = ['username', 'email'] - only_fields = ['username', 'email', 'first_name', 'last_name', 'school_classes', 'last_module', 'avatar_url', - 'selected_class'] - interfaces = (relay.Node,) - - def resolve_pk(self, info, **kwargs): - return self.id - - def resolve_permissions(self, info): - return self.get_all_permissions() - - def resolve_selected_class(self, info): - return self.selected_class() - - -class UsersQuery(object): +class AllUsersQuery(object): me = graphene.Field(UserNode) all_users = DjangoFilterConnectionField(UserNode) - def resolve_me(self, info, **kwargs): - return info.context.user - def resolve_all_users(self, info, **kwargs): if not info.context.user.is_superuser: return User.objects.none() else: return User.objects.all() + + diff --git a/server/users/schema_public.py b/server/users/schema_public.py new file mode 100644 index 00000000..dfa23853 --- /dev/null +++ b/server/users/schema_public.py @@ -0,0 +1,63 @@ +# -*- coding: utf-8 -*- +# +# ITerativ GmbH +# http://www.iterativ.ch/ +# +# Copyright (c) 2019 ITerativ GmbH. All rights reserved. +# +# Created on 2019-10-01 +# @author: chrigu +import graphene +from graphene import relay +from graphene_django import DjangoObjectType +from graphene_django.filter import DjangoFilterConnectionField + +from users.models import User, SchoolClass + + +class SchoolClassNode(DjangoObjectType): + pk = graphene.Int() + + class Meta: + model = SchoolClass + filter_fields = ['name'] + interfaces = (relay.Node,) + + def resolve_pk(self, *args, **kwargs): + return self.id + + +class UserNode(DjangoObjectType): + pk = graphene.Int() + permissions = graphene.List(graphene.String) + selected_class = graphene.Field(SchoolClassNode) + + class Meta: + model = User + filter_fields = ['username', 'email'] + only_fields = ['username', 'email', 'first_name', 'last_name', 'school_classes', 'last_module', 'avatar_url', + 'selected_class'] + interfaces = (relay.Node,) + + def resolve_pk(self, info, **kwargs): + return self.id + + def resolve_permissions(self, info): + return self.get_all_permissions() + + def resolve_selected_class(self, info): + return self.selected_class() + + +class UsersQuery(object): + me = graphene.Field(UserNode) + all_users = DjangoFilterConnectionField(UserNode) + + def resolve_me(self, info, **kwargs): + return info.context.user + + def resolve_all_users(self, info, **kwargs): + if not info.context.user.is_superuser: + return User.objects.none() + else: + return User.objects.all()