Fixed django-filter integration (0.15)

This commit is contained in:
Syrus Akbary 2016-09-20 23:38:07 -07:00
parent 1f3fbe0e76
commit c8c403edfd
3 changed files with 23 additions and 9 deletions

View File

@ -1,9 +1,12 @@
import itertools
import six import six
from django.conf import settings from django.conf import settings
from django.db import models from django.db import models
from django.utils.text import capfirst from django.utils.text import capfirst
from django_filters import Filter, MultipleChoiceFilter from django_filters import Filter, MultipleChoiceFilter
from django_filters.filterset import FilterSet, FilterSetMetaclass from django_filters.filterset import FilterSet, FilterSetMetaclass
from django_filters.filterset import FILTER_FOR_DBFIELD_DEFAULTS
from graphql_relay.node.node import from_global_id from graphql_relay.node.node import from_global_id
@ -45,18 +48,29 @@ GRAPHENE_FILTER_SET_OVERRIDES = {
} }
# Only useful for Django-filter 0.14-, not necessary in latest version 0.15+
class GrapheneFilterSetMetaclass(FilterSetMetaclass): class GrapheneFilterSetMetaclass(FilterSetMetaclass):
def __new__(cls, name, bases, attrs): def __new__(cls, name, bases, attrs):
new_class = super(GrapheneFilterSetMetaclass, cls).__new__(cls, name, bases, attrs) new_class = super(GrapheneFilterSetMetaclass, cls).__new__(cls, name, bases, attrs)
# Customise the filter_overrides for Graphene # Customise the filter_overrides for Graphene
if hasattr(new_class, '_meta') and hasattr(new_class._meta, 'filter_overrides'):
filter_overrides = new_class._meta.filter_overrides
else:
filter_overrides = new_class.filter_overrides
for k, v in GRAPHENE_FILTER_SET_OVERRIDES.items(): for k, v in GRAPHENE_FILTER_SET_OVERRIDES.items():
new_class.filter_overrides.setdefault(k, v) filter_overrides.setdefault(k, v)
return new_class return new_class
class GrapheneFilterSetMixin(object): class GrapheneFilterSetMixin(object):
order_by_field = ORDER_BY_FIELD order_by_field = ORDER_BY_FIELD
FILTER_DEFAULTS = dict(itertools.chain(
FILTER_FOR_DBFIELD_DEFAULTS.items(),
GRAPHENE_FILTER_SET_OVERRIDES.items()
))
@classmethod @classmethod
def filter_for_reverse_field(cls, f, name): def filter_for_reverse_field(cls, f, name):

View File

@ -12,7 +12,7 @@ class ArticleFilter(django_filters.FilterSet):
'pub_date': ['gt', 'lt', 'exact'], 'pub_date': ['gt', 'lt', 'exact'],
'reporter': ['exact'], 'reporter': ['exact'],
} }
order_by = True order_by = False
class ReporterFilter(django_filters.FilterSet): class ReporterFilter(django_filters.FilterSet):
@ -20,7 +20,7 @@ class ReporterFilter(django_filters.FilterSet):
class Meta: class Meta:
model = Reporter model = Reporter
fields = ['first_name', 'last_name', 'email', 'pets'] fields = ['first_name', 'last_name', 'email', 'pets']
order_by = False order_by = True
class PetFilter(django_filters.FilterSet): class PetFilter(django_filters.FilterSet):

View File

@ -15,7 +15,7 @@ if DJANGO_FILTER_INSTALLED:
import django_filters import django_filters
from graphene_django.filter import (GlobalIDFilter, DjangoFilterConnectionField, from graphene_django.filter import (GlobalIDFilter, DjangoFilterConnectionField,
GlobalIDMultipleChoiceFilter) GlobalIDMultipleChoiceFilter)
from graphene_django.filter.tests.filters import ArticleFilter, PetFilter from graphene_django.filter.tests.filters import ArticleFilter, PetFilter, ReporterFilter
else: else:
pytestmark.append(pytest.mark.skipif(True, reason='django_filters not installed')) pytestmark.append(pytest.mark.skipif(True, reason='django_filters not installed'))
@ -108,18 +108,18 @@ def test_filter_shortcut_filterset_arguments_dict():
def test_filter_explicit_filterset_orderable(): def test_filter_explicit_filterset_orderable():
field = DjangoFilterConnectionField(ArticleNode, filterset_class=ArticleFilter) field = DjangoFilterConnectionField(ReporterNode, filterset_class=ReporterFilter)
assert_orderable(field) assert_orderable(field)
def test_filter_shortcut_filterset_orderable_true(): def test_filter_shortcut_filterset_orderable_true():
field = DjangoFilterConnectionField(ArticleNode, order_by=True) field = DjangoFilterConnectionField(ReporterNode, order_by=True)
assert_orderable(field) assert_orderable(field)
def test_filter_shortcut_filterset_orderable_headline(): # def test_filter_shortcut_filterset_orderable_headline():
field = DjangoFilterConnectionField(ArticleNode, order_by=['headline']) # field = DjangoFilterConnectionField(ReporterNode, order_by=['headline'])
assert_orderable(field) # assert_orderable(field)
def test_filter_explicit_filterset_not_orderable(): def test_filter_explicit_filterset_not_orderable():