Skip to content

Commit 0b29a83

Browse files
authored
Merge pull request #64 from graphql-python/feat-take-point-type-more-properly
Feat: Take point type more properly
2 parents 277753e + 70414b7 commit 0b29a83

File tree

6 files changed

+98
-38
lines changed

6 files changed

+98
-38
lines changed

graphene_mongo/advanced_types.py

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
import graphene
2+
3+
4+
__all__ = [
5+
'PointFieldType'
6+
]
7+
8+
9+
def _resolve_point_type_coordinates(self, info):
10+
return self['coordinates']
11+
12+
13+
class PointFieldType(graphene.ObjectType):
14+
15+
type = graphene.String()
16+
coordinates = graphene.List(
17+
graphene.Float, resolver=_resolve_point_type_coordinates)
18+
19+
def resolve_type(self, info):
20+
return self['type']

graphene_mongo/converter.py

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515

1616
import mongoengine
1717

18+
from .advanced_types import PointFieldType
1819
from .fields import MongoengineConnectionField
1920
from .utils import import_single_dispatch
2021

@@ -60,11 +61,15 @@ def convert_field_to_float(field, registry=None):
6061

6162
@convert_mongoengine_field.register(mongoengine.DictField)
6263
@convert_mongoengine_field.register(mongoengine.MapField)
63-
@convert_mongoengine_field.register(mongoengine.PointField)
6464
def convert_dict_to_jsonstring(field, registry=None):
6565
return JSONString(description=field.db_field, required=field.required)
6666

6767

68+
@convert_mongoengine_field.register(mongoengine.PointField)
69+
def convert_point_to_field(field, register=None):
70+
return Field(PointFieldType)
71+
72+
6873
@convert_mongoengine_field.register(mongoengine.DateTimeField)
6974
def convert_field_to_datetime(field, registry=None):
7075
return DateTime(description=field.db_field, required=field.required)

graphene_mongo/fields.py

Lines changed: 8 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@
44
from collections import OrderedDict
55
from functools import partial, reduce
66

7-
from graphene import Field, List
87
from graphene.relay import ConnectionField
98
from graphene.relay.connection import PageInfo
109
from graphql_relay.connection.arrayconnection import connection_from_list_slice
@@ -13,28 +12,10 @@
1312
from graphene.types.dynamic import Dynamic
1413
from graphene.types.structures import Structure
1514

15+
from .advanced_types import PointFieldType
1616
from .utils import get_model_reference_fields
1717

1818

19-
# noqa
20-
class MongoengineListField(Field):
21-
22-
def __init__(self, _type, *args, **kwargs):
23-
super(MongoengineListField, self).__init__(
24-
List(_type), *args, **kwargs)
25-
26-
@property
27-
def model(self):
28-
return self.type.of_type._meta.node._meta.model
29-
30-
# @staticmethod
31-
# def list_resolver(resolver, root, info, **args):
32-
# return maybe_queryset(resolver(root, info, **args))
33-
34-
def get_resolver(self, parent_resolver):
35-
return partial(self.list_resolver, parent_resolver)
36-
37-
3819
class MongoengineConnectionField(ConnectionField):
3920

4021
def __init__(self, type, *args, **kwargs):
@@ -75,7 +56,13 @@ def args(self, args):
7556

7657
def _field_args(self, items):
7758
def is_filterable(v):
78-
return not isinstance(v, (ConnectionField, Dynamic))
59+
if isinstance(v, (ConnectionField, Dynamic)):
60+
return False
61+
# FIXME: Skip PointTypeField at this moment.
62+
if not isinstance(v.type, Structure) \
63+
and isinstance(v.type(), PointFieldType):
64+
return False
65+
return True
7966

8067
def get_type(v):
8168
if isinstance(v.type, Structure):

graphene_mongo/tests/test_converter.py

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,9 @@
11
import graphene
22
import mongoengine
33

4-
from graphene import Dynamic
5-
from graphene import Node
4+
from graphene import (
5+
Dynamic, Node
6+
)
67

78
from py.test import raises
89

@@ -78,12 +79,15 @@ def test_should_dict_convert_json():
7879
assert_conversion(mongoengine.DictField, graphene.JSONString)
7980

8081

81-
def test_should_map_convertjson():
82+
def test_should_map_convert_json():
8283
assert_conversion(mongoengine.MapField, graphene.JSONString, field=mongoengine.StringField())
8384

8485

85-
def test_should_point_convert_json():
86-
assert_conversion(mongoengine.PointField, graphene.JSONString)
86+
def test_should_point_convert_field():
87+
graphene_type = convert_mongoengine_field(mongoengine.PointField())
88+
assert isinstance(graphene_type, graphene.Field)
89+
assert isinstance(graphene_type.type.type, graphene.String)
90+
assert isinstance(graphene_type.type.coordinates, graphene.List)
8791

8892

8993
def test_should_field_convert_list():

graphene_mongo/tests/test_query.py

Lines changed: 47 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,10 @@
44

55
from .setup import fixtures
66
from .models import (
7-
Editor, Player, Reporter, ProfessorVector
7+
Child, Editor, Player, Reporter, ProfessorVector
88
)
99
from .types import (
10-
EditorType, PlayerType, ReporterType, ProfessorVectorType
10+
ChildType, EditorType, PlayerType, ReporterType, ProfessorVectorType
1111
)
1212

1313

@@ -265,3 +265,48 @@ def resolve_professor_vector(self, info, id):
265265
assert not result.errors
266266
assert json.dumps(result.data, sort_keys=True) == \
267267
json.dumps(expected, sort_keys=True)
268+
269+
270+
def test_should_query_child(fixtures):
271+
272+
class Query(graphene.ObjectType):
273+
274+
children = graphene.List(ChildType)
275+
276+
def resolve_children(self, *args, **kwargs):
277+
return list(Child.objects.all())
278+
279+
query = '''
280+
query Query {
281+
children {
282+
bar,
283+
baz,
284+
loc {
285+
type,
286+
coordinates
287+
}
288+
}
289+
}
290+
'''
291+
expected = {
292+
'children': [
293+
{
294+
'bar': 'BAR',
295+
'baz': 'BAZ',
296+
'loc': None
297+
}, {
298+
'bar': 'bar',
299+
'baz': 'baz',
300+
'loc': {
301+
'type': 'Point',
302+
'coordinates': [10.0, 20.0]
303+
}
304+
}
305+
]
306+
}
307+
308+
schema = graphene.Schema(query=Query)
309+
result = schema.execute(query)
310+
assert not result.errors
311+
assert json.dumps(result.data, sort_keys=True) == \
312+
json.dumps(expected, sort_keys=True)

graphene_mongo/tests/test_relay_query.py

Lines changed: 8 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -303,7 +303,10 @@ class Query(graphene.ObjectType):
303303
node {
304304
bar,
305305
baz,
306-
loc
306+
loc {
307+
type,
308+
coordinates
309+
}
307310
}
308311
}
309312
}
@@ -316,24 +319,20 @@ class Query(graphene.ObjectType):
316319
'node': {
317320
'bar': 'bar',
318321
'baz': 'baz',
322+
'loc': {
323+
'type': 'Point',
324+
'coordinates': [10.0, 20.0]
325+
}
319326
}
320327
}
321328
]
322329
}
323330
}
324-
loc = {
325-
'type': 'Point',
326-
'coordinates': [10, 20]
327-
}
328-
loc_json_string = json.dumps(loc, sort_keys=True)
329331
schema = graphene.Schema(query=Query)
330-
331332
result = schema.execute(query)
332-
result_loc = json.loads(result.data['children']['edges'][0]['node'].pop('loc'))
333333
assert not result.errors
334334
assert json.dumps(result.data, sort_keys=True) == json.dumps(
335335
expected, sort_keys=True)
336-
assert json.dumps(result_loc, sort_keys=True) == loc_json_string
337336

338337

339338
def test_should_get_node_by_id(fixtures):

0 commit comments

Comments
 (0)