Skip to content

Commit ccfe884

Browse files
authored
Merge pull request #103 from eduarde/basic_custom_query_filters
Basic custom query filters
2 parents 3617415 + 478d175 commit ccfe884

File tree

4 files changed

+56
-3
lines changed

4 files changed

+56
-3
lines changed

graphene_mongo/fields.py

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,7 @@ def registry(self):
5959
def args(self):
6060
return to_arguments(
6161
self._base_args or OrderedDict(),
62-
dict(self.field_args, **self.reference_args)
62+
dict(dict(self.field_args, **self.reference_args), **self.filter_args)
6363
)
6464

6565
@args.setter
@@ -104,6 +104,17 @@ def get_type(v):
104104
def field_args(self):
105105
return self._field_args(self.fields.items())
106106

107+
@property
108+
def filter_args(self):
109+
filter_args = dict()
110+
if self._type._meta.filter_fields:
111+
for field, filter_collection in self._type._meta.filter_fields.items():
112+
for each in filter_collection:
113+
filter_args[field + "__" + each] = graphene.Argument(
114+
type=getattr(graphene, str(self._type._meta.fields[field].type).replace("!", "")))
115+
116+
return filter_args
117+
107118
@property
108119
def reference_args(self):
109120

graphene_mongo/tests/nodes.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,8 @@ class PlayerNode(MongoengineObjectType):
4242
class Meta:
4343
model = models.Player
4444
interfaces = (Node, )
45+
filter_fields = {
46+
'first_name': ['istartswith']}
4547

4648

4749
class ReporterNode(MongoengineObjectType):

graphene_mongo/tests/test_converter.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -330,3 +330,4 @@ class Meta:
330330
Reporter._fields['generic_reference'], registry.get_global_registry())
331331
assert isinstance(generic_reference_field, graphene.Field)
332332
assert isinstance(generic_reference_field.type(), graphene.Union)
333+
assert generic_reference_field.type()._meta.types == (A, E)

graphene_mongo/tests/test_relay_query.py

Lines changed: 41 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
1-
import base64
21
import os
2+
import json
33
import pytest
4-
4+
import base64
55
import graphene
66

77
from graphene.relay import Node
@@ -1038,3 +1038,42 @@ class Query(graphene.ObjectType):
10381038
result = schema.execute(query)
10391039
assert not result.errors
10401040
assert result.data == expected
1041+
1042+
1043+
def test_should_filter_mongoengine_queryset(fixtures):
1044+
1045+
class Query(graphene.ObjectType):
1046+
players = MongoengineConnectionField(nodes.PlayerNode)
1047+
1048+
query = '''
1049+
query players {
1050+
players(firstName_Istartswith: "M") {
1051+
edges {
1052+
node {
1053+
firstName
1054+
}
1055+
}
1056+
}
1057+
}
1058+
'''
1059+
expected = {
1060+
'players': {
1061+
'edges': [
1062+
{
1063+
'node': {
1064+
'firstName': 'Michael',
1065+
}
1066+
},
1067+
{
1068+
'node': {
1069+
'firstName': 'Magic'
1070+
}
1071+
}
1072+
]
1073+
}
1074+
}
1075+
schema = graphene.Schema(query=Query)
1076+
result = schema.execute(query)
1077+
1078+
assert not result.errors
1079+
assert json.dumps(result.data, sort_keys=True) == json.dumps(expected, sort_keys=True)

0 commit comments

Comments
 (0)