Skip to content

Commit e26bbdd

Browse files
authored
Merge pull request #362 from Globegitter/node-parent-type
Node parent type
2 parents d8ab8fe + 0996935 commit e26bbdd

File tree

2 files changed

+47
-7
lines changed

2 files changed

+47
-7
lines changed

graphene/relay/node.py

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -35,17 +35,19 @@ class Meta:
3535

3636
class GlobalID(Field):
3737

38-
def __init__(self, node=None, required=True, *args, **kwargs):
38+
def __init__(self, node=None, parent_type=None, required=True, *args, **kwargs):
3939
super(GlobalID, self).__init__(ID, required=required, *args, **kwargs)
4040
self.node = node or Node
41+
self.parent_type_name = parent_type._meta.name if parent_type else None
4142

4243
@staticmethod
43-
def id_resolver(parent_resolver, node, root, args, context, info):
44-
id = parent_resolver(root, args, context, info)
45-
return node.to_global_id(info.parent_type.name, id) # root._meta.name
44+
def id_resolver(parent_resolver, node, root, args, context, info, parent_type_name=None):
45+
type_id = parent_resolver(root, args, context, info)
46+
parent_type_name = parent_type_name or info.parent_type.name
47+
return node.to_global_id(parent_type_name, type_id) # root._meta.name
4648

4749
def get_resolver(self, parent_resolver):
48-
return partial(self.id_resolver, parent_resolver, self.node)
50+
return partial(self.id_resolver, parent_resolver, self.node, parent_type_name=self.parent_type_name)
4951

5052

5153
class NodeMeta(InterfaceMeta):

graphene/relay/tests/test_global_id.py

Lines changed: 40 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
1-
from ..node import Node, GlobalID
1+
from graphql_relay import to_global_id
22

3-
from ...types import NonNull, ID
3+
from ..node import Node, GlobalID
4+
from ...types import NonNull, ID, ObjectType, String
5+
from ...types.definitions import GrapheneObjectType
46

57

68
class CustomNode(Node):
@@ -9,6 +11,26 @@ class Meta:
911
name = 'Node'
1012

1113

14+
class User(ObjectType):
15+
16+
class Meta:
17+
interfaces = [CustomNode]
18+
name = String()
19+
20+
21+
class Info(object):
22+
23+
def __init__(self, parent_type):
24+
self.parent_type = GrapheneObjectType(
25+
graphene_type=parent_type,
26+
name=parent_type._meta.name,
27+
description=parent_type._meta.description,
28+
fields=None,
29+
is_type_of=parent_type.is_type_of,
30+
interfaces=None
31+
)
32+
33+
1234
def test_global_id_defaults_to_required_and_node():
1335
gid = GlobalID()
1436
assert isinstance(gid.type, NonNull)
@@ -20,3 +42,19 @@ def test_global_id_allows_overriding_of_node_and_required():
2042
gid = GlobalID(node=CustomNode, required=False)
2143
assert gid.type == ID
2244
assert gid.node == CustomNode
45+
46+
47+
def test_global_id_defaults_to_info_parent_type():
48+
my_id = '1'
49+
gid = GlobalID()
50+
id_resolver = gid.get_resolver(lambda *_: my_id)
51+
my_global_id = id_resolver(None, None, None, Info(User))
52+
assert my_global_id == to_global_id(User._meta.name, my_id)
53+
54+
55+
def test_global_id_allows_setting_customer_parent_type():
56+
my_id = '1'
57+
gid = GlobalID(parent_type=User)
58+
id_resolver = gid.get_resolver(lambda *_: my_id)
59+
my_global_id = id_resolver(None, None, None, None)
60+
assert my_global_id == to_global_id(User._meta.name, my_id)

0 commit comments

Comments
 (0)