diff --git a/graphene/contrib/django/options.py b/graphene/contrib/django/options.py index 75b0738f..50f0710a 100644 --- a/graphene/contrib/django/options.py +++ b/graphene/contrib/django/options.py @@ -2,10 +2,16 @@ import inspect from django.db import models from graphene.core.options import Options +from graphene.core.types import BaseObjectType +from graphene.relay.utils import is_node VALID_ATTRS = ('model', 'only_fields') -from graphene.relay.types import Node, BaseNode + +def is_base(cls): + from graphene.contrib.django.types import DjangoObjectType + return DjangoObjectType in cls.__bases__ + class DjangoOptions(Options): def __init__(self, *args, **kwargs): @@ -16,7 +22,7 @@ class DjangoOptions(Options): def contribute_to_class(self, cls, name): super(DjangoOptions, self).contribute_to_class(cls, name) - if cls.__name__ == 'DjangoNode': + if not is_node(cls) and not is_base(cls): return if not self.model: raise Exception('Django ObjectType %s must have a model in the Meta class attr' % cls) diff --git a/graphene/relay/__init__.py b/graphene/relay/__init__.py index 67180b18..dc636f67 100644 --- a/graphene/relay/__init__.py +++ b/graphene/relay/__init__.py @@ -8,3 +8,5 @@ import graphene.relay.connections from graphene.relay.types import ( Node ) + +from graphene.relay.utils import is_node diff --git a/graphene/relay/connections.py b/graphene/relay/connections.py index 815f3617..af3968c4 100644 --- a/graphene/relay/connections.py +++ b/graphene/relay/connections.py @@ -4,11 +4,12 @@ from graphql_relay.node.node import ( from graphene import signals from graphene.relay.fields import NodeIDField -from graphene.relay.types import BaseNode, Node +from graphene.relay.utils import is_node + @signals.class_prepared.connect def object_type_created(object_type): - if issubclass(object_type, BaseNode) and BaseNode not in object_type.__bases__: + if is_node(object_type): type_name = object_type._meta.type_name field = NodeIDField() object_type.add_to_class('id', field) diff --git a/graphene/relay/types.py b/graphene/relay/types.py index 53919f1f..763168b4 100644 --- a/graphene/relay/types.py +++ b/graphene/relay/types.py @@ -39,7 +39,8 @@ class BaseNode(object): @classmethod def internal_type(cls, schema): - if cls is Node or BaseNode in cls.__bases__: + from graphene.relay.utils import is_node_type + if is_node_type(cls): # Return only nodeInterface when is the Node Inerface return BaseNode.get_definitions(schema).nodeInterface return super(BaseNode, cls).internal_type(schema) diff --git a/graphene/relay/utils.py b/graphene/relay/utils.py new file mode 100644 index 00000000..1c3a1bc3 --- /dev/null +++ b/graphene/relay/utils.py @@ -0,0 +1,7 @@ +from graphene.relay.types import BaseNode + +def is_node(object_type): + return issubclass(object_type, BaseNode) and not is_node_type(object_type) + +def is_node_type(object_type): + return BaseNode in object_type.__bases__