mirror of
https://github.com/graphql-python/graphene.git
synced 2025-02-02 20:54:16 +03:00
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:
parent
4f054b3640
commit
6e07ef0c38
|
@ -1,4 +1,5 @@
|
||||||
import six
|
import six
|
||||||
|
from django.conf import settings
|
||||||
from django.db import models
|
from django.db import models
|
||||||
from django_filters import Filter
|
from django_filters import Filter
|
||||||
from django_filters.filterset import FilterSetMetaclass, FilterSet
|
from django_filters.filterset import FilterSetMetaclass, FilterSet
|
||||||
|
@ -15,6 +16,9 @@ class GlobalIDFilter(Filter):
|
||||||
return super(GlobalIDFilter, self).filter(qs, gid.id)
|
return super(GlobalIDFilter, self).filter(qs, gid.id)
|
||||||
|
|
||||||
|
|
||||||
|
ORDER_BY_FIELD = getattr(settings, 'GRAPHENE_ORDER_BY_FIELD', 'order')
|
||||||
|
|
||||||
|
|
||||||
GRAPHENE_FILTER_SET_OVERRIDES = {
|
GRAPHENE_FILTER_SET_OVERRIDES = {
|
||||||
models.AutoField: {
|
models.AutoField: {
|
||||||
'filter_class': GlobalIDFilter,
|
'filter_class': GlobalIDFilter,
|
||||||
|
@ -45,7 +49,7 @@ class GrapheneFilterSet(six.with_metaclass(GrapheneFilterSetMetaclass, FilterSet
|
||||||
DjangoFilterConnectionField will wrap FilterSets with this class as
|
DjangoFilterConnectionField will wrap FilterSets with this class as
|
||||||
necessary
|
necessary
|
||||||
"""
|
"""
|
||||||
pass
|
order_by_field = ORDER_BY_FIELD
|
||||||
|
|
||||||
|
|
||||||
def setup_filterset(filterset_class):
|
def setup_filterset(filterset_class):
|
||||||
|
@ -54,7 +58,9 @@ def setup_filterset(filterset_class):
|
||||||
return type(
|
return type(
|
||||||
'Graphene{}'.format(filterset_class.__name__),
|
'Graphene{}'.format(filterset_class.__name__),
|
||||||
(six.with_metaclass(GrapheneFilterSetMetaclass, filterset_class),),
|
(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,
|
'model': model,
|
||||||
})
|
})
|
||||||
meta_class = type(str('Meta'), (object,), meta)
|
meta_class = type(str('Meta'), (object,), meta)
|
||||||
filterset = type(str('%sFilterSet' % model._meta.object_name),
|
filterset = type(
|
||||||
(filterset_base_class,), {'Meta': meta_class})
|
str('%sFilterSet' % model._meta.object_name),
|
||||||
|
(filterset_base_class,),
|
||||||
|
{
|
||||||
|
'Meta': meta_class
|
||||||
|
}
|
||||||
|
)
|
||||||
return filterset
|
return filterset
|
||||||
|
|
|
@ -24,27 +24,27 @@ class PetNode(DjangoNode):
|
||||||
|
|
||||||
|
|
||||||
def assert_arguments(field, *arguments):
|
def assert_arguments(field, *arguments):
|
||||||
ignore = ('after', 'before', 'first', 'last', 'o')
|
ignore = ('after', 'before', 'first', 'last', 'order')
|
||||||
actual = [
|
actual = [
|
||||||
name
|
name
|
||||||
for name in field.arguments.arguments.keys()
|
for name in field.arguments.arguments.keys()
|
||||||
if name not in ignore and not name.startswith('_')
|
if name not in ignore and not name.startswith('_')
|
||||||
]
|
]
|
||||||
assert set(arguments) == set(actual), \
|
assert set(arguments) == set(actual), \
|
||||||
'Expected arguments ({}) did not match actual ({])'.format(
|
'Expected arguments ({}) did not match actual ({})'.format(
|
||||||
arguments,
|
arguments,
|
||||||
actual
|
actual
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
def assert_orderable(field):
|
def assert_orderable(field):
|
||||||
assert 'o' in field.arguments.arguments.keys(), \
|
assert 'order' in field.arguments.arguments.keys(), \
|
||||||
'Field cannot be ordered'
|
'Field cannot be ordered'
|
||||||
|
|
||||||
|
|
||||||
def assert_not_orderable(field):
|
def assert_not_orderable(field):
|
||||||
assert 'o' in field.arguments.arguments.keys(), \
|
assert 'order' in field.arguments.arguments.keys(), \
|
||||||
'Field cannot be ordered'
|
'Field can be ordered'
|
||||||
|
|
||||||
|
|
||||||
def test_filter_explicit_filterset_arguments():
|
def test_filter_explicit_filterset_arguments():
|
||||||
|
|
|
@ -64,8 +64,7 @@ def test_filter_order():
|
||||||
resolver = FilterConnectionResolver(ArticleNode,
|
resolver = FilterConnectionResolver(ArticleNode,
|
||||||
filterset_class=ArticleFilter)
|
filterset_class=ArticleFilter)
|
||||||
resolved = resolver(inst=article, args={
|
resolved = resolver(inst=article, args={
|
||||||
# TODO: This should be 'order', not 'o'
|
'order': 'headline'
|
||||||
'o': 'headline'
|
|
||||||
}, info=None)
|
}, info=None)
|
||||||
assert 'WHERE' not in str(resolved.query)
|
assert 'WHERE' not in str(resolved.query)
|
||||||
assert 'ORDER BY' in str(resolved.query)
|
assert 'ORDER BY' in str(resolved.query)
|
||||||
|
@ -77,8 +76,7 @@ def test_filter_order_not_available():
|
||||||
resolver = FilterConnectionResolver(ReporterNode,
|
resolver = FilterConnectionResolver(ReporterNode,
|
||||||
filterset_class=ReporterFilter)
|
filterset_class=ReporterFilter)
|
||||||
resolved = resolver(inst=reporter, args={
|
resolved = resolver(inst=reporter, args={
|
||||||
# TODO: This should be 'order', not 'o'
|
'order': 'last_name'
|
||||||
'o': 'last_name'
|
|
||||||
}, info=None)
|
}, info=None)
|
||||||
assert 'WHERE' not in str(resolved.query)
|
assert 'WHERE' not in str(resolved.query)
|
||||||
assert 'ORDER BY' not in str(resolved.query)
|
assert 'ORDER BY' not in str(resolved.query)
|
||||||
|
|
Loading…
Reference in New Issue
Block a user