diff --git a/app/main/views/dashboard.py b/app/main/views/dashboard.py index 76425f3a8..81d1caeed 100644 --- a/app/main/views/dashboard.py +++ b/app/main/views/dashboard.py @@ -1,4 +1,6 @@ from datetime import date +from collections import namedtuple +from itertools import groupby from flask import ( render_template, @@ -90,12 +92,30 @@ def add_rates_to(delivery_statistics): def aggregate_usage(template_statistics): - import collections - stats = collections.OrderedDict() - for item in template_statistics: - stat = stats.get(item['template']['id']) - if stat: - stat['usage_count'] = stat['usage_count'] + item['usage_count'] - else: - stats[item['template']['id']] = item - return stats.values() + + immutable_template = namedtuple('Template', ['template_type', 'name', 'id']) + + # grouby requires the list to be sorted by template first + statistics_sorted_by_template = sorted( + ( + ( + immutable_template(**row['template']), + row['usage_count'] + ) + for row in template_statistics + ), + key=lambda items: items[0] + ) + + # then group and sort the result by usage + return sorted( + ( + { + 'usage_count': sum(usage[1] for usage in usages), + 'template': template + } + for template, usages in groupby(statistics_sorted_by_template, lambda items: items[0]) + ), + key=lambda row: row['usage_count'], + reverse=True + ) diff --git a/tests/app/main/views/test_dashboard.py b/tests/app/main/views/test_dashboard.py index 75183efb4..34c79627f 100644 --- a/tests/app/main/views/test_dashboard.py +++ b/tests/app/main/views/test_dashboard.py @@ -93,12 +93,12 @@ def test_should_show_recent_templates_on_dashboard(app_, first_row = page.tbody.find_all('tr')[0] table_data = first_row.find_all('td') assert len(table_data) == 3 - assert table_data[2].text.strip() == '13' + assert table_data[2].text.strip() == '206' second_row = page.tbody.find_all('tr')[1] table_data = second_row.find_all('td') assert len(table_data) == 3 - assert table_data[2].text.strip() == '206' + assert table_data[2].text.strip() == '13' def _test_dashboard_menu(mocker, app_, usr, service, permissions): @@ -277,7 +277,7 @@ def test_aggregate_template_stats(): assert len(expected) == 2 for item in expected: - if item['template']['id'] == 1: + if item['template'].id == 1: assert item['usage_count'] == 13 - elif item['template']['id'] == 2: + elif item['template'].id == 2: assert item['usage_count'] == 206