Skip to content

Commit 5f8ed1f

Browse files
committed
feat: Use advanced_types.FieldType instead
1 parent c766427 commit 5f8ed1f

File tree

5 files changed

+61
-47
lines changed

5 files changed

+61
-47
lines changed

graphene_mongo/advanced_types.py

Lines changed: 26 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -1,45 +1,47 @@
11
import base64
2-
import mongoengine
32
import graphene
43

5-
from .types import MongoengineObjectType
6-
74

85
def _resolve_type_coordinates(self, info):
96
return self['coordinates']
107

118

12-
def _resolve_data(self, info):
13-
v = getattr(self.instance, self.key)
14-
return base64.b64encode(v.read())
9+
def _resolve_fs_field(field, name, default_value=None):
10+
v = getattr(field.instance, field.key)
11+
return getattr(v, name, default_value)
1512

1613

17-
class FsFile(mongoengine.Document):
14+
def _resolve_content_type(self, info):
15+
return _resolve_fs_field(self, 'content_type')
1816

19-
# TODO: Need to take care collection name instead of hard-code
20-
meta = {'collection': 'fs.files'}
21-
content_type = mongoengine.StringField(name='contentType')
22-
chunk_size = mongoengine.IntField(name='chunkSize')
23-
length = mongoengine.IntField()
24-
md5 = mongoengine.StringField()
2517

18+
def _resolve_md5(self, info):
19+
return _resolve_fs_field(self, 'md5')
2620

27-
class FsFileType(MongoengineObjectType):
2821

29-
class Meta:
30-
model = FsFile
22+
def _resolve_chunk_size(self, info):
23+
return _resolve_fs_field(self, 'chunk_size', 0)
3124

32-
# data = graphene.String(
33-
# resolver=lambda self, *args, **kwargs: self.resolve_data())
3425

35-
data = graphene.String(
36-
resolver=_resolve_data)
26+
def _resolve_length(self, info):
27+
return _resolve_fs_field(self, 'length', 0)
3728

38-
def resolve_data(self):
39-
v = getattr(self.instance, self.key)
40-
data = v.read()
41-
print(type(data))
29+
30+
def _resolve_data(self, info):
31+
v = getattr(self.instance, self.key)
32+
data = v.read()
33+
if data is not None:
4234
return base64.b64encode(data)
35+
return None
36+
37+
38+
class FileFieldType(graphene.ObjectType):
39+
40+
content_type = graphene.String(resolver=_resolve_content_type)
41+
md5 = graphene.String(resolver=_resolve_md5)
42+
chunk_size = graphene.Int(resolver=_resolve_chunk_size)
43+
length = graphene.Int(resolver=_resolve_length)
44+
data = graphene.String(resolver=_resolve_data)
4345

4446

4547
class _TypeField(graphene.ObjectType):

graphene_mongo/converter.py

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
from graphene.types.json import JSONString
1818
from mongoengine.base import get_document
1919

20+
from . import advanced_types
2021
from .utils import (
2122
import_single_dispatch, get_field_description,
2223
)
@@ -78,27 +79,22 @@ def convert_field_to_jsonstring(field, registry=None):
7879

7980
@convert_mongoengine_field.register(mongoengine.PointField)
8081
def convert_point_to_field(field, registry=None):
81-
from . import advanced_types
8282
return Field(advanced_types.PointFieldType)
8383

8484

8585
@convert_mongoengine_field.register(mongoengine.PolygonField)
8686
def convert_polygon_to_field(field, registry=None):
87-
from . import advanced_types
8887
return Field(advanced_types.PolygonFieldType)
8988

9089

9190
@convert_mongoengine_field.register(mongoengine.MultiPolygonField)
9291
def convert_multipolygon_to_field(field, register=None):
93-
from . import advanced_types
9492
return Field(advanced_types.MultiPolygonFieldType)
9593

9694

9795
@convert_mongoengine_field.register(mongoengine.FileField)
9896
def convert_file_to_field(field, registry=None):
99-
from . import advanced_types
100-
field = mongoengine.ReferenceField(advanced_types.FsFile)
101-
return convert_mongoengine_field(field, registry)
97+
return Field(advanced_types.FileFieldType)
10298

10399

104100
@convert_mongoengine_field.register(mongoengine.ListField)

graphene_mongo/fields.py

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,9 @@
1111
from graphene.types.structures import Structure
1212
from graphql_relay.connection.arrayconnection import connection_from_list_slice
1313

14+
from .advanced_types import (
15+
FileFieldType, PointFieldType, MultiPolygonFieldType
16+
)
1417
from .converter import convert_mongoengine_field, MongoEngineConversionError
1518
from .registry import get_global_registry
1619
from .utils import get_model_reference_fields, get_node_from_global_id
@@ -63,7 +66,6 @@ def args(self, args):
6366
self._base_args = args
6467

6568
def _field_args(self, items):
66-
from .advanced_types import PointFieldType, MultiPolygonFieldType
6769

6870
def is_filterable(k):
6971
"""
@@ -86,7 +88,7 @@ def is_filterable(k):
8688
if callable(getattr(converted, 'type', None)) \
8789
and isinstance(
8890
converted.type(),
89-
(PointFieldType, MultiPolygonFieldType, graphene.Union)):
91+
(FileFieldType, PointFieldType, MultiPolygonFieldType, graphene.Union)):
9092
return False
9193
return True
9294

@@ -103,7 +105,6 @@ def field_args(self):
103105

104106
@property
105107
def reference_args(self):
106-
from .advanced_types import FsFile
107108

108109
def get_reference_field(r, kv):
109110
field = kv[1]
@@ -114,7 +115,7 @@ def get_reference_field(r, kv):
114115
_type = field.get_type()
115116
if _type:
116117
node = _type._type._meta
117-
if 'id' in node.fields and not issubclass(node.model, (mongoengine.EmbeddedDocument, FsFile)):
118+
if 'id' in node.fields and not issubclass(node.model, (mongoengine.EmbeddedDocument,)):
118119
r.update({kv[0]: node.fields['id']._type.of_type()})
119120
return r
120121

graphene_mongo/tests/test_converter.py

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
Article, Editor, EmbeddedArticle, Player, Reporter,
77
ProfessorMetadata, ProfessorVector, Publisher)
88
from .. import registry
9+
from .. import advanced_types
910
from ..converter import convert_mongoengine_field
1011
from ..fields import MongoengineConnectionField
1112
from ..types import MongoengineObjectType
@@ -80,32 +81,31 @@ def test_should_map_convert_json():
8081
def test_should_point_convert_field():
8182
graphene_type = convert_mongoengine_field(mongoengine.PointField())
8283
assert isinstance(graphene_type, graphene.Field)
84+
assert graphene_type.type == advanced_types.PointFieldType
8385
assert isinstance(graphene_type.type.type, graphene.String)
8486
assert isinstance(graphene_type.type.coordinates, graphene.List)
8587

8688

8789
def test_should_polygon_covert_field():
8890
graphene_type = convert_mongoengine_field(mongoengine.PolygonField())
8991
assert isinstance(graphene_type, graphene.Field)
92+
assert graphene_type.type == advanced_types.PolygonFieldType
9093
assert isinstance(graphene_type.type.type, graphene.String)
9194
assert isinstance(graphene_type.type.coordinates, graphene.List)
9295

9396

9497
def test_should_multipolygon_convert_field():
9598
graphene_type = convert_mongoengine_field(mongoengine.MultiPolygonField())
9699
assert isinstance(graphene_type, graphene.Field)
100+
assert graphene_type.type == advanced_types.MultiPolygonFieldType
97101
assert isinstance(graphene_type.type.type, graphene.String)
98102
assert isinstance(graphene_type.type.coordinates, graphene.List)
99103

100104

101105
def test_should_file_convert_field():
102-
from ..advanced_types import FsFileType
103-
dynamic_field = convert_mongoengine_field(
104-
mongoengine.FileField(), FsFileType._meta.registry)
105-
assert isinstance(dynamic_field, graphene.Dynamic)
106-
graphene_type = dynamic_field.get_type()
106+
graphene_type = convert_mongoengine_field(mongoengine.FileField())
107107
assert isinstance(graphene_type, graphene.Field)
108-
assert graphene_type.type == FsFileType
108+
assert graphene_type.type == advanced_types.FileFieldType
109109

110110

111111
def test_should_field_convert_list():

graphene_mongo/tests/test_relay_query.py

Lines changed: 22 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,12 @@
1+
import base64
2+
import os
13
import pytest
24

35
import graphene
46

57
from graphene.relay import Node
68

7-
from .setup import fixtures
9+
from .setup import fixtures, fixtures_dirname
810
from .models import Article, Reporter
911
from .nodes import (ArticleNode,
1012
EditorNode,
@@ -127,7 +129,7 @@ def resolve_reporter(self, *args, **kwargs):
127129
assert dict(result.data['reporter']) == expected['reporter']
128130

129131

130-
def test_should_query_all_editors(fixtures):
132+
def test_should_query_all_editors(fixtures, fixtures_dirname):
131133

132134
class Query(graphene.ObjectType):
133135
node = Node.Field()
@@ -142,13 +144,20 @@ class Query(graphene.ObjectType):
142144
firstName,
143145
lastName,
144146
avatar {
145-
contentType
147+
contentType,
148+
length,
149+
data
146150
}
147151
}
148152
}
149153
}
150154
}
151155
'''
156+
157+
avator_filename = os.path.join(fixtures_dirname, 'image.jpg')
158+
with open(avator_filename, 'rb') as f:
159+
data = base64.b64encode(f.read())
160+
152161
expected = {
153162
'allEditors': {
154163
'edges': [
@@ -158,7 +167,9 @@ class Query(graphene.ObjectType):
158167
'firstName': 'Penny',
159168
'lastName': 'Hardaway',
160169
'avatar': {
161-
'contentType': 'image/jpeg'
170+
'contentType': 'image/jpeg',
171+
'length': 46928,
172+
'data': str(data)
162173
}
163174
}
164175
},
@@ -168,7 +179,9 @@ class Query(graphene.ObjectType):
168179
'firstName': 'Grant',
169180
'lastName': 'Hill',
170181
'avatar': {
171-
'contentType': None
182+
'contentType': None,
183+
'length': 0,
184+
'data': None
172185
}
173186
}
174187

@@ -179,7 +192,9 @@ class Query(graphene.ObjectType):
179192
'firstName': 'Dennis',
180193
'lastName': 'Rodman',
181194
'avatar': {
182-
'contentType': None
195+
'contentType': None,
196+
'length': 0,
197+
'data': None
183198
}
184199
}
185200
}
@@ -189,7 +204,7 @@ class Query(graphene.ObjectType):
189204
schema = graphene.Schema(query=Query)
190205
result = schema.execute(query)
191206
assert not result.errors
192-
assert dict(result.data['allEditors']) == expected['allEditors']
207+
assert result.data['allEditors'] == expected['allEditors']
193208

194209

195210
def test_should_filter_editors_by_id(fixtures):

0 commit comments

Comments
 (0)