Skip to content

Commit e7764ba

Browse files
committed
Refactor SortedDataNode with new sort_queryset method()
Inspired by #2
1 parent 7786192 commit e7764ba

File tree

1 file changed

+35
-32
lines changed

1 file changed

+35
-32
lines changed

webstack_django_sorting/templatetags/sorting_tags.py

Lines changed: 35 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -151,6 +151,34 @@ def need_python_sorting(self, queryset, ordering):
151151

152152
return field not in field_names
153153

154+
def sort_queryset(self, queryset, ordering):
155+
if not ordering:
156+
return queryset
157+
158+
if queryset.exists():
159+
if self.need_python_sorting(queryset, ordering):
160+
# Fallback on pure Python sorting (much slower on large data)
161+
162+
# The field name can be prefixed by the minus sign and we need to
163+
# extract this information if we want to sort on simple object
164+
# attributes (non-model fields)
165+
if ordering[0] == '-':
166+
if len(ordering) == 1:
167+
# Prefix without field name
168+
raise template.TemplateSyntaxError
169+
170+
reverse = True
171+
name = ordering[1:]
172+
else:
173+
reverse = False
174+
name = ordering
175+
if hasattr(queryset[0], name):
176+
return sorted(queryset, key=attrgetter(name), reverse=reverse)
177+
else:
178+
raise AttributeError()
179+
else:
180+
return queryset.order_by(ordering)
181+
154182
def render(self, context):
155183
if self.context_var is not None:
156184
key = self.context_var
@@ -160,38 +188,13 @@ def render(self, context):
160188
queryset = self.queryset_var.resolve(context)
161189
ordering = get_sort_field(context['request'])
162190

163-
if ordering:
164-
try:
165-
if queryset.exists():
166-
if self.need_python_sorting(queryset, ordering):
167-
# Fallback on pure Python sorting (much slower on large data)
168-
169-
# The field name can be prefixed by the minus sign and we need to
170-
# extract this information if we want to sort on simple object
171-
# attributes (non-model fields)
172-
if ordering[0] == '-':
173-
if len(ordering) == 1:
174-
raise template.TemplateSyntaxError
175-
176-
reverse = True
177-
name = ordering[1:]
178-
else:
179-
reverse = False
180-
name = ordering
181-
if hasattr(queryset[0], name):
182-
context[key] = sorted(queryset, key=attrgetter(name), reverse=reverse)
183-
else:
184-
raise AttributeError()
185-
else:
186-
context[key] = queryset.order_by(ordering)
187-
except (template.TemplateSyntaxError, AttributeError):
188-
# Seems spurious to me...
189-
if INVALID_FIELD_RAISES_404:
190-
raise Http404(
191-
'Invalid field sorting. If DEBUG were set to '
192-
'False, an HTTP 404 page would have been shown instead.')
193-
context[key] = queryset
194-
else:
191+
try:
192+
context[key] = self.sort_queryset(queryset, ordering)
193+
except (template.TemplateSyntaxError, AttributeError):
194+
if INVALID_FIELD_RAISES_404:
195+
raise Http404(
196+
'Invalid field sorting. If DEBUG were set to '
197+
'False, an HTTP 404 page would have been shown instead.')
195198
context[key] = queryset
196199

197200
return u''

0 commit comments

Comments
 (0)