From 6e07ef0c3846e2cabe8b448c7786af859f49ab93 Mon Sep 17 00:00:00 2001
From: Adam Charnock <adam@adamcharnock.com>
Date: Thu, 3 Dec 2015 21:07:44 +0000
Subject: [PATCH] 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'.
---
 graphene/contrib/django/filter/filterset.py   | 19 +++++++++++++++----
 .../django/tests/filter/test_fields.py        | 10 +++++-----
 .../django/tests/filter/test_resolvers.py     |  6 ++----
 3 files changed, 22 insertions(+), 13 deletions(-)

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)