Added node resolver

This commit is contained in:
Syrus Akbary 2016-08-16 00:15:00 -07:00
parent 1820a4eb60
commit a55741b03c
2 changed files with 20 additions and 9 deletions

View File

@ -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):

View File

@ -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