Skip to content

Commit 3b2eecb

Browse files
authored
Merge pull request #61 from graphql-python/feat-refine-reference-args-on-embedded-document
Feat refine reference args on embedded document
2 parents 09a6aad + a82c91d commit 3b2eecb

File tree

3 files changed

+64
-7
lines changed

3 files changed

+64
-7
lines changed

graphene_mongo/fields.py

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
from __future__ import absolute_import
22

3+
import mongoengine
34
from collections import OrderedDict
45
from functools import partial, reduce
56

@@ -72,8 +73,7 @@ def args(self):
7273
def args(self, args):
7374
self._base_args = args
7475

75-
@property
76-
def field_args(self):
76+
def _field_args(self, items):
7777
def is_filterable(v):
7878
return not isinstance(v, (ConnectionField, Dynamic))
7979

@@ -82,15 +82,19 @@ def get_type(v):
8282
return v.type.of_type()
8383
return v.type()
8484

85-
return {k: get_type(v) for k, v in self.fields.items()
86-
if is_filterable(v)}
85+
return {k: get_type(v) for k, v in items if is_filterable(v)}
86+
87+
@property
88+
def field_args(self):
89+
return self._field_args(self.fields.items())
8790

8891
@property
8992
def reference_args(self):
9093
def get_reference_field(r, kv):
9194
if callable(getattr(kv[1], 'get_type', None)):
9295
node = kv[1].get_type()._type._meta
93-
r.update({kv[0]: node.fields['id']._type.of_type()})
96+
if not issubclass(node.model, mongoengine.EmbeddedDocument):
97+
r.update({kv[0]: node.fields['id']._type.of_type()})
9498
return r
9599
return reduce(get_reference_field, self.fields.items(), {})
96100

@@ -105,7 +109,6 @@ def get_query(cls, model, info, **args):
105109
return [], 0
106110

107111
objs = model.objects()
108-
109112
if args:
110113
reference_fields = get_model_reference_fields(model)
111114
reference_args = {}

graphene_mongo/tests/test_relay_query.py

Lines changed: 44 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import json
2+
import pytest
23

34
import graphene
45

@@ -11,7 +12,8 @@
1112
PlayerNode,
1213
ReporterNode,
1314
ChildNode,
14-
ParentWithRelationshipNode)
15+
ParentWithRelationshipNode,
16+
ProfessorVectorNode,)
1517
from ..fields import MongoengineConnectionField
1618

1719

@@ -726,3 +728,44 @@ class Query(graphene.ObjectType):
726728
assert not result.errors
727729
assert json.dumps(result.data, sort_keys=True) == json.dumps(
728730
expected, sort_keys=True)
731+
732+
733+
def test_should_query_with_embedded_document(fixtures):
734+
735+
class Query(graphene.ObjectType):
736+
737+
all_professors = MongoengineConnectionField(ProfessorVectorNode)
738+
739+
query = '''
740+
query {
741+
allProfessors {
742+
edges {
743+
node {
744+
vec,
745+
metadata {
746+
firstName
747+
}
748+
}
749+
}
750+
}
751+
}
752+
'''
753+
expected = {
754+
'allProfessors': {
755+
'edges': [
756+
{
757+
'node': {
758+
'vec': [1.0, 2.3],
759+
'metadata': {
760+
'firstName': 'Steven'
761+
}
762+
}
763+
764+
}
765+
]
766+
}
767+
}
768+
schema = graphene.Schema(query=Query)
769+
result = schema.execute(query)
770+
assert not result.errors
771+
assert dict(result.data['allProfessors']) == expected['allProfessors']

graphene_mongo/tests/types.py

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -106,24 +106,35 @@ class Meta:
106106

107107

108108
class ChildNode(MongoengineObjectType):
109+
109110
class Meta:
110111
model = Child
111112
interfaces = (Node,)
112113

113114

114115
class ChildRegisteredBeforeNode(MongoengineObjectType):
116+
115117
class Meta:
116118
model = ChildRegisteredBefore
117119
interfaces = (Node, )
118120

119121

120122
class ParentWithRelationshipNode(MongoengineObjectType):
123+
121124
class Meta:
122125
model = ParentWithRelationship
123126
interfaces = (Node, )
124127

125128

126129
class ChildRegisteredAfterNode(MongoengineObjectType):
130+
127131
class Meta:
128132
model = ChildRegisteredAfter
129133
interfaces = (Node, )
134+
135+
136+
class ProfessorVectorNode(MongoengineObjectType):
137+
138+
class Meta:
139+
model = ProfessorVector
140+
interfaces = (Node, )

0 commit comments

Comments
 (0)