1
- from graphene import (ID , Boolean , Dynamic , Field , Float , Int , List ,
2
- NonNull , String , is_node )
3
- from graphene .types .json import JSONString
4
-
5
1
import mongoengine
2
+ import uuid
3
+ from graphene import (
4
+ ID ,
5
+ Boolean ,
6
+ DateTime ,
7
+ Dynamic ,
8
+ Field ,
9
+ Float ,
10
+ Int ,
11
+ List ,
12
+ NonNull ,
13
+ String ,
14
+ Union ,
15
+ is_node
16
+ )
17
+ from graphene .types .json import JSONString
18
+ from mongoengine .base import get_document
6
19
7
- from .fields import MongoengineConnectionField
8
- from .utils import import_single_dispatch
20
+ from . import advanced_types
21
+ from .utils import (
22
+ import_single_dispatch , get_field_description ,
23
+ )
9
24
10
25
singledispatch = import_single_dispatch ()
11
26
12
27
28
+ class MongoEngineConversionError (Exception ):
29
+ pass
30
+
31
+
13
32
@singledispatch
14
33
def convert_mongoengine_field (field , registry = None ):
15
- raise Exception (
34
+ raise MongoEngineConversionError (
16
35
"Don't know how to convert the MongoEngine field %s (%s)" %
17
36
(field , field .__class__ ))
18
37
@@ -21,41 +40,61 @@ def convert_mongoengine_field(field, registry=None):
21
40
@convert_mongoengine_field .register (mongoengine .StringField )
22
41
@convert_mongoengine_field .register (mongoengine .URLField )
23
42
def convert_field_to_string (field , registry = None ):
24
- return String (description = field . db_field , required = field .required )
43
+ return String (description = get_field_description ( field , registry ) , required = field .required )
25
44
26
45
27
46
@convert_mongoengine_field .register (mongoengine .UUIDField )
28
47
@convert_mongoengine_field .register (mongoengine .ObjectIdField )
29
48
def convert_field_to_id (field , registry = None ):
30
- return ID (description = field . db_field , required = field .required )
49
+ return ID (description = get_field_description ( field , registry ) , required = field .required )
31
50
32
51
33
52
@convert_mongoengine_field .register (mongoengine .IntField )
34
53
@convert_mongoengine_field .register (mongoengine .LongField )
35
54
def convert_field_to_int (field , registry = None ):
36
- return Int (description = field . db_field , required = field .required )
55
+ return Int (description = get_field_description ( field , registry ) , required = field .required )
37
56
38
57
39
58
@convert_mongoengine_field .register (mongoengine .BooleanField )
40
59
def convert_field_to_boolean (field , registry = None ):
41
- return Boolean (description = field . db_field , required = field .required )
60
+ return Boolean (description = get_field_description ( field , registry ) , required = field .required )
42
61
43
62
44
63
@convert_mongoengine_field .register (mongoengine .DecimalField )
45
64
@convert_mongoengine_field .register (mongoengine .FloatField )
46
65
def convert_field_to_float (field , registry = None ):
47
- return Float (description = field .db_field , required = field .required )
66
+ return Float (description = get_field_description (field , registry ), required = field .required )
67
+
68
+
69
+ @convert_mongoengine_field .register (mongoengine .DateTimeField )
70
+ def convert_field_to_datetime (field , registry = None ):
71
+ return DateTime (description = get_field_description (field , registry ), required = field .required )
48
72
49
73
50
74
@convert_mongoengine_field .register (mongoengine .DictField )
51
75
@convert_mongoengine_field .register (mongoengine .MapField )
52
- def convert_dict_to_jsonstring (field , registry = None ):
53
- return JSONString (description = field . db_field , required = field .required )
76
+ def convert_field_to_jsonstring (field , registry = None ):
77
+ return JSONString (description = get_field_description ( field , registry ) , required = field .required )
54
78
55
79
56
- @convert_mongoengine_field .register (mongoengine .DateTimeField )
57
- def convert_date_to_string (field , registry = None ):
58
- return String (description = field .db_field , required = field .required )
80
+ @convert_mongoengine_field .register (mongoengine .PointField )
81
+ def convert_point_to_field (field , registry = None ):
82
+ return Field (advanced_types .PointFieldType )
83
+
84
+
85
+ @convert_mongoengine_field .register (mongoengine .PolygonField )
86
+ def convert_polygon_to_field (field , registry = None ):
87
+ return Field (advanced_types .PolygonFieldType )
88
+
89
+
90
+ @convert_mongoengine_field .register (mongoengine .MultiPolygonField )
91
+ def convert_multipolygon_to_field (field , register = None ):
92
+ return Field (advanced_types .MultiPolygonFieldType )
93
+
94
+
95
+ @convert_mongoengine_field .register (mongoengine .FileField )
96
+ def convert_file_to_field (field , registry = None ):
97
+ return Field (advanced_types .FileFieldType )
59
98
60
99
61
100
@convert_mongoengine_field .register (mongoengine .ListField )
@@ -69,15 +108,43 @@ def convert_field_to_list(field, registry=None):
69
108
base_type = base_type ._type
70
109
71
110
if is_node (base_type ):
72
- return MongoengineConnectionField (base_type )
111
+ return base_type . _meta . connection_field_class (base_type )
73
112
74
113
# Non-relationship field
75
114
relations = (mongoengine .ReferenceField , mongoengine .EmbeddedDocumentField )
76
115
if not isinstance (base_type , (List , NonNull )) \
77
116
and not isinstance (field .field , relations ):
78
117
base_type = type (base_type )
79
118
80
- return List (base_type , description = field .db_field , required = field .required )
119
+ return List (base_type , description = get_field_description (field , registry ), required = field .required )
120
+
121
+
122
+ @convert_mongoengine_field .register (mongoengine .GenericReferenceField )
123
+ def convert_field_to_union (field , registry = None ):
124
+
125
+ _types = []
126
+ for choice in field .choices :
127
+ _field = mongoengine .ReferenceField (get_document (choice ))
128
+ _field = convert_mongoengine_field (_field , registry )
129
+ _type = _field .get_type ()
130
+ if _type :
131
+ _types .append (_type .type )
132
+ else :
133
+ # TODO: Register type auto-matically here.
134
+ pass
135
+
136
+ if len (_types ) == 0 :
137
+ return None
138
+
139
+ # XXX: Use uuid to avoid duplicate name
140
+ name = '{}_{}_union_{}' .format (
141
+ field ._owner_document .__name__ ,
142
+ field .db_field ,
143
+ str (uuid .uuid1 ()).replace ('-' , '' )
144
+ )
145
+ Meta = type ('Meta' , (object , ), {'types' : tuple (_types )})
146
+ _union = type (name , (Union , ), {'Meta' : Meta })
147
+ return Field (_union )
81
148
82
149
83
150
@convert_mongoengine_field .register (mongoengine .EmbeddedDocumentField )
@@ -89,6 +156,23 @@ def dynamic_type():
89
156
_type = registry .get_type_for_model (model )
90
157
if not _type :
91
158
return None
92
- return Field (_type )
159
+ return Field (_type , description = get_field_description (field , registry ))
160
+
161
+ return Dynamic (dynamic_type )
162
+
163
+
164
+ @convert_mongoengine_field .register (mongoengine .LazyReferenceField )
165
+ def convert_lazy_field_to_dynamic (field , registry = None ):
166
+ model = field .document_type
167
+
168
+ def lazy_resolver (root , * args , ** kwargs ):
169
+ if getattr (root , field .name or field .db_name ):
170
+ return getattr (root , field .name or field .db_name ).fetch ()
171
+
172
+ def dynamic_type ():
173
+ _type = registry .get_type_for_model (model )
174
+ if not _type :
175
+ return None
176
+ return Field (_type , resolver = lazy_resolver , description = get_field_description (field , registry ))
93
177
94
178
return Dynamic (dynamic_type )
0 commit comments