Added NodeTypeField

This commit is contained in:
Syrus Akbary 2015-10-03 17:34:55 -07:00
parent 25eca8776a
commit dd799483b0
2 changed files with 32 additions and 5 deletions

View File

@ -197,12 +197,10 @@ class FloatField(TypeField):
class ListField(Field):
def type_wrapper(self, field_type):
return GraphQLList(field_type)
class NonNullField(Field):
def type_wrapper(self, field_type):
return GraphQLNonNull(field_type)

View File

@ -7,10 +7,11 @@ from graphql_relay.connection.connection import (
connectionArgs
)
from graphql_relay.node.node import (
globalIdField
globalIdField,
fromGlobalId
)
from graphene.core.fields import Field, LazyNativeField
from graphene.core.fields import Field, LazyNativeField, LazyField
from graphene.utils import cached_property
from graphene.utils import memoize
@ -42,13 +43,41 @@ class ConnectionField(Field):
class NodeField(LazyNativeField):
def __init__(self, object_type=None, *args, **kwargs):
super(NodeField, self).__init__(*args, **kwargs)
self.field_object_type = object_type
def get_field(self, schema):
if self.field_object_type:
field = NodeTypeField(self.field_object_type)
field.contribute_to_class(self.object_type, self.field_name)
return field.internal_field(schema)
from graphene.relay.types import BaseNode
return BaseNode.get_definitions(schema).nodeField
class NodeIDField(LazyNativeField):
class NodeTypeField(LazyField):
def __init__(self, object_type, *args, **kwargs):
super(NodeTypeField, self).__init__(None, *args, **kwargs)
self.field_object_type = object_type
def inner_field(self, schema):
from graphene.relay.types import BaseNode
node_field = BaseNode.get_definitions(schema).nodeField
def resolver(instance, args, info):
global_id = args.get('id')
resolved_global_id = fromGlobalId(global_id)
if resolved_global_id.type == self.field_object_type._meta.type_name:
return node_field.resolver(instance, args, info)
args = {a.name: a for a in node_field.args}
field = Field(self.field_object_type, id=args['id'], resolve=resolver)
field.contribute_to_class(self.object_type, self.field_name)
return field
class NodeIDField(LazyNativeField):
def get_field(self, schema):
return globalIdField(self.object_type._meta.type_name)