Skip to content

Commit 2c0124c

Browse files
committed
wip: Convert to union seems work
1 parent e9b15bc commit 2c0124c

File tree

3 files changed

+99
-39
lines changed

3 files changed

+99
-39
lines changed

graphene_mongo/converter.py

Lines changed: 42 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import mongoengine
12
from graphene import (
23
ID,
34
Boolean,
@@ -9,14 +10,18 @@
910
List,
1011
NonNull,
1112
String,
13+
Union,
1214
is_node
1315
)
1416
from graphene.types.json import JSONString
15-
16-
import mongoengine
17+
from mongoengine import fields
18+
from mongoengine.base import get_document
1719

1820
from . import advanced_types
19-
from .utils import import_single_dispatch, get_field_description
21+
from .utils import (
22+
import_single_dispatch, get_field_description,
23+
ClassFactory, add_method,
24+
)
2025

2126
singledispatch = import_single_dispatch()
2227

@@ -112,7 +117,40 @@ def convert_field_to_list(field, registry=None):
112117

113118
@convert_mongoengine_field.register(mongoengine.GenericReferenceField)
114119
def convert_field_to_union(field, registry=None):
115-
pass
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
126+
_types = []
127+
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)
145+
field = fields.ReferenceField(get_document(choice))
146+
_field = convert_mongoengine_field(field, get_global_registry())
147+
_type = _field.get_type()
148+
_types.append(_type.type)
149+
class U(Union):
150+
class Meta:
151+
types = tuple(_types)
152+
153+
return Field(U)
116154

117155

118156
@convert_mongoengine_field.register(mongoengine.EmbeddedDocumentField)

graphene_mongo/tests/models.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -93,7 +93,7 @@ class Parent(mongoengine.Document):
9393
bar = fields.StringField()
9494
loc = fields.MultiPolygonField()
9595
generic_reference = fields.GenericReferenceField(
96-
choices=[Article, Reporter, ]
96+
choices=[Article, Editor, ]
9797
)
9898

9999

graphene_mongo/tests/test_converter.py

Lines changed: 56 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,10 @@
11
import graphene
2-
import mongoengine
3-
4-
from graphene import (
5-
Dynamic, Node
6-
)
7-
2+
from mongoengine import fields
83
from py.test import raises
94

105
from .models import (
116
Article, Editor, EmbeddedArticle, Player, Reporter,
12-
ProfessorMetadata, ProfessorVector,
7+
Parent, ProfessorMetadata, ProfessorVector,
138
Publisher)
149
from .. import registry
1510
from ..converter import convert_mongoengine_field
@@ -32,80 +27,80 @@ def test_should_unknown_mongoengine_field_raise_exception():
3227

3328

3429
def test_should_email_convert_string():
35-
assert_conversion(mongoengine.EmailField, graphene.String)
30+
assert_conversion(fields.EmailField, graphene.String)
3631

3732

3833
def test_should_string_convert_string():
39-
assert_conversion(mongoengine.StringField, graphene.String)
34+
assert_conversion(fields.StringField, graphene.String)
4035

4136

4237
def test_should_url_convert_string():
43-
assert_conversion(mongoengine.URLField, graphene.String)
38+
assert_conversion(fields.URLField, graphene.String)
4439

4540

4641
def test_should_uuid_convert_id():
47-
assert_conversion(mongoengine.UUIDField, graphene.ID)
42+
assert_conversion(fields.UUIDField, graphene.ID)
4843

4944

5045
def test_sould_int_convert_int():
51-
assert_conversion(mongoengine.IntField, graphene.Int)
46+
assert_conversion(fields.IntField, graphene.Int)
5247

5348

5449
def test_sould_long_convert_int():
55-
assert_conversion(mongoengine.LongField, graphene.Int)
50+
assert_conversion(fields.LongField, graphene.Int)
5651

5752

5853
def test_should_object_id_convert_id():
59-
assert_conversion(mongoengine.ObjectIdField, graphene.ID)
54+
assert_conversion(fields.ObjectIdField, graphene.ID)
6055

6156

6257
def test_should_boolean_convert_boolean():
63-
assert_conversion(mongoengine.BooleanField, graphene.Boolean)
58+
assert_conversion(fields.BooleanField, graphene.Boolean)
6459

6560

6661
def test_should_decimal_convert_float():
67-
assert_conversion(mongoengine.DecimalField, graphene.Float)
62+
assert_conversion(fields.DecimalField, graphene.Float)
6863

6964

7065
def test_should_float_convert_float():
71-
assert_conversion(mongoengine.FloatField, graphene.Float)
66+
assert_conversion(fields.FloatField, graphene.Float)
7267

7368

7469
def test_should_datetime_convert_datetime():
75-
assert_conversion(mongoengine.DateTimeField, graphene.DateTime)
70+
assert_conversion(fields.DateTimeField, graphene.DateTime)
7671

7772

7873
def test_should_dict_convert_json():
79-
assert_conversion(mongoengine.DictField, graphene.JSONString)
74+
assert_conversion(fields.DictField, graphene.JSONString)
8075

8176

8277
def test_should_map_convert_json():
83-
assert_conversion(mongoengine.MapField, graphene.JSONString, field=mongoengine.StringField())
78+
assert_conversion(fields.MapField, graphene.JSONString, field=fields.StringField())
8479

8580

8681
def test_should_point_convert_field():
87-
graphene_type = convert_mongoengine_field(mongoengine.PointField())
82+
graphene_type = convert_mongoengine_field(fields.PointField())
8883
assert isinstance(graphene_type, graphene.Field)
8984
assert isinstance(graphene_type.type.type, graphene.String)
9085
assert isinstance(graphene_type.type.coordinates, graphene.List)
9186

9287

9388
def test_should_polygon_covert_field():
94-
graphene_type = convert_mongoengine_field(mongoengine.PolygonField())
89+
graphene_type = convert_mongoengine_field(fields.PolygonField())
9590
assert isinstance(graphene_type, graphene.Field)
9691
assert isinstance(graphene_type.type.type, graphene.String)
9792
assert isinstance(graphene_type.type.coordinates, graphene.List)
9893

9994

10095
def test_should_multipolygon_convert_field():
101-
graphene_type = convert_mongoengine_field(mongoengine.MultiPolygonField())
96+
graphene_type = convert_mongoengine_field(fields.MultiPolygonField())
10297
assert isinstance(graphene_type, graphene.Field)
10398
assert isinstance(graphene_type.type.type, graphene.String)
10499
assert isinstance(graphene_type.type.coordinates, graphene.List)
105100

106101

107102
def test_should_field_convert_list():
108-
assert_conversion(mongoengine.ListField, graphene.List, field=mongoengine.StringField())
103+
assert_conversion(fields.ListField, graphene.List, field=fields.StringField())
109104

110105

111106
def test_should_reference_convert_dynamic():
@@ -114,11 +109,11 @@ class E(MongoengineObjectType):
114109

115110
class Meta:
116111
model = Editor
117-
interfaces = (Node,)
112+
interfaces = (graphene.Node,)
118113

119114
dynamic_field = convert_mongoengine_field(
120115
EmbeddedArticle._fields['editor'], E._meta.registry)
121-
assert isinstance(dynamic_field, Dynamic)
116+
assert isinstance(dynamic_field, graphene.Dynamic)
122117
graphene_type = dynamic_field.get_type()
123118
assert isinstance(graphene_type, graphene.Field)
124119
assert graphene_type.type == E
@@ -130,12 +125,12 @@ class P(MongoengineObjectType):
130125

131126
class Meta:
132127
model = Publisher
133-
interfaces = (Node,)
128+
interfaces = (graphene.Node,)
134129

135130
dynamic_field = convert_mongoengine_field(
136131
Editor._fields['company'], P._meta.registry)
137132

138-
assert isinstance(dynamic_field, Dynamic)
133+
assert isinstance(dynamic_field, graphene.Dynamic)
139134
graphene_type = dynamic_field.get_type()
140135
assert isinstance(graphene_type, graphene.Field)
141136
assert graphene_type.type == P
@@ -147,11 +142,11 @@ class PM(MongoengineObjectType):
147142

148143
class Meta:
149144
model = ProfessorMetadata
150-
interfaces = (Node,)
145+
interfaces = (graphene.Node,)
151146

152147
dynamic_field = convert_mongoengine_field(
153148
ProfessorVector._fields['metadata'], PM._meta.registry)
154-
assert isinstance(dynamic_field, Dynamic)
149+
assert isinstance(dynamic_field, graphene.Dynamic)
155150
graphene_type = dynamic_field.get_type()
156151
assert isinstance(graphene_type, graphene.Field)
157152
assert graphene_type.type == PM
@@ -161,7 +156,7 @@ def test_should_convert_none():
161156
registry.reset_global_registry()
162157
dynamic_field = convert_mongoengine_field(
163158
EmbeddedArticle._fields['editor'], registry.get_global_registry())
164-
assert isinstance(dynamic_field, Dynamic)
159+
assert isinstance(dynamic_field, graphene.Dynamic)
165160
graphene_type = dynamic_field.get_type()
166161
assert graphene_type is None
167162

@@ -170,7 +165,7 @@ def test_should_convert_none_lazily():
170165
registry.reset_global_registry()
171166
dynamic_field = convert_mongoengine_field(
172167
Editor._fields['company'], registry.get_global_registry())
173-
assert isinstance(dynamic_field, Dynamic)
168+
assert isinstance(dynamic_field, graphene.Dynamic)
174169
graphene_type = dynamic_field.get_type()
175170
assert graphene_type is None
176171

@@ -223,11 +218,11 @@ class P(MongoengineObjectType):
223218

224219
class Meta:
225220
model = Player
226-
interfaces = (Node,)
221+
interfaces = (graphene.Node,)
227222

228223
dynamic_field = convert_mongoengine_field(
229224
Player._fields['opponent'], P._meta.registry)
230-
assert isinstance(dynamic_field, Dynamic)
225+
assert isinstance(dynamic_field, graphene.Dynamic)
231226
graphene_type = dynamic_field.get_type()
232227
assert isinstance(graphene_type, graphene.Field)
233228
assert graphene_type.type == P
@@ -300,3 +295,30 @@ class Meta:
300295
Article._fields['editor'], A._meta.registry
301296
).get_type()
302297
assert editor_field.description == "An Editor of a publication."
298+
299+
300+
def test_should_generic_reference_convert_union():
301+
302+
class A(MongoengineObjectType):
303+
304+
class Meta:
305+
model = Article
306+
307+
class E(MongoengineObjectType):
308+
309+
class Meta:
310+
model = Editor
311+
312+
class P(MongoengineObjectType):
313+
314+
class Meta:
315+
model = Parent
316+
317+
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__)
323+
assert isinstance(generic_reference_field, graphene.Field)
324+
"""

0 commit comments

Comments
 (0)