Skip to content

Commit ff700b3

Browse files
committed
fix[connection-filter]: connection filter generation error for the following types is fixed.
ListField(EmbeddedDocumentListField(...)) ListField(GenericEmbeddedDocumentField(...)) ListField(GenericLazyReferenceField(...))
1 parent 1231952 commit ff700b3

File tree

4 files changed

+114
-17
lines changed

4 files changed

+114
-17
lines changed

graphene_mongo/fields.py

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -163,16 +163,16 @@ def is_filterable(k):
163163
),
164164
):
165165
return False
166-
if (
167-
getattr(converted, "type", None)
168-
and getattr(converted.type, "_of_type", None)
169-
and issubclass((get_type(converted.type.of_type)), graphene.Union)
170-
):
171-
return False
172-
if isinstance(converted, (graphene.List)) and issubclass(
173-
getattr(converted, "_of_type", None), graphene.Union
174-
):
175-
return False
166+
167+
if isinstance(converted, (graphene.List)):
168+
sub_type = getattr(converted, "_of_type", None)
169+
if hasattr(sub_type, "of_type"): # graphene.NonNull
170+
sub_type = sub_type.of_type
171+
if issubclass(sub_type, graphene.Union) or issubclass(
172+
sub_type, graphene.ObjectType
173+
):
174+
return False
175+
176176
# below if condition: workaround for DB filterable field redefined as custom graphene type
177177
if (
178178
hasattr(field_, "type")

graphene_mongo/tests/models.py

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
from datetime import datetime
2+
from enum import Enum
23

34
import mongoengine
45
import mongomock
@@ -177,3 +178,38 @@ class Bar(mongoengine.EmbeddedDocument):
177178

178179
class Foo(mongoengine.Document):
179180
bars = mongoengine.EmbeddedDocumentListField(Bar)
181+
182+
183+
class GradeEnum(Enum):
184+
A = "A"
185+
B = "B"
186+
187+
188+
class Student(mongoengine.EmbeddedDocument):
189+
name = mongoengine.StringField()
190+
191+
192+
class Teacher(mongoengine.EmbeddedDocument):
193+
name = mongoengine.StringField()
194+
195+
196+
class Bench(mongoengine.Document):
197+
size = mongoengine.IntField()
198+
199+
200+
class Exam(mongoengine.Document):
201+
size = mongoengine.IntField()
202+
203+
204+
class SchoolClass(mongoengine.Document):
205+
allowed_grades = mongoengine.ListField(mongoengine.EnumField(GradeEnum))
206+
subjects = mongoengine.ListField(mongoengine.StringField())
207+
students = mongoengine.ListField(mongoengine.EmbeddedDocumentListField(Student))
208+
members = mongoengine.ListField(
209+
mongoengine.GenericEmbeddedDocumentField(choices=[Student, Teacher])
210+
)
211+
records = mongoengine.ListField(mongoengine.GenericLazyReferenceField(choices=[Bench, Exam]))
212+
213+
214+
class School(mongoengine.Document):
215+
classes = mongoengine.ListField(mongoengine.ReferenceField(SchoolClass))

graphene_mongo/tests/test_types.py

Lines changed: 65 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,22 @@
1-
from pytest import raises
2-
31
from graphene import Field, Int, Interface, ObjectType
42
from graphene.relay import Node, is_node
3+
from pytest import raises
54

5+
from .models import (
6+
Article,
7+
Bench,
8+
Child,
9+
EmbeddedArticle,
10+
Exam,
11+
Parent,
12+
Reporter,
13+
School,
14+
SchoolClass,
15+
Student,
16+
)
17+
from .utils import with_local_registry
618
from .. import registry
719
from ..types import MongoengineObjectType, MongoengineObjectTypeOptions
8-
from .models import Article, EmbeddedArticle, Reporter
9-
from .models import Parent, Child
10-
from .utils import with_local_registry
1120

1221
registry.reset_global_registry()
1322

@@ -83,7 +92,13 @@ def test_node_replacedfield():
8392
def test_object_type():
8493
assert issubclass(Human, ObjectType)
8594
assert set(Human._meta.fields.keys()) == set(
86-
["id", "headline", "pub_date", "editor", "reporter"]
95+
[
96+
"id",
97+
"headline",
98+
"pub_date",
99+
"editor",
100+
"reporter",
101+
]
87102
)
88103
assert is_node(Human)
89104

@@ -176,3 +191,47 @@ class Meta:
176191

177192
assert hasattr(B._meta, "some_subclass_attr")
178193
assert B._meta.some_subclass_attr == "someval"
194+
195+
196+
@with_local_registry
197+
def test_filter_list_types():
198+
"""
199+
Test to check filter args should not be generated the following type of fields
200+
201+
ListField(EmbeddedDocumentListField(...))
202+
ListField(GenericEmbeddedDocumentField(...))
203+
ListField(GenericLazyReferenceField(...))
204+
"""
205+
206+
class ExamType(MongoengineObjectType):
207+
class Meta:
208+
model = Exam
209+
210+
class BenchType(MongoengineObjectType):
211+
class Meta:
212+
model = Bench
213+
214+
class StudentType(MongoengineObjectType):
215+
class Meta:
216+
model = Student
217+
218+
class SchoolClassType(MongoengineObjectType):
219+
class Meta:
220+
model = SchoolClass
221+
interfaces = (Node,)
222+
223+
class SchoolType(MongoengineObjectType):
224+
class Meta:
225+
model = School
226+
interfaces = (Node,)
227+
228+
class_type_filter_args = SchoolType._meta.fields["classes"].args
229+
assert class_type_filter_args.keys() == {
230+
"before",
231+
"after",
232+
"first",
233+
"last",
234+
"allowed_grades",
235+
"id",
236+
"subjects",
237+
}

graphene_mongo/utils.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -235,7 +235,9 @@ def get_queried_union_types(info, valid_gql_types):
235235
# This is done to avoid UnionFragments coming in fragments_queries as
236236
# we actually need its children types and not the UnionFragments itself
237237
fragments_queries.update(sub_query_fields)
238-
fragments_queries.pop('__typename', None) # cannot resolve __typename for a union type
238+
fragments_queries.pop(
239+
"__typename", None
240+
) # cannot resolve __typename for a union type
239241
else:
240242
fragments_queries[fragment_name] = sub_query_fields
241243
elif leaf.kind == "inline_fragment":

0 commit comments

Comments
 (0)