diff --git a/graphene_mongo/fields.py b/graphene_mongo/fields.py index 5961f945..96a70bdf 100644 --- a/graphene_mongo/fields.py +++ b/graphene_mongo/fields.py @@ -93,12 +93,15 @@ def is_filterable(k): return False return True - def get_type(v): - if isinstance(v.type, Structure): - return v.type.of_type() - return v.type() + def get_filter_type(_type): + """ + Returns the scalar type. + """ + if isinstance(_type, Structure): + return get_filter_type(_type.of_type) + return _type() - return {k: get_type(v) for k, v in items if is_filterable(k)} + return {k: get_filter_type(v.type) for k, v in items if is_filterable(k)} @property def field_args(self): diff --git a/graphene_mongo/tests/models.py b/graphene_mongo/tests/models.py index e06125ca..079677ec 100644 --- a/graphene_mongo/tests/models.py +++ b/graphene_mongo/tests/models.py @@ -156,3 +156,11 @@ class ErroneousModel(mongoengine.Document): meta = {'collection': 'test_colliding_objects_model'} objects = mongoengine.ListField(mongoengine.StringField()) + + +class Bar(mongoengine.EmbeddedDocument): + some_list_field = mongoengine.ListField(mongoengine.StringField(), required=True) + + +class Foo(mongoengine.Document): + bars = mongoengine.EmbeddedDocumentListField(Bar) diff --git a/graphene_mongo/tests/nodes.py b/graphene_mongo/tests/nodes.py index f1a236ed..381873bf 100644 --- a/graphene_mongo/tests/nodes.py +++ b/graphene_mongo/tests/nodes.py @@ -99,3 +99,15 @@ class ErroneousModelNode(MongoengineObjectType): class Meta: model = models.ErroneousModel interfaces = (Node, ) + + +class BarNode(MongoengineObjectType): + class Meta: + model = models.Bar + interfaces = (Node, ) + + +class FooNode(MongoengineObjectType): + class Meta: + model = models.Foo + interfaces = (Node, ) diff --git a/graphene_mongo/tests/test_relay_query.py b/graphene_mongo/tests/test_relay_query.py index e284e22d..bbe3b2dd 100644 --- a/graphene_mongo/tests/test_relay_query.py +++ b/graphene_mongo/tests/test_relay_query.py @@ -1077,3 +1077,34 @@ class Query(graphene.ObjectType): assert not result.errors assert json.dumps(result.data, sort_keys=True) == json.dumps(expected, sort_keys=True) + + +def test_should_query_document_with_embedded(fixtures): + + class Query(graphene.ObjectType): + foos = MongoengineConnectionField(nodes.FooNode) + + def resolve_multiple_foos(self, *args, **kwargs): + return list(models.Foo.objects.all()) + + query = ''' + query { + foos { + edges { + node { + bars { + edges { + node { + someListField + } + } + } + } + } + } + } + ''' + + schema = graphene.Schema(query=Query) + result = schema.execute(query) + assert not result.errors