From a55741b03c039964c07f2384f93e95a83a691ee3 Mon Sep 17 00:00:00 2001 From: Syrus Akbary Date: Tue, 16 Aug 2016 00:15:00 -0700 Subject: [PATCH] Added node resolver --- graphene/relay/node.py | 27 ++++++++++++++++++--------- graphene/types/typemap.py | 2 ++ 2 files changed, 20 insertions(+), 9 deletions(-) diff --git a/graphene/relay/node.py b/graphene/relay/node.py index afa5e0b5..0f9fc49b 100644 --- a/graphene/relay/node.py +++ b/graphene/relay/node.py @@ -50,20 +50,29 @@ class NodeMeta(InterfaceMeta): return cls +class NodeField(Field): + def __init__(self, node, type=False, deprecation_reason=None, + name=None, **kwargs): + assert issubclass(node, Node), 'NodeField can only operate in Nodes' + type = type or node + super(NodeField, self).__init__( + type, + description='The ID of the object', + id=ID(required=True), + resolver=node.node_resolver + ) + + class Node(six.with_metaclass(NodeMeta, Interface)): '''An object with an ID''' @classmethod - def Field(cls): # noqa: N802 - def resolve_node(root, args, context, info): - return cls.get_node_from_global_id(args.get('id'), context, info) + def Field(cls, *args, **kwargs): # noqa: N802 + return NodeField(cls, *args, **kwargs) - return Field( - cls, - description='The ID of the object', - id=ID(required=True), - resolver=resolve_node - ) + @classmethod + def node_resolver(cls, root, args, context, info): + return cls.get_node_from_global_id(args.get('id'), context, info) @classmethod def get_node_from_global_id(cls, global_id, context, info): diff --git a/graphene/types/typemap.py b/graphene/types/typemap.py index 5f030cc7..3b3f5768 100644 --- a/graphene/types/typemap.py +++ b/graphene/types/typemap.py @@ -239,6 +239,8 @@ class TypeMap(GraphQLTypeMap): # find it in each of the interfaces interface_resolver = None for interface in type._meta.interfaces: + if name not in interface._meta.fields: + continue interface_resolver = getattr(interface, 'resolve_{}'.format(name), None) if interface_resolver: break