From 1ec2f5a4c30304abfe13d6f411cca2330a29d84d Mon Sep 17 00:00:00 2001 From: Syrus Akbary Date: Fri, 25 Sep 2015 19:41:11 -0700 Subject: [PATCH] Added app_label --- graphene/core/options.py | 5 +++-- graphene/core/types.py | 2 +- graphene/core/utils.py | 30 ++++++++++++++++++++++++------ tests/starwars_relay/schema.py | 2 +- 4 files changed, 29 insertions(+), 10 deletions(-) diff --git a/graphene/core/options.py b/graphene/core/options.py index 5a016dff..a277be15 100644 --- a/graphene/core/options.py +++ b/graphene/core/options.py @@ -1,17 +1,18 @@ from graphene.utils import cached_property -DEFAULT_NAMES = ('description', 'name', 'interface', +DEFAULT_NAMES = ('app_label', 'description', 'name', 'interface', 'type_name', 'interfaces', 'proxy') class Options(object): - def __init__(self, meta=None): + def __init__(self, meta=None, app_label=None): self.meta = meta self.local_fields = [] self.interface = False self.proxy = False self.interfaces = [] self.parents = [] + self.app_label = app_label def contribute_to_class(self, cls, name): cls._meta = self diff --git a/graphene/core/types.py b/graphene/core/types.py index a5645b16..9b136458 100644 --- a/graphene/core/types.py +++ b/graphene/core/types.py @@ -33,7 +33,7 @@ class ObjectTypeMeta(type): meta = attr_meta base_meta = getattr(new_class, '_meta', None) - new_class.add_to_class('_meta', Options(meta)) + new_class.add_to_class('_meta', Options(meta, module)) if base_meta and base_meta.proxy: new_class._meta.interface = base_meta.interface # Add all attributes to the class. diff --git a/graphene/core/utils.py b/graphene/core/utils.py index 2441e644..d6ad10d4 100644 --- a/graphene/core/utils.py +++ b/graphene/core/utils.py @@ -14,16 +14,34 @@ def get_object_type(field_type, object_type=None): if field_type == 'self': field_type = object_type._meta.type else: - object_type = get_registered_object_type(field_type) + object_type = get_registered_object_type(field_type, object_type) field_type = object_type._meta.type return field_type -def get_registered_object_type(name): - for object_type in registered_object_types: - if object_type._meta.type_name == name: - return object_type - return None +def get_registered_object_type(name, object_type=None): + app_label = None + object_type_name = name + + if '.' in name: + app_label, object_type_name = name.split('.', 1) + elif object_type: + app_label = object_type._meta.app_label + + # Filter all registered object types which have the same name + ots = [ot for ot in registered_object_types if ot._meta.type_name == name] + # If the list have more than one object type with the name, filter by + # the app_label + if len(ots)>1 and app_label: + ots = [ot for ot in ots if ot._meta.app_label == app_label] + + if len(ots)>1: + raise Exception('Multiple ObjectTypes returned with the name %s' % name) + if not ots: + raise Exception('No ObjectType found with name %s' % name) + + return ots[0] + @signals.class_prepared.connect def object_type_created(sender): diff --git a/tests/starwars_relay/schema.py b/tests/starwars_relay/schema.py index a6a0a750..b2e65db5 100644 --- a/tests/starwars_relay/schema.py +++ b/tests/starwars_relay/schema.py @@ -21,7 +21,7 @@ def wrap_character(character): class Character(graphene.Interface): name = graphene.StringField() - friends = relay.Connection('self') + friends = relay.Connection('Character') appearsIn = graphene.ListField(Episode) def resolve_friends(self, args, *_):