Skip to content

Commit baa9c35

Browse files
authored
Merge pull request #5 from abawchen/feat-default-filter
Feat: Default filter behavior
2 parents 614a3c4 + 198beae commit baa9c35

File tree

3 files changed

+72
-5
lines changed

3 files changed

+72
-5
lines changed

graphene_mongo/fields.py

Lines changed: 31 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,13 @@
11
from __future__ import absolute_import
22

3-
from functools import partial
3+
from collections import OrderedDict
4+
from functools import partial, reduce
45

56
from graphene import Field
67
from graphene.relay import ConnectionField
78
from graphene.relay.connection import PageInfo
89
from graphql_relay.connection.arrayconnection import connection_from_list_slice
10+
from graphene.types.argument import to_arguments
911

1012
from .utils import maybe_queryset
1113

@@ -52,8 +54,36 @@ def node_type(self):
5254
def model(self):
5355
return self.node_type._meta.model
5456

57+
@property
58+
def args(self):
59+
return to_arguments(
60+
self._base_args or OrderedDict(), self.default_filter_args
61+
)
62+
63+
@args.setter
64+
def args(self, args):
65+
self._base_args = args
66+
67+
@property
68+
def default_filter_args(self):
69+
return reduce(
70+
lambda r, kv: r.update({kv[0]: kv[1]._type._of_type()}) or r if hasattr(kv[1], '_type') else r,
71+
self.fields.items(),
72+
{}
73+
)
74+
75+
@property
76+
def filter_fields(self):
77+
return self._type._meta.filter_fields
78+
79+
@property
80+
def fields(self):
81+
return self._type._meta.fields
82+
5583
@classmethod
5684
def get_query(cls, model, info, **args):
85+
if args:
86+
return model.objects().filter(**args)
5787
return model.objects()
5888

5989
@classmethod
@@ -84,6 +114,5 @@ def connection_resolver(cls, resolver, connection, model, root, info, **args):
84114
return connection
85115

86116
def get_resolver(self, parent_resolver):
87-
('??')
88117
return partial(self.connection_resolver, parent_resolver, self.type, self.model)
89118

graphene_mongo/tests/test_query.py

Lines changed: 39 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -292,9 +292,46 @@ class Mutation(graphene.ObjectType):
292292
assert not result.errors
293293
assert result.data == expected
294294

295-
# TODO:
295+
@with_local_registry
296296
def test_should_filter():
297-
pass
297+
class ArticleNode(MongoengineObjectType):
298+
299+
class Meta:
300+
model = Article
301+
interfaces = (Node,)
302+
filter_fields = ('headline',)
303+
304+
class Query(graphene.ObjectType):
305+
node = Node.Field()
306+
articles = MongoengineConnectionField(ArticleNode)
307+
308+
query = '''
309+
query ArticleQuery {
310+
articles(headline: "World") {
311+
edges {
312+
node {
313+
headline
314+
}
315+
}
316+
}
317+
}
318+
'''
319+
expected = {
320+
'articles': {
321+
'edges': [
322+
{
323+
'node': {
324+
'headline': 'World'
325+
}
326+
}
327+
]
328+
}
329+
}
330+
schema = graphene.Schema(query=Query)
331+
result = schema.execute(query)
332+
assert not result.errors
333+
assert result.data == expected
334+
298335

299336
# TODO:
300337
def test_should_paging():

graphene_mongo/types.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ class MongoengineObjectTypeOptions(ObjectTypeOptions):
3333
model = None # type: Model
3434
registry = None # type: Registry
3535
connection = None # type: Type[Connection]
36-
36+
filter_fields = ()
3737

3838
class MongoengineObjectType(ObjectType):
3939

@@ -78,6 +78,7 @@ def __init_subclass_with_meta__(cls, model=None, registry=None, skip_registry=Fa
7878
_meta.model = model
7979
_meta.registry = registry
8080
_meta.fields = mongoengine_fields
81+
_meta.filter_fields = filter_fields
8182
_meta.connection = connection
8283
super(MongoengineObjectType, cls).__init_subclass_with_meta__(
8384
_meta=_meta, interfaces=interfaces, **options

0 commit comments

Comments
 (0)