diff --git a/examples/starwars/schema.py b/examples/starwars/schema.py index 288e4e3f..3f1c6ebf 100644 --- a/examples/starwars/schema.py +++ b/examples/starwars/schema.py @@ -22,7 +22,6 @@ class Human(graphene.ObjectType): home_planet = graphene.String() def resolve_friends(self, args, *_): - print 'resolve_friends' # The character friends is a list of strings return [get_character(f) for f in self.friends] @@ -32,10 +31,8 @@ class Droid(graphene.ObjectType): primary_function = graphene.String() def resolve_friends(self, args, *_): - print 'resolve_friends' - # print self.name # The character friends is a list of strings - return [get_character() for f in self.friends] + return [get_character(f) for f in self.friends] class Query(graphene.ObjectType): @@ -51,7 +48,6 @@ class Query(graphene.ObjectType): @resolve_only_args def resolve_hero(self, episode=None): - print 'get_hero', get_hero(episode) return get_hero(episode) @resolve_only_args diff --git a/graphene/types/definitions.py b/graphene/types/definitions.py index 37b94604..96d97a61 100644 --- a/graphene/types/definitions.py +++ b/graphene/types/definitions.py @@ -152,7 +152,7 @@ class GrapheneObjectType(GrapheneFieldsType, GraphQLObjectType): from ..utils.get_graphql_type import get_graphql_type try: graphql_type = get_graphql_type(type(interface)) - return graphql_type == self or graphql_type in self._provided_interfaces + return graphql_type == self except: return False diff --git a/graphene/types/field.py b/graphene/types/field.py index ac02b37a..37e564f2 100644 --- a/graphene/types/field.py +++ b/graphene/types/field.py @@ -60,18 +60,40 @@ class Field(GraphQLField, OrderedType): def type(self, type): self._type = type - @property - def args(self): - return self._args - - @args.setter - def args(self, args): - self._args = args - @property def resolver(self): - return self._resolver or getattr(self.parent(), 'resolve_{}'.format(self.attname), None) + def default_resolver(root, args, context, info): + return getattr(root, self.source or self.attname, None) + + resolver = getattr(self.parent, 'resolve_{}'.format(self.attname), default_resolver) + + def resolver_wrapper(root, *args, **kwargs): + if not isinstance(root, self.parent): + root = self.parent() + return resolver(root, *args, **kwargs) + + return self._resolver or resolver_wrapper @resolver.setter def resolver(self, resolver): self._resolver = resolver + + def __copy__(self): + field = Field( + type=self._type, + args=self.args, + resolver=self._resolver, + source=self.source, + deprecation_reason=self.deprecation_reason, + name=self._name, + description=self.description, + _creation_counter=self.creation_counter, + ) + field.attname = self.attname + field.parent = self.parent + return field + + def __str__(self): + if not self.parent: + return 'Not bounded field' + return "{}.{}".format(self.parent._meta.graphql_type, self.attname)