diff --git a/graphene/contrib/django/filter/filterset.py b/graphene/contrib/django/filter/filterset.py index 4345c34b..430c0eb4 100644 --- a/graphene/contrib/django/filter/filterset.py +++ b/graphene/contrib/django/filter/filterset.py @@ -1,4 +1,5 @@ import six +from django.conf import settings from django.db import models from django_filters import Filter from django_filters.filterset import FilterSetMetaclass, FilterSet @@ -15,6 +16,9 @@ class GlobalIDFilter(Filter): return super(GlobalIDFilter, self).filter(qs, gid.id) +ORDER_BY_FIELD = getattr(settings, 'GRAPHENE_ORDER_BY_FIELD', 'order') + + GRAPHENE_FILTER_SET_OVERRIDES = { models.AutoField: { 'filter_class': GlobalIDFilter, @@ -45,7 +49,7 @@ class GrapheneFilterSet(six.with_metaclass(GrapheneFilterSetMetaclass, FilterSet DjangoFilterConnectionField will wrap FilterSets with this class as necessary """ - pass + order_by_field = ORDER_BY_FIELD def setup_filterset(filterset_class): @@ -54,7 +58,9 @@ def setup_filterset(filterset_class): return type( 'Graphene{}'.format(filterset_class.__name__), (six.with_metaclass(GrapheneFilterSetMetaclass, filterset_class),), - {}, + { + 'order_by_field': ORDER_BY_FIELD + }, ) @@ -66,6 +72,11 @@ def custom_filterset_factory(model, filterset_base_class=GrapheneFilterSet, 'model': model, }) meta_class = type(str('Meta'), (object,), meta) - filterset = type(str('%sFilterSet' % model._meta.object_name), - (filterset_base_class,), {'Meta': meta_class}) + filterset = type( + str('%sFilterSet' % model._meta.object_name), + (filterset_base_class,), + { + 'Meta': meta_class + } + ) return filterset diff --git a/graphene/contrib/django/tests/filter/test_fields.py b/graphene/contrib/django/tests/filter/test_fields.py index 011c82c0..14170977 100644 --- a/graphene/contrib/django/tests/filter/test_fields.py +++ b/graphene/contrib/django/tests/filter/test_fields.py @@ -24,27 +24,27 @@ class PetNode(DjangoNode): def assert_arguments(field, *arguments): - ignore = ('after', 'before', 'first', 'last', 'o') + ignore = ('after', 'before', 'first', 'last', 'order') actual = [ name for name in field.arguments.arguments.keys() if name not in ignore and not name.startswith('_') ] assert set(arguments) == set(actual), \ - 'Expected arguments ({}) did not match actual ({])'.format( + 'Expected arguments ({}) did not match actual ({})'.format( arguments, actual ) def assert_orderable(field): - assert 'o' in field.arguments.arguments.keys(), \ + assert 'order' in field.arguments.arguments.keys(), \ 'Field cannot be ordered' def assert_not_orderable(field): - assert 'o' in field.arguments.arguments.keys(), \ - 'Field cannot be ordered' + assert 'order' in field.arguments.arguments.keys(), \ + 'Field can be ordered' def test_filter_explicit_filterset_arguments(): diff --git a/graphene/contrib/django/tests/filter/test_resolvers.py b/graphene/contrib/django/tests/filter/test_resolvers.py index 78bc77cd..af8bfc47 100644 --- a/graphene/contrib/django/tests/filter/test_resolvers.py +++ b/graphene/contrib/django/tests/filter/test_resolvers.py @@ -64,8 +64,7 @@ def test_filter_order(): resolver = FilterConnectionResolver(ArticleNode, filterset_class=ArticleFilter) resolved = resolver(inst=article, args={ - # TODO: This should be 'order', not 'o' - 'o': 'headline' + 'order': 'headline' }, info=None) assert 'WHERE' not in str(resolved.query) assert 'ORDER BY' in str(resolved.query) @@ -77,8 +76,7 @@ def test_filter_order_not_available(): resolver = FilterConnectionResolver(ReporterNode, filterset_class=ReporterFilter) resolved = resolver(inst=reporter, args={ - # TODO: This should be 'order', not 'o' - 'o': 'last_name' + 'order': 'last_name' }, info=None) assert 'WHERE' not in str(resolved.query) assert 'ORDER BY' not in str(resolved.query)