traviscline (owner)

Revisions

gist: 30397 Download_button fork
public
Public Clone URL: git://gist.github.com/30397.git
Embed All Files: show embed
Diff #
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
diff --git a/contrib/admin/views/main.py b/contrib/admin/views/main.py
index 1051648..7c7385d 100644
--- a/contrib/admin/views/main.py
+++ b/contrib/admin/views/main.py
@@ -62,7 +62,7 @@ class ChangeList(object):
         if ERROR_FLAG in self.params:
             del self.params[ERROR_FLAG]
 
- self.order_field, self.order_type = self.get_ordering()
+ self.order_field, self.order_type = self.get_order_field_and_type()
         self.query = request.GET.get(SEARCH_VAR, '')
         self.query_set = self.get_query_set()
         self.get_results(request)
@@ -129,6 +129,14 @@ class ChangeList(object):
         self.multi_page = multi_page
         self.paginator = paginator
 
+ def get_order_field_and_type(self):
+ field = self.ordering[0]
+ type = 'asc'
+ if field[0] == '-':
+ type = 'desc'
+ field = field[1:]
+ return field, type
+
     def get_ordering(self):
         lookup_opts, params = self.lookup_opts, self.params
         # For ordering, first check the "ordering" parameter in the admin
@@ -136,11 +144,7 @@ class ChangeList(object):
         # those exist, order descending by ID by default. Finally, look for
         # manually-specified ordering from the query string.
         ordering = self.model_admin.ordering or lookup_opts.ordering or ['-' + lookup_opts.pk.name]
-
- if ordering[0].startswith('-'):
- order_field, order_type = ordering[0][1:], 'desc'
- else:
- order_field, order_type = ordering[0], 'asc'
+
         if ORDER_VAR in params:
             try:
                 field_name = self.list_display[int(params[ORDER_VAR])]
@@ -163,9 +167,11 @@ class ChangeList(object):
                     order_field = f.name
             except (IndexError, ValueError):
                 pass # Invalid ordering specified. Just use the default.
- if ORDER_TYPE_VAR in params and params[ORDER_TYPE_VAR] in ('asc', 'desc'):
- order_type = params[ORDER_TYPE_VAR]
- return order_field, order_type
+ if ORDER_TYPE_VAR in params and params[ORDER_TYPE_VAR] == 'desc':
+ order_field = '-%s' % order_field
+ ordering = [order_field] + ordering
+ return ordering
+ ordering = property(get_ordering)
 
     def get_query_set(self):
         qs = self.root_query_set
@@ -211,8 +217,7 @@ class ChangeList(object):
                         break
 
         # Set ordering.
- if self.order_field:
- qs = qs.order_by('%s%s' % ((self.order_type == 'desc' and '-' or ''), self.order_field))
+ qs = qs.order_by(*self.ordering)
 
         # Apply keyword searches.
         def construct_search(field_name):