Skip to content

Commit a54b8f6

Browse files
committed
feat: Skip Union type in args
1 parent 2c0124c commit a54b8f6

File tree

7 files changed

+45
-43
lines changed

7 files changed

+45
-43
lines changed

graphene_mongo/converter.py

Lines changed: 11 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -18,9 +18,9 @@
1818
from mongoengine.base import get_document
1919

2020
from . import advanced_types
21+
from .registry import get_global_registry
2122
from .utils import (
2223
import_single_dispatch, get_field_description,
23-
ClassFactory, add_method,
2424
)
2525

2626
singledispatch = import_single_dispatch()
@@ -117,35 +117,21 @@ def convert_field_to_list(field, registry=None):
117117

118118
@convert_mongoengine_field.register(mongoengine.GenericReferenceField)
119119
def convert_field_to_union(field, registry=None):
120-
# pass
121-
# print(field.__dict__)
122-
# print(type(field.choices[0]))
123-
# print(get_document(field.choices[0]))
124-
from graphene_mongo import MongoengineObjectType
125-
from .registry import Registry, get_global_registry
120+
126121
_types = []
127122
for choice in field.choices:
128-
model = get_document(choice)
129-
# cls = ClassFactory(choice, BaseClass=MongoengineObjectType)
130-
# Meta = ClassFactory('Meta', argnames={'model': model})
131-
# t = add_method(type(choice + 'Type', {'Meta': Meta}, cls))
132-
# print(t)
133-
# Meta = type('Meta', (object, ), {'model': model})
134-
# class Meta:
135-
# model = get_document(choice)
136-
## print(Meta.__dict__)
137-
"""
138-
class Q(MongoengineObjectType):
139-
class Meta:
140-
model = get_document(choice)
141-
"""
142-
# cls = ClassFactory(choice + 'Type', BaseClass=MongoengineObjectType, Meta=Meta)
143-
# cls = type(choice + 'Type', (MongoengineObjectType, ), {'Meta': Meta})
144-
# _types.append(cls)
145123
field = fields.ReferenceField(get_document(choice))
146124
_field = convert_mongoengine_field(field, get_global_registry())
147125
_type = _field.get_type()
148-
_types.append(_type.type)
126+
if _type:
127+
_types.append(_type.type)
128+
else:
129+
# Can register type auto-matically here.
130+
pass
131+
132+
if len(_types) == 0:
133+
return None
134+
149135
class U(Union):
150136
class Meta:
151137
types = tuple(_types)

graphene_mongo/fields.py

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,8 @@
33
from collections import OrderedDict
44
from functools import partial, reduce
55

6+
import graphene
67
import mongoengine
7-
from graphene import PageInfo
88
from graphene.relay import ConnectionField
99
from graphene.types.argument import to_arguments
1010
from graphene.types.dynamic import Dynamic
@@ -65,6 +65,13 @@ def args(self, args):
6565

6666
def _field_args(self, items):
6767
def is_filterable(k):
68+
"""
69+
Args:
70+
k (str): field name.
71+
Returns:
72+
bool
73+
"""
74+
6875
if not hasattr(self.model, k):
6976
return False
7077
if isinstance(getattr(self.model, k), property):
@@ -75,8 +82,10 @@ def is_filterable(k):
7582
return False
7683
if isinstance(converted, (ConnectionField, Dynamic)):
7784
return False
78-
if callable(getattr(converted, 'type', None)) and isinstance(converted.type(),
79-
(PointFieldType, MultiPolygonFieldType)):
85+
if callable(getattr(converted, 'type', None)) \
86+
and isinstance(
87+
converted.type(),
88+
(PointFieldType, MultiPolygonFieldType, graphene.Union)):
8089
return False
8190
return True
8291

@@ -158,7 +167,7 @@ def default_resolver(self, _root, info, **args):
158167
list_length=list_length,
159168
connection_type=self.type,
160169
edge_type=self.type.Edge,
161-
pageinfo_type=PageInfo,
170+
pageinfo_type=graphene.PageInfo,
162171
)
163172
connection.iterable = objs
164173
connection.list_length = list_length

graphene_mongo/tests/models.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,9 @@ class Reporter(mongoengine.Document):
7171
articles = fields.ListField(fields.ReferenceField(Article))
7272
embedded_articles = fields.ListField(fields.EmbeddedDocumentField(EmbeddedArticle))
7373
embedded_list_articles = fields.EmbeddedDocumentListField(EmbeddedArticle)
74+
generic_reference = fields.GenericReferenceField(
75+
choices=[Article, Editor, ]
76+
)
7477

7578

7679
class Player(mongoengine.Document):
@@ -92,9 +95,6 @@ class Parent(mongoengine.Document):
9295
}
9396
bar = fields.StringField()
9497
loc = fields.MultiPolygonField()
95-
generic_reference = fields.GenericReferenceField(
96-
choices=[Article, Editor, ]
97-
)
9898

9999

100100
class CellTower(mongoengine.Document):

graphene_mongo/tests/setup.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,7 @@ def fixtures():
6363
)
6464
reporter1.embedded_articles = [embedded_article1, embedded_article2]
6565
reporter1.embedded_list_articles = [embedded_article2, embedded_article1]
66+
reporter1.generic_reference = article1
6667
reporter1.save()
6768

6869
Player.drop_collection()

graphene_mongo/tests/test_converter.py

Lines changed: 5 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,7 @@
44

55
from .models import (
66
Article, Editor, EmbeddedArticle, Player, Reporter,
7-
Parent, ProfessorMetadata, ProfessorVector,
8-
Publisher)
7+
ProfessorMetadata, ProfessorVector, Publisher)
98
from .. import registry
109
from ..converter import convert_mongoengine_field
1110
from ..fields import MongoengineConnectionField
@@ -309,16 +308,12 @@ class E(MongoengineObjectType):
309308
class Meta:
310309
model = Editor
311310

312-
class P(MongoengineObjectType):
311+
class R(MongoengineObjectType):
313312

314313
class Meta:
315-
model = Parent
314+
model = Reporter
316315

317316
generic_reference_field = convert_mongoengine_field(
318-
Parent._fields['generic_reference'], None
319-
)
320-
print(generic_reference_field)
321-
"""
322-
# print(Parent._fields['generic_reference'].__dict__)
317+
Reporter._fields['generic_reference'])
323318
assert isinstance(generic_reference_field, graphene.Field)
324-
"""
319+
assert isinstance(generic_reference_field.type(), graphene.Union)

graphene_mongo/tests/test_relay_query.py

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,12 @@ def resolve_reporter(self, *args, **kwargs):
5757
headline
5858
}
5959
}
60+
},
61+
genericReference {
62+
__typename
63+
... on ArticleNode {
64+
headline
65+
}
6066
}
6167
}
6268
}
@@ -108,6 +114,10 @@ def resolve_reporter(self, *args, **kwargs):
108114
}
109115
}
110116
],
117+
},
118+
'genericReference': {
119+
'__typename': 'ArticleNode',
120+
'headline': 'Hello'
111121
}
112122
}
113123
}

graphene_mongo/tests/test_types.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,8 @@ def test_objecttype_registered():
6666
'embedded_articles',
6767
'embedded_list_articles',
6868
'articles',
69-
'awards'
69+
'awards',
70+
'generic_reference',
7071
])
7172

7273

0 commit comments

Comments
 (0)