summaryrefslogtreecommitdiff
path: root/django
diff options
context:
space:
mode:
authorAndrew Kuchev <0coming.soon@gmail.com>2015-11-05 15:59:56 +0500
committerTim Graham <timograham@gmail.com>2016-02-23 12:15:08 -0500
commite81d1c995c0cc5573d3627de0fe6b803b2f43fb2 (patch)
tree1b596d09984d0bd284124bce3a502220094f2174 /django
parentcdbd8745f6c550422170a6ae5928c0b679fab0df (diff)
Fixed #25670 -- Allowed dictsort to sort a list of lists.
Thanks Tim Graham for the review.
Diffstat (limited to 'django')
-rw-r--r--django/template/defaultfilters.py31
-rw-r--r--django/views/debug.py10
2 files changed, 34 insertions, 7 deletions
diff --git a/django/template/defaultfilters.py b/django/template/defaultfilters.py
index 1d0c6c6d22..a7c9b718ff 100644
--- a/django/template/defaultfilters.py
+++ b/django/template/defaultfilters.py
@@ -5,6 +5,7 @@ import random as random_module
import re
from decimal import ROUND_HALF_UP, Context, Decimal, InvalidOperation
from functools import wraps
+from operator import itemgetter
from pprint import pformat
from django.utils import formats, six
@@ -510,6 +511,32 @@ def striptags(value):
# LISTS #
###################
+def _property_resolver(arg):
+ """
+ When arg is convertible to float, behave like operator.itemgetter(arg)
+ Otherwise, behave like Variable(arg).resolve
+
+ >>> _property_resolver(1)('abc')
+ 'b'
+ >>> _property_resolver('1')('abc')
+ Traceback (most recent call last):
+ ...
+ TypeError: string indices must be integers
+ >>> class Foo:
+ ... a = 42
+ ... b = 3.14
+ ... c = 'Hey!'
+ >>> _property_resolver('b')(Foo())
+ 3.14
+ """
+ try:
+ float(arg)
+ except ValueError:
+ return Variable(arg).resolve
+ else:
+ return itemgetter(arg)
+
+
@register.filter(is_safe=False)
def dictsort(value, arg):
"""
@@ -517,7 +544,7 @@ def dictsort(value, arg):
the argument.
"""
try:
- return sorted(value, key=Variable(arg).resolve)
+ return sorted(value, key=_property_resolver(arg))
except (TypeError, VariableDoesNotExist):
return ''
@@ -529,7 +556,7 @@ def dictsortreversed(value, arg):
property given in the argument.
"""
try:
- return sorted(value, key=Variable(arg).resolve, reverse=True)
+ return sorted(value, key=_property_resolver(arg), reverse=True)
except (TypeError, VariableDoesNotExist):
return ''
diff --git a/django/views/debug.py b/django/views/debug.py
index 4445990c74..ffd16622ac 100644
--- a/django/views/debug.py
+++ b/django/views/debug.py
@@ -813,7 +813,7 @@ TECHNICAL_500_TEMPLATE = ("""
</tr>
</thead>
<tbody>
- {% for var in frame.vars|dictsort:"0" %}
+ {% for var in frame.vars|dictsort:0 %}
<tr>
<td>{{ var.0|force_escape }}</td>
<td class="code"><pre>{{ var.1 }}</pre></td>
@@ -995,7 +995,7 @@ Exception Value: {{ exception_value|force_escape }}
</tr>
</thead>
<tbody>
- {% for var in request.META.items|dictsort:"0" %}
+ {% for var in request.META.items|dictsort:0 %}
<tr>
<td>{{ var.0 }}</td>
<td class="code"><pre>{{ var.1|pprint }}</pre></td>
@@ -1017,7 +1017,7 @@ Exception Value: {{ exception_value|force_escape }}
</tr>
</thead>
<tbody>
- {% for var in settings.items|dictsort:"0" %}
+ {% for var in settings.items|dictsort:0 %}
<tr>
<td>{{ var.0 }}</td>
<td class="code"><pre>{{ var.1|pprint }}</pre></td>
@@ -1107,12 +1107,12 @@ FILES:{% for k, v in request.FILES.items %}
COOKIES:{% for k, v in request.COOKIES.items %}
{{ k }} = {{ v|stringformat:"r" }}{% empty %} No cookie data{% endfor %}
-META:{% for k, v in request.META.items|dictsort:"0" %}
+META:{% for k, v in request.META.items|dictsort:0 %}
{{ k }} = {{ v|stringformat:"r" }}{% endfor %}
{% else %}Request data not supplied
{% endif %}
Settings:
-Using settings module {{ settings.SETTINGS_MODULE }}{% for k, v in settings.items|dictsort:"0" %}
+Using settings module {{ settings.SETTINGS_MODULE }}{% for k, v in settings.items|dictsort:0 %}
{{ k }} = {{ v|stringformat:"r" }}{% endfor %}
{% if not is_email %}