I have prepared an implementation of sort_by_keys
filter:
{% for donation in donations|sort_by_keys:'date,-value' %}
<img src="{{ donation.stamp_img_url }}" />
{% endfor %}
Example data:
donations = [
{
date: '29-07-2014',
value: 150,
},
{
date: '07-10-2014',
value: 450,
},
{
date: '29-07-2014',
value: 500,
},
]
Expected result:
donations|sort_by_keys:'date,-value'
Should return:
[
{
date: '29-07-2014',
value: 500,
},
{
date: '29-07-2014',
value: 150,
},
{
date: '07-10-2014',
value: 450,
},
]
My implementation:
@register.filter
def sort_by_keys(value, keys):
_list = list(value)
def compare(item1, item2):
for key in item1.__keys_for_sort.split(','):
if key.startswith('-'):
key = key.replace('-', '')
if getattr(item1, key) > getattr(item2, key):
return -1
elif getattr(item1, key) < getattr(item2, key):
return 1
else:
if getattr(item1, key) < getattr(item2, key):
return -1
elif getattr(item1, key) > getattr(item2, key):
return 1
return 0
for item in _list:
setattr(item, '__keys_for_sort', keys)
_list = sorted(_list, cmp=compare)
for item in _list:
delattr(item, '__keys_for_sort')
return _list
I really don't like the idea of injection special attributes like __keys_for_sort
, to have possibility of using this value in comparator, but I don't know how to write this better.