mirror of
https://github.com/graphql-python/graphene.git
synced 2024-11-27 03:53:56 +03:00
DjangoFilterConnectionField now accepts fields, order_by, and extra_filter_meta
This commit is contained in:
parent
7bfeb086a4
commit
49258827f8
|
@ -1,7 +1,7 @@
|
||||||
import warnings
|
import warnings
|
||||||
|
|
||||||
import six
|
import six
|
||||||
|
from django_filters import FilterSet
|
||||||
|
|
||||||
from ...core.exceptions import SkipField
|
from ...core.exceptions import SkipField
|
||||||
from ...core.fields import Field
|
from ...core.fields import Field
|
||||||
|
@ -66,12 +66,36 @@ class DjangoModelField(FieldType):
|
||||||
return get_type_for_model(schema, self.model)
|
return get_type_for_model(schema, self.model)
|
||||||
|
|
||||||
|
|
||||||
|
def custom_filterset_factory(model, filter_base_class=FilterSet, **meta):
|
||||||
|
meta.update({
|
||||||
|
'model': model,
|
||||||
|
})
|
||||||
|
meta_class = type(str('Meta'), (object,), meta)
|
||||||
|
filterset = type(str('%sFilterSet' % model._meta.object_name),
|
||||||
|
(filter_base_class,), {'Meta': meta_class})
|
||||||
|
return filterset
|
||||||
|
|
||||||
|
|
||||||
class DjangoFilterConnectionField(DjangoConnectionField):
|
class DjangoFilterConnectionField(DjangoConnectionField):
|
||||||
|
|
||||||
def __init__(self, type, filterset_class, resolver=None, on=None, *args, **kwargs):
|
def __init__(self, type, filterset_class=None, resolver=None, on=None,
|
||||||
|
fields=None, order_by=None, extra_filter_meta=None,
|
||||||
|
*args, **kwargs):
|
||||||
if not resolver:
|
if not resolver:
|
||||||
resolver = FilterConnectionResolver(type, on, filterset_class)
|
resolver = FilterConnectionResolver(type, on, filterset_class)
|
||||||
|
|
||||||
|
if not filterset_class:
|
||||||
|
# If no filter class is specified then create one given the
|
||||||
|
# information provided
|
||||||
|
meta = dict(
|
||||||
|
model=type._meta.model,
|
||||||
|
fields=fields,
|
||||||
|
order_by=order_by,
|
||||||
|
)
|
||||||
|
if extra_filter_meta:
|
||||||
|
meta.update(extra_filter_meta)
|
||||||
|
filterset_class = custom_filterset_factory(**meta)
|
||||||
|
|
||||||
kwargs.setdefault('args', {})
|
kwargs.setdefault('args', {})
|
||||||
kwargs['args'].update(**self.get_filtering_args(type, filterset_class))
|
kwargs['args'].update(**self.get_filtering_args(type, filterset_class))
|
||||||
super(DjangoFilterConnectionField, self).__init__(type, resolver, *args, **kwargs)
|
super(DjangoFilterConnectionField, self).__init__(type, resolver, *args, **kwargs)
|
||||||
|
|
|
@ -46,11 +46,47 @@ def test_filter_explicit_filterset_arguments():
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
def test_filter_shortcut_filterset_arguments_list():
|
||||||
|
field = DjangoFilterConnectionField(ArticleNode, fields=['pub_date', 'reporter'])
|
||||||
|
assert_arguments(field,
|
||||||
|
'pubDate',
|
||||||
|
'reporter',
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
def test_filter_shortcut_filterset_arguments_dict():
|
||||||
|
field = DjangoFilterConnectionField(ArticleNode, fields={
|
||||||
|
'headline': ['exact', 'icontains'],
|
||||||
|
'reporter': ['exact'],
|
||||||
|
})
|
||||||
|
assert_arguments(field,
|
||||||
|
'headline', 'headlineIcontains',
|
||||||
|
'reporter',
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
def test_filter_explicit_filterset_orderable():
|
def test_filter_explicit_filterset_orderable():
|
||||||
field = DjangoFilterConnectionField(ArticleNode, filterset_class=ArticleFilter)
|
field = DjangoFilterConnectionField(ArticleNode, filterset_class=ArticleFilter)
|
||||||
assert_orderable(field)
|
assert_orderable(field)
|
||||||
|
|
||||||
|
|
||||||
|
def test_filter_shortcut_filterset_orderable_true():
|
||||||
|
field = DjangoFilterConnectionField(ArticleNode, order_by=True)
|
||||||
|
assert_orderable(field)
|
||||||
|
|
||||||
|
|
||||||
|
def test_filter_shortcut_filterset_orderable_headline():
|
||||||
|
field = DjangoFilterConnectionField(ArticleNode, order_by=['headline'])
|
||||||
|
assert_orderable(field)
|
||||||
|
|
||||||
|
|
||||||
def test_filter_explicit_filterset_not_orderable():
|
def test_filter_explicit_filterset_not_orderable():
|
||||||
field = DjangoFilterConnectionField(PetNode, filterset_class=PetFilter)
|
field = DjangoFilterConnectionField(PetNode, filterset_class=PetFilter)
|
||||||
assert_not_orderable(field)
|
assert_not_orderable(field)
|
||||||
|
|
||||||
|
|
||||||
|
def test_filter_shortcut_filterset_extra_meta():
|
||||||
|
field = DjangoFilterConnectionField(ArticleNode, extra_filter_meta={
|
||||||
|
'ordering': True
|
||||||
|
})
|
||||||
|
assert_orderable(field)
|
||||||
|
|
Loading…
Reference in New Issue
Block a user