Skip to content

Commit e960390

Browse files
authored
Merge pull request #130 from graphql-python/feat-list-generic-reference-field
feat: support list of GenericReferenceField
2 parents ae229f7 + 32d8b99 commit e960390

File tree

7 files changed

+51
-1
lines changed

7 files changed

+51
-1
lines changed

graphene_mongo/converter.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -103,6 +103,12 @@ def convert_file_to_field(field, registry=None):
103103
@convert_mongoengine_field.register(mongoengine.EmbeddedDocumentListField)
104104
def convert_field_to_list(field, registry=None):
105105
base_type = convert_mongoengine_field(field.field, registry=registry)
106+
if isinstance(base_type, graphene.Field):
107+
return graphene.List(
108+
base_type._type,
109+
description=get_field_description(field, registry),
110+
required=field.required
111+
)
106112
if isinstance(base_type, (graphene.Dynamic)):
107113
base_type = base_type.get_type()
108114
if base_type is None:

graphene_mongo/fields.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,8 @@ def args(self, args):
6767
def _field_args(self, items):
6868
def is_filterable(k):
6969
"""
70+
Remove complex columns from input args at this moment.
71+
7072
Args:
7173
k (str): field name.
7274
Returns:
@@ -90,6 +92,10 @@ def is_filterable(k):
9092
(FileFieldType, PointFieldType, MultiPolygonFieldType, graphene.Union),
9193
):
9294
return False
95+
if isinstance(converted, (graphene.List)) \
96+
and issubclass(getattr(converted, '_of_type', None), graphene.Union):
97+
return False
98+
9399
return True
94100

95101
def get_filter_type(_type):

graphene_mongo/tests/models.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -88,6 +88,9 @@ class Reporter(mongoengine.Document):
8888
generic_embedded_document = mongoengine.GenericEmbeddedDocumentField(
8989
choices=[EmbeddedArticle, EmbeddedFoo]
9090
)
91+
generic_references = mongoengine.ListField(
92+
mongoengine.GenericReferenceField(choices=[Article, Editor])
93+
)
9194

9295

9396
class Player(mongoengine.Document):

graphene_mongo/tests/setup.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,7 @@ def fixtures():
6767
last_name="Iverson",
6868
6969
awards=["2010-mvp"],
70+
generic_references=[article1]
7071
)
7172
reporter1.articles = [article1, article2]
7273
embedded_article1 = EmbeddedArticle(headline="Real", editor=editor1)

graphene_mongo/tests/test_converter.py

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -207,6 +207,27 @@ class Meta:
207207
assert dynamic_field._of_type == A
208208

209209

210+
def test_should_list_of_generic_reference_covert_list():
211+
class A(MongoengineObjectType):
212+
class Meta:
213+
model = Article
214+
215+
class E(MongoengineObjectType):
216+
class Meta:
217+
model = Editor
218+
219+
class R(MongoengineObjectType):
220+
class Meta:
221+
model = Reporter
222+
223+
generic_references_field = convert_mongoengine_field(
224+
Reporter._fields["generic_references"], registry.get_global_registry()
225+
)
226+
assert isinstance(generic_references_field, graphene.List)
227+
field = generic_references_field.get_type()
228+
assert field._of_type._meta.types == (A, E)
229+
230+
210231
def test_should_list_of_embedded_convert_list():
211232
class E(MongoengineObjectType):
212233
class Meta:

graphene_mongo/tests/test_relay_query.py

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -425,7 +425,13 @@ class Query(graphene.ObjectType):
425425
node {
426426
id,
427427
firstName,
428-
awards
428+
awards,
429+
genericReferences {
430+
__typename
431+
... on ArticleNode {
432+
headline
433+
}
434+
}
429435
}
430436
}
431437
}
@@ -439,6 +445,12 @@ class Query(graphene.ObjectType):
439445
"id": "UmVwb3J0ZXJOb2RlOjE=",
440446
"firstName": "Allen",
441447
"awards": ["2010-mvp"],
448+
"genericReferences": [
449+
{
450+
"__typename": "ArticleNode",
451+
"headline": "Hello"
452+
}
453+
]
442454
}
443455
}
444456
]

graphene_mongo/tests/test_types.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,7 @@ def test_objecttype_registered():
6666
"awards",
6767
"generic_reference",
6868
"generic_embedded_document",
69+
"generic_references",
6970
]
7071
)
7172

0 commit comments

Comments
 (0)