Merge pull request #431 from alphagov/sort-template-stats

Sort template stats by usage
This commit is contained in:
Chris Hill-Scott
2016-04-13 16:15:33 +01:00
2 changed files with 33 additions and 13 deletions

View File

@@ -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
)

View File

@@ -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