mirror of
https://github.com/graphql-python/graphene.git
synced 2024-11-22 17:46:57 +03:00
Add the info parameter (ResolveInfo) to get_node() calls.
This allows request_context (or any other ResolveInfo data) to be used while getting nodes. For example, some data might need to be hidden based on the user's authorization; you would use info.request_context for this. Fixes #34.
This commit is contained in:
parent
a970d99b69
commit
a79a76d3b9
|
@ -17,7 +17,7 @@ class Ship(DjangoNode):
|
|||
model = ShipModel
|
||||
|
||||
@classmethod
|
||||
def get_node(cls, id):
|
||||
def get_node(cls, id, info):
|
||||
return Ship(get_ship(id))
|
||||
|
||||
|
||||
|
@ -33,7 +33,7 @@ class Faction(DjangoNode):
|
|||
model = FactionModel
|
||||
|
||||
@classmethod
|
||||
def get_node(cls, id):
|
||||
def get_node(cls, id, info):
|
||||
return Faction(get_faction(id))
|
||||
|
||||
|
||||
|
|
|
@ -11,7 +11,7 @@ class Ship(relay.Node):
|
|||
name = graphene.String(description='The name of the ship.')
|
||||
|
||||
@classmethod
|
||||
def get_node(cls, id):
|
||||
def get_node(cls, id, info):
|
||||
return get_ship(id)
|
||||
|
||||
|
||||
|
@ -27,7 +27,7 @@ class Faction(relay.Node):
|
|||
return [get_ship(ship_id) for ship_id in self.ships]
|
||||
|
||||
@classmethod
|
||||
def get_node(cls, id):
|
||||
def get_node(cls, id, info):
|
||||
return get_faction(id)
|
||||
|
||||
|
||||
|
|
|
@ -66,7 +66,7 @@ def test_should_node():
|
|||
model = Reporter
|
||||
|
||||
@classmethod
|
||||
def get_node(cls, id):
|
||||
def get_node(cls, id, info):
|
||||
return ReporterNode(Reporter(id=2, first_name='Cookie Monster'))
|
||||
|
||||
def resolve_articles(self, *args, **kwargs):
|
||||
|
@ -78,7 +78,7 @@ def test_should_node():
|
|||
model = Article
|
||||
|
||||
@classmethod
|
||||
def get_node(cls, id):
|
||||
def get_node(cls, id, info):
|
||||
return ArticleNode(Article(id=1, headline='Article node'))
|
||||
|
||||
class Query(graphene.ObjectType):
|
||||
|
|
|
@ -92,7 +92,7 @@ class NodeField(Field):
|
|||
object_type != self.field_object_type):
|
||||
return
|
||||
|
||||
return object_type.get_node(_id)
|
||||
return object_type.get_node(_id, info)
|
||||
|
||||
def resolver(self, instance, args, info):
|
||||
global_id = args.get('id')
|
||||
|
|
|
@ -1,3 +1,4 @@
|
|||
import pytest
|
||||
from graphql.core.type import GraphQLID, GraphQLNonNull
|
||||
|
||||
import graphene
|
||||
|
@ -15,12 +16,22 @@ class MyNode(relay.Node):
|
|||
name = graphene.String()
|
||||
|
||||
@classmethod
|
||||
def get_node(cls, id):
|
||||
def get_node(cls, id, info):
|
||||
return MyNode(id=id, name='mo')
|
||||
|
||||
|
||||
class SpecialNode(relay.Node):
|
||||
value = graphene.String()
|
||||
|
||||
@classmethod
|
||||
def get_node(cls, id, info):
|
||||
value = "!!!" if info.request_context.get('is_special') else "???"
|
||||
return SpecialNode(id=id, value=value)
|
||||
|
||||
|
||||
class Query(graphene.ObjectType):
|
||||
my_node = relay.NodeField(MyNode)
|
||||
special_node = relay.NodeField(SpecialNode)
|
||||
all_my_nodes = relay.ConnectionField(
|
||||
MyNode, connection_type=MyConnection, customArg=graphene.String())
|
||||
|
||||
|
@ -79,6 +90,28 @@ def test_nodefield_query():
|
|||
assert result.data == expected
|
||||
|
||||
|
||||
@pytest.mark.parametrize('specialness,value', [(True, '!!!'), (False, '???')])
|
||||
def test_get_node_info(specialness, value):
|
||||
query = '''
|
||||
query ValueQuery {
|
||||
specialNode(id:"U3BlY2lhbE5vZGU6Mg==") {
|
||||
id
|
||||
value
|
||||
}
|
||||
}
|
||||
'''
|
||||
|
||||
expected = {
|
||||
'specialNode': {
|
||||
'id': 'U3BlY2lhbE5vZGU6Mg==',
|
||||
'value': value,
|
||||
},
|
||||
}
|
||||
result = schema.execute(query, request_context={'is_special': specialness})
|
||||
assert not result.errors
|
||||
assert result.data == expected
|
||||
|
||||
|
||||
def test_nodeidfield():
|
||||
id_field = MyNode._meta.fields_map['id']
|
||||
id_field_type = schema.T(id_field)
|
||||
|
|
Loading…
Reference in New Issue
Block a user