diff --git a/graphene/types/interface.py b/graphene/types/interface.py index b3ab200e..340fa5c1 100644 --- a/graphene/types/interface.py +++ b/graphene/types/interface.py @@ -34,9 +34,7 @@ class InterfaceMeta(AbstractTypeMeta): class Interface(six.with_metaclass(InterfaceMeta)): - @classmethod - def resolve_type(cls, root, args, info): - return type(root) + resolve_type = None def __init__(self, *args, **kwargs): raise Exception("An Interface cannot be intitialized") diff --git a/graphene/types/objecttype.py b/graphene/types/objecttype.py index 763935e5..077f097c 100644 --- a/graphene/types/objecttype.py +++ b/graphene/types/objecttype.py @@ -17,7 +17,8 @@ class ObjectTypeMeta(AbstractTypeMeta): if not is_base_type(bases, ObjectTypeMeta): return type.__new__(cls, name, bases, attrs) - options = Options( + _meta = attrs.pop('_meta', None) + options = _meta or Options( attrs.pop('Meta', None), name=name, description=attrs.get('__doc__'), @@ -49,8 +50,10 @@ class ObjectTypeMeta(AbstractTypeMeta): class ObjectType(six.with_metaclass(ObjectTypeMeta)): - - is_type_of = None + @classmethod + def is_type_of(cls, root, context, info): + if isinstance(root, cls): + return True def __init__(self, *args, **kwargs): # ObjectType acting as container diff --git a/graphene/types/typemap.py b/graphene/types/typemap.py index 42b1430d..c89b500b 100644 --- a/graphene/types/typemap.py +++ b/graphene/types/typemap.py @@ -139,12 +139,15 @@ class TypeMap(GraphQLTypeMap): @classmethod def construct_interface(cls, map, type): from .definitions import GrapheneInterfaceType + _resolve_type = None + if type.resolve_type: + _resolve_type = partial(resolve_type, type.resolve_type, map) map[type._meta.name] = GrapheneInterfaceType( graphene_type=type, name=type._meta.name, description=type._meta.description, fields=None, - resolve_type=partial(resolve_type, type.resolve_type, map), + resolve_type=_resolve_type, ) map[type._meta.name]._fields = cls.construct_fields_for_type(map, type) # cls.reducer(map, map[type._meta.name]) @@ -165,6 +168,9 @@ class TypeMap(GraphQLTypeMap): @classmethod def construct_union(cls, map, type): from .definitions import GrapheneUnionType + _resolve_type = None + if type.resolve_type: + _resolve_type = partial(resolve_type, type.resolve_type, map) types = [] for i in type._meta.types: map = cls.construct_objecttype(map, i) @@ -173,7 +179,7 @@ class TypeMap(GraphQLTypeMap): graphene_type=type, name=type._meta.name, types=types, - resolve_type=type.resolve_type, + resolve_type=_resolve_type, ) map[type._meta.name].types = types return map diff --git a/graphene/types/union.py b/graphene/types/union.py index 5ef4b69b..5803c0be 100644 --- a/graphene/types/union.py +++ b/graphene/types/union.py @@ -31,8 +31,7 @@ class UnionMeta(type): class Union(six.with_metaclass(UnionMeta)): - def resolve_type(self, _type): - return type(_type) + resolve_type = None def __init__(self, *args, **kwargs): raise Exception("An Union cannot be intitialized")