Show usage count on uploads page

Because we’re be grouping jobs under their parent contact lists it’s
good to have some information ‘scent’ to help people find their jobs,
ie by clicking into a contact list. It also lets you see which list have
been used more than others, maybe because the update hasn’t been sent
to that group of people yet.

The hint text under uploads always says when they were used. For contact
lists this is a bit more complicated, since they can:
- never have been used
- been used multiple times

This commit makes use of the new fields being returned by the API to say
determine when these messages are relevant. They also let us
differentiate between a contact list that’s never been used, and one
that has been used, but not recently enough to show any jobs against it.
This commit is contained in:
Chris Hill-Scott
2020-11-30 13:54:54 +00:00
parent 423875011c
commit 45b60e9555
6 changed files with 49 additions and 16 deletions
+2
View File
@@ -24,6 +24,8 @@ class ContactList(JSONModel):
ALLOWED_PROPERTIES = {
'id',
'created_by',
'has_jobs',
'recent_job_count',
'service_id',
'original_file_name',
'row_count',
+13 -5
View File
@@ -1,6 +1,6 @@
{% from "components/table.html" import list_table, field, right_aligned_field_heading, row_heading %}
{% from "components/big-number.html" import big_number -%}
{% from "components/message-count-label.html" import message_count_label, recipient_count_label -%}
{% from "components/message-count-label.html" import message_count_label, recipient_count_label, iteration_count -%}
<div class='dashboard-table ajax-block-container'>
{% call(item, row_number) list_table(
@@ -35,10 +35,18 @@
</span>
{% elif item.upload_type == 'contact_list' %}
<span class="file-list-hint-large">
Uploaded {{
item.created_at|format_datetime_relative
}}
</span>
{% if item.recent_job_count %}
Used {{ iteration_count(item.recent_job_count) }}
in the last
{{ current_service.get_days_of_retention(item.template_type) }}
days
{% elif item.has_jobs %}
Not used in the last
{{ current_service.get_days_of_retention(item.template_type) }}
days
{% else %}
Not used yet
{% endif %}
{% elif item.upload_type == 'letter_day' %}
<span class="file-list-hint-large">
{{ item.letter_printing_statement }}
+9 -8
View File
@@ -4174,21 +4174,21 @@ def test_redirects_to_template_if_job_exists_already(
@pytest.mark.parametrize((
'template_type, '
'expected_list_id, '
'expected_filename, '
'expected_filenames, '
'expected_time, '
'expected_count'
), (
(
'email',
'6ce466d0-fd6a-11e5-82f5-e0accb9d11a6',
'EmergencyContactList.xls',
['EmergencyContactList.xls'],
'Uploaded today at 10:59am',
'100 email addresses',
),
(
'sms',
'd7b0bd1a-d1c7-4621-be5c-3c1b4278a2ad',
'phone number list.csv',
['phone number list.csv', 'UnusedList.tsv'],
'Uploaded today at 1:00pm',
'123 phone numbers',
),
@@ -4201,7 +4201,7 @@ def test_choose_from_contact_list(
fake_uuid,
template_type,
expected_list_id,
expected_filename,
expected_filenames,
expected_time,
expected_count,
):
@@ -4215,10 +4215,11 @@ def test_choose_from_contact_list(
service_id=SERVICE_ONE_ID,
template_id=fake_uuid,
)
assert len(page.select('.file-list-filename-large')) == 1
assert normalize_spaces(page.select_one('.file-list-filename-large').text) == (
expected_filename
)
assert [
normalize_spaces(filename.text)
for filename in page.select('.file-list-filename-large')
] == expected_filenames
assert page.select_one('a.file-list-filename-large')['href'] == url_for(
'main.send_from_contact_list',
service_id=SERVICE_ONE_ID,
@@ -478,7 +478,7 @@ def test_view_contact_list(
'Uploaded by Test User today at 10:59am.'
)
assert normalize_spaces(page.select('main p')[1].text) == (
'Not used yet.'
'Not used in the last 7 days.'
)
assert normalize_spaces(page.select_one('main h2').text) == (
'51 saved email addresses'
@@ -338,6 +338,7 @@ def test_uploads_page_shows_contact_lists_first(
mock_get_no_uploads,
mock_get_jobs,
mock_get_contact_lists,
mock_get_service_data_retention,
):
page = client_request.get('main.uploads', service_id=SERVICE_ONE_ID)
@@ -349,14 +350,19 @@ def test_uploads_page_shows_contact_lists_first(
),
(
'phone number list.csv '
'Uploaded 13 March at 1:00pm '
'Used twice in the last 7 days '
'123 saved phone numbers'
),
(
'EmergencyContactList.xls '
'Uploaded 13 March at 10:59am '
'Not used in the last 7 days '
'100 saved email addresses'
),
(
'UnusedList.tsv '
'Not used yet '
'1 saved phone number'
),
(
'even_later.csv '
'Sending 1 January 2016 at 11:09pm '
+16
View File
@@ -2075,6 +2075,8 @@ def mock_get_contact_lists(mocker, api_user_active, fake_uuid):
'id': fake_uuid,
'original_file_name': 'EmergencyContactList.xls',
'row_count': 100,
'recent_job_count': 0,
'has_jobs': True,
'service_id': service_id,
'template_type': 'email',
}, {
@@ -2083,6 +2085,18 @@ def mock_get_contact_lists(mocker, api_user_active, fake_uuid):
'id': 'd7b0bd1a-d1c7-4621-be5c-3c1b4278a2ad',
'original_file_name': 'phone number list.csv',
'row_count': 123,
'recent_job_count': 2,
'has_jobs': True,
'service_id': service_id,
'template_type': 'sms',
}, {
'created_at': '2020-02-02 02:00:00',
'created_by': 'Test User',
'id': fake_uuid,
'original_file_name': 'UnusedList.tsv',
'row_count': 1,
'recent_job_count': 0,
'has_jobs': False,
'service_id': service_id,
'template_type': 'sms',
}]
@@ -2102,6 +2116,8 @@ def mock_get_contact_list(mocker, api_user_active, fake_uuid):
'id': fake_uuid,
'original_file_name': 'EmergencyContactList.xls',
'row_count': 100,
'recent_job_count': 0,
'has_jobs': True,
'service_id': service_id,
'template_type': 'email',
}