From c4f29f050bd783a95a23bcba129de88a218054fa Mon Sep 17 00:00:00 2001 From: Markus Padourek Date: Fri, 20 May 2016 13:59:39 +0100 Subject: [PATCH 1/7] Added context to connectionfield resolver --- graphene/relay/fields.py | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-) diff --git a/graphene/relay/fields.py b/graphene/relay/fields.py index da9d4af7..6796d1a7 100644 --- a/graphene/relay/fields.py +++ b/graphene/relay/fields.py @@ -5,7 +5,7 @@ from graphql_relay.node.node import from_global_id from ..core.fields import Field from ..core.types.definitions import NonNull from ..core.types.scalars import ID, Int, String -from ..utils import with_context +from ..utils.wrap_resolver_function import has_context, with_context class ConnectionField(Field): @@ -25,17 +25,24 @@ class ConnectionField(Field): **kwargs) self.connection_type = connection_type self.edge_type = edge_type - - def resolver(self, instance, args, info): + + @with_context + def resolver(self, instance, args, context, info): schema = info.schema.graphene_schema connection_type = self.get_type(schema) - resolved = super(ConnectionField, self).resolver(instance, args, info) + + resolver = super(ConnectionField, self).resolver + if has_context(resolver): + resolved = super(ConnectionField, self).resolver(instance, args, context, info) + else: + resolved = super(ConnectionField, self).resolver(instance, args, info) + if isinstance(resolved, connection_type): return resolved - return self.from_list(connection_type, resolved, args, info) + return self.from_list(connection_type, resolved, args, context, info) def from_list(self, connection_type, resolved, args, info): - return connection_type.from_list(resolved, args, info) + return connection_type.from_list(resolved, args, context, info) def get_connection_type(self, node): connection_type = self.connection_type or node.get_connection_type() From 7a5ad21b98ee04089fda21d1ab1242d877fe411d Mon Sep 17 00:00:00 2001 From: Markus Padourek Date: Fri, 20 May 2016 14:00:57 +0100 Subject: [PATCH 2/7] Added context to from_list --- graphene/relay/types.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/graphene/relay/types.py b/graphene/relay/types.py index 29ba779a..2e0391ed 100644 --- a/graphene/relay/types.py +++ b/graphene/relay/types.py @@ -87,7 +87,7 @@ class Connection(ObjectType): {'edge_type': edge_type, 'edges': edges}) @classmethod - def from_list(cls, iterable, args, info): + def from_list(cls, iterable, args, context, info): assert isinstance( iterable, Iterable), 'Resolved value from the connection field have to be iterable' connection = connection_from_list( From e897efb79f7d5946c668ddd74ecba17289958668 Mon Sep 17 00:00:00 2001 From: Markus Padourek Date: Fri, 20 May 2016 14:03:47 +0100 Subject: [PATCH 3/7] Added test for with_context on connectionfield --- graphene/relay/tests/test_query.py | 42 ++++++++++++++++++++++++++++++ 1 file changed, 42 insertions(+) diff --git a/graphene/relay/tests/test_query.py b/graphene/relay/tests/test_query.py index 4e94d9fd..70b31936 100644 --- a/graphene/relay/tests/test_query.py +++ b/graphene/relay/tests/test_query.py @@ -36,16 +36,58 @@ class Query(graphene.ObjectType): special_node = relay.NodeField(SpecialNode) all_my_nodes = relay.ConnectionField( MyNode, connection_type=MyConnection, customArg=graphene.String()) + + context_nodes = relay.ConnectionField( + MyNode, connection_type=MyConnection, customArg=graphene.String()) def resolve_all_my_nodes(self, args, info): custom_arg = args.get('customArg') assert custom_arg == "1" return [MyNode(name='my')] + + @with_context + def resolve_context_nodes(self, args, context, info): + custom_arg = args.get('customArg') + assert custom_arg == "1" + return [MyNode(name='my')] schema.query = Query def test_nodefield_query(): + query = ''' + query RebelsShipsQuery { + contextNodes (customArg:"1") { + edges { + node { + name + } + }, + myCustomField + pageInfo { + hasNextPage + } + } + } + ''' + expected = { + 'allMyNodes': { + 'edges': [{ + 'node': { + 'name': 'my' + } + }], + 'myCustomField': 'Custom', + 'pageInfo': { + 'hasNextPage': False, + } + } + } + result = schema.execute(query) + assert not result.errors + assert result.data == expected + +def test_connectionfield_context_query(): query = ''' query RebelsShipsQuery { myNode(id:"TXlOb2RlOjE=") { From bc98505ee5ac1e686e7bf7da19f5da9fd89be0ba Mon Sep 17 00:00:00 2001 From: Markus Padourek Date: Fri, 20 May 2016 14:11:21 +0100 Subject: [PATCH 4/7] Fixed missing context arg --- graphene/relay/fields.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/graphene/relay/fields.py b/graphene/relay/fields.py index 6796d1a7..8ca12fef 100644 --- a/graphene/relay/fields.py +++ b/graphene/relay/fields.py @@ -41,7 +41,7 @@ class ConnectionField(Field): return resolved return self.from_list(connection_type, resolved, args, context, info) - def from_list(self, connection_type, resolved, args, info): + def from_list(self, connection_type, resolved, args, context, info): return connection_type.from_list(resolved, args, context, info) def get_connection_type(self, node): From 83c2cb1b27d86b2b358447dd8e26ba70ca87c830 Mon Sep 17 00:00:00 2001 From: Markus Padourek Date: Fri, 20 May 2016 14:40:21 +0100 Subject: [PATCH 5/7] Add context to django connection field --- graphene/contrib/django/fields.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/graphene/contrib/django/fields.py b/graphene/contrib/django/fields.py index f70e35ff..3f4681a3 100644 --- a/graphene/contrib/django/fields.py +++ b/graphene/contrib/django/fields.py @@ -27,10 +27,10 @@ class DjangoConnectionField(ConnectionField): def get_queryset(self, resolved_qs, args, info): return resolved_qs - def from_list(self, connection_type, resolved, args, info): + def from_list(self, connection_type, resolved, args, context, info): resolved_qs = maybe_queryset(resolved) qs = self.get_queryset(resolved_qs, args, info) - return super(DjangoConnectionField, self).from_list(connection_type, qs, args, info) + return super(DjangoConnectionField, self).from_list(connection_type, qs, args, context, info) class ConnectionOrListField(Field): From 5a949ce2095e0710a2669d21d2741bcc35511512 Mon Sep 17 00:00:00 2001 From: Markus Padourek Date: Fri, 20 May 2016 15:26:42 +0100 Subject: [PATCH 6/7] Added context to sqlalchemy connectionfield --- graphene/contrib/sqlalchemy/fields.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/graphene/contrib/sqlalchemy/fields.py b/graphene/contrib/sqlalchemy/fields.py index dc3eb66b..598cd341 100644 --- a/graphene/contrib/sqlalchemy/fields.py +++ b/graphene/contrib/sqlalchemy/fields.py @@ -21,11 +21,11 @@ class SQLAlchemyConnectionField(ConnectionField): def model(self): return self.type._meta.model - def from_list(self, connection_type, resolved, args, info): + def from_list(self, connection_type, resolved, args, context, info): if resolved is DefaultQuery: resolved = get_query(self.model, info) query = maybe_query(resolved) - return super(SQLAlchemyConnectionField, self).from_list(connection_type, query, args, info) + return super(SQLAlchemyConnectionField, self).from_list(connection_type, query, args, context, info) class ConnectionOrListField(Field): From 11a5ee189ef6f99ff361755dedad6b567f426f35 Mon Sep 17 00:00:00 2001 From: Syrus Akbary Date: Sat, 21 May 2016 00:40:26 -0700 Subject: [PATCH 7/7] Fixed issues --- graphene/relay/fields.py | 6 +++--- graphene/relay/tests/test_query.py | 7 ++++--- 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/graphene/relay/fields.py b/graphene/relay/fields.py index 8ca12fef..e79b9592 100644 --- a/graphene/relay/fields.py +++ b/graphene/relay/fields.py @@ -25,18 +25,18 @@ class ConnectionField(Field): **kwargs) self.connection_type = connection_type self.edge_type = edge_type - + @with_context def resolver(self, instance, args, context, info): schema = info.schema.graphene_schema connection_type = self.get_type(schema) - + resolver = super(ConnectionField, self).resolver if has_context(resolver): resolved = super(ConnectionField, self).resolver(instance, args, context, info) else: resolved = super(ConnectionField, self).resolver(instance, args, info) - + if isinstance(resolved, connection_type): return resolved return self.from_list(connection_type, resolved, args, context, info) diff --git a/graphene/relay/tests/test_query.py b/graphene/relay/tests/test_query.py index 70b31936..08e57226 100644 --- a/graphene/relay/tests/test_query.py +++ b/graphene/relay/tests/test_query.py @@ -36,7 +36,7 @@ class Query(graphene.ObjectType): special_node = relay.NodeField(SpecialNode) all_my_nodes = relay.ConnectionField( MyNode, connection_type=MyConnection, customArg=graphene.String()) - + context_nodes = relay.ConnectionField( MyNode, connection_type=MyConnection, customArg=graphene.String()) @@ -44,7 +44,7 @@ class Query(graphene.ObjectType): custom_arg = args.get('customArg') assert custom_arg == "1" return [MyNode(name='my')] - + @with_context def resolve_context_nodes(self, args, context, info): custom_arg = args.get('customArg') @@ -71,7 +71,7 @@ def test_nodefield_query(): } ''' expected = { - 'allMyNodes': { + 'contextNodes': { 'edges': [{ 'node': { 'name': 'my' @@ -87,6 +87,7 @@ def test_nodefield_query(): assert not result.errors assert result.data == expected + def test_connectionfield_context_query(): query = ''' query RebelsShipsQuery {