Ordering parameter now called 'order' rather than 'o'

This can be customsied via the GRAPHENE_ORDER_BY_FIELD setting,
or by extending GrapheneFilterSet.

I'm open to this being called 'order_by'.
This commit is contained in:
Adam Charnock 2015-12-03 21:07:44 +00:00
parent 4f054b3640
commit 6e07ef0c38
3 changed files with 22 additions and 13 deletions

View File

@ -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

View File

@ -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():

View File

@ -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)