From e2d979f19924f0bf1b1aa92b8c5a9c4b7b472858 Mon Sep 17 00:00:00 2001 From: Rebecca Law Date: Tue, 17 Dec 2019 17:23:00 +0000 Subject: [PATCH 1/9] New pages to show a summary of all the reports the services has for its returned letters --- app/main/__init__.py | 1 + app/main/views/returned_letters.py | 22 +++++++++++++ app/notify_client/service_api_client.py | 5 +++ .../views/returned-letter-summary.html | 32 +++++++++++++++++++ 4 files changed, 60 insertions(+) create mode 100644 app/main/views/returned_letters.py create mode 100644 app/templates/views/returned-letter-summary.html diff --git a/app/main/__init__.py b/app/main/__init__.py index 4bb70bf45..97aa9f228 100644 --- a/app/main/__init__.py +++ b/app/main/__init__.py @@ -29,6 +29,7 @@ from app.main.views import ( # noqa isort:skip platform_admin, providers, register, + returned_letters, send, service_settings, sign_in, diff --git a/app/main/views/returned_letters.py b/app/main/views/returned_letters.py new file mode 100644 index 000000000..c0befbcd0 --- /dev/null +++ b/app/main/views/returned_letters.py @@ -0,0 +1,22 @@ +from flask import render_template, request + +from app import service_api_client +from app.main import main +from app.utils import user_has_permissions + + +@main.route("/services//returned-letter-summary", methods=["GET", "POST"]) +@user_has_permissions('manage_service') +def returned_letter_summary(service_id): + summary = service_api_client.get_returned_letter_summary(service_id) + return render_template( + 'views/returned-letter-summary.html', + data=summary, + ) + + +@main.route("/services//returned-letters-csv/", methods=["GET", "POST"]) +@user_has_permissions('manage_service') +def returned_letters_report(service_id, reported_at): + + return str(service_api_client.get_returned_letters(service_id, reported_at)) diff --git a/app/notify_client/service_api_client.py b/app/notify_client/service_api_client.py index 8c45fb1b3..259e70c06 100644 --- a/app/notify_client/service_api_client.py +++ b/app/notify_client/service_api_client.py @@ -569,5 +569,10 @@ class ServiceAPIClient(NotifyAdminAPIClient): def get_service_data_retention(self, service_id): return self.get("/service/{}/data-retention".format(service_id)) + def get_returned_letter_summary(self, service_id): + return self.get("service/{}/returned-letter-summary".format(service_id)) + + def get_returned_letters(self, service_id, reported_at): + return self.get("service/{}/returned-letters?reported_at={}".format(service_id, reported_at)) service_api_client = ServiceAPIClient() diff --git a/app/templates/views/returned-letter-summary.html b/app/templates/views/returned-letter-summary.html new file mode 100644 index 000000000..a7ee74efa --- /dev/null +++ b/app/templates/views/returned-letter-summary.html @@ -0,0 +1,32 @@ +{% from "components/table.html" import list_table, field %} +{% extends "withnav_template.html" %} + +{% block service_page_title %} + Returned letters +{% endblock %} + +{% block maincolumn_content %} +

+ Messages sent +

+
+ {% call(item, row_number) list_table( + data, + caption="Report", + caption_visible=False, + empty_message='If you have returned letter reports they will be listed here', + field_headings=[ + 'Report date', + 'number of letters' + ], + field_headings_visible=False + ) %} + {% call field() %} + + Returned letters reported on {{ item.reported_at | format_datetime_short}} ({{ item.returned_letter_count}} letters) + + {% endcall %} + {% endcall %} +
+ +{% endblock %} \ No newline at end of file From 729281532df9cd57c1d7d77b89a42241bfff07a6 Mon Sep 17 00:00:00 2001 From: Rebecca Law Date: Wed, 18 Dec 2019 11:53:46 +0000 Subject: [PATCH 2/9] Added returned-letter-summary page. This page displays a list of available reports, a report is a set of returned lettters that have been reported on the same day. Each line of the page is a link that can download the report. I'm not sure the format of the csv is right. The data might be confusing especially if the service has a mix of precompiled templates and jobs. Units tests are still to come. --- app/main/views/returned_letters.py | 32 ++++++++++++++++--- app/navigation.py | 8 +++++ app/notify_client/service_api_client.py | 1 + .../views/returned-letter-summary.html | 2 +- 4 files changed, 37 insertions(+), 6 deletions(-) diff --git a/app/main/views/returned_letters.py b/app/main/views/returned_letters.py index c0befbcd0..26fe838f2 100644 --- a/app/main/views/returned_letters.py +++ b/app/main/views/returned_letters.py @@ -1,12 +1,14 @@ -from flask import render_template, request +from collections import OrderedDict + +from flask import render_template from app import service_api_client from app.main import main -from app.utils import user_has_permissions +from app.utils import Spreadsheet, user_has_permissions @main.route("/services//returned-letter-summary", methods=["GET", "POST"]) -@user_has_permissions('manage_service') +@user_has_permissions('view_activity') def returned_letter_summary(service_id): summary = service_api_client.get_returned_letter_summary(service_id) return render_template( @@ -16,7 +18,27 @@ def returned_letter_summary(service_id): @main.route("/services//returned-letters-csv/", methods=["GET", "POST"]) -@user_has_permissions('manage_service') +@user_has_permissions('view_activity') def returned_letters_report(service_id, reported_at): + returned_letters = service_api_client.get_returned_letters(service_id, reported_at) + column_names = OrderedDict([ + ('client_reference', 'Reference'), + ('created_at', 'Date sent'), + ('notification_id', 'Notification ID'), + ('template_name', 'Template name'), + ('template_id', 'Template ID'), + ('template_version', 'Template version'), + ('original_file_name', 'Job file name'), + ('job_row_number', 'Job row number'), + ]) - return str(service_api_client.get_returned_letters(service_id, reported_at)) + # initialise with header row + data = [[x for x in column_names.values()]] + + for row in returned_letters: + data.append([row[key] for key in column_names.keys()]) + + return Spreadsheet.from_rows(data).as_csv_data, 200, { + 'Content-Type': 'text/csv; charset=utf-8', + 'Content-Disposition': 'inline; filename="{} returned letters.csv"'.format(reported_at) + } diff --git a/app/navigation.py b/app/navigation.py index 4e9cdef8c..fe2f2092b 100644 --- a/app/navigation.py +++ b/app/navigation.py @@ -242,6 +242,8 @@ class HeaderNavigation(Navigation): 'resend_email_link', 'resend_email_verification', 'resume_service', + 'returned_letter_summary', + 'returned_letters_report', 'revoke_api_key', 'robots', 'send_messages', @@ -564,6 +566,8 @@ class MainNavigation(Navigation): 'resend_email_link', 'resend_email_verification', 'resume_service', + 'returned_letter_summary', + 'returned_letters_report', 'roadmap', 'robots', 'security', @@ -801,6 +805,8 @@ class CaseworkNavigation(Navigation): 'resend_email_link', 'resend_email_verification', 'resume_service', + 'returned_letter_summary', + 'returned_letters_report', 'revoke_api_key', 'roadmap', 'robots', @@ -1077,6 +1083,8 @@ class OrgNavigation(Navigation): 'resend_email_link', 'resend_email_verification', 'resume_service', + 'returned_letter_summary', + 'returned_letters_report', 'revoke_api_key', 'roadmap', 'robots', diff --git a/app/notify_client/service_api_client.py b/app/notify_client/service_api_client.py index 259e70c06..eaaf5b59e 100644 --- a/app/notify_client/service_api_client.py +++ b/app/notify_client/service_api_client.py @@ -575,4 +575,5 @@ class ServiceAPIClient(NotifyAdminAPIClient): def get_returned_letters(self, service_id, reported_at): return self.get("service/{}/returned-letters?reported_at={}".format(service_id, reported_at)) + service_api_client = ServiceAPIClient() diff --git a/app/templates/views/returned-letter-summary.html b/app/templates/views/returned-letter-summary.html index a7ee74efa..436cfd0f4 100644 --- a/app/templates/views/returned-letter-summary.html +++ b/app/templates/views/returned-letter-summary.html @@ -22,7 +22,7 @@ field_headings_visible=False ) %} {% call field() %} - + Returned letters reported on {{ item.reported_at | format_datetime_short}} ({{ item.returned_letter_count}} letters) {% endcall %} From 0273eea0cccdb679005ef4ef891fc3e5d69f8ead Mon Sep 17 00:00:00 2001 From: Rebecca Law Date: Thu, 19 Dec 2019 17:21:56 +0000 Subject: [PATCH 3/9] Add email address and uploaded_letter --- app/main/views/returned_letters.py | 8 +++++--- tests/app/main/views/test_returned_letters.py | 0 2 files changed, 5 insertions(+), 3 deletions(-) create mode 100644 tests/app/main/views/test_returned_letters.py diff --git a/app/main/views/returned_letters.py b/app/main/views/returned_letters.py index 26fe838f2..6dce4e967 100644 --- a/app/main/views/returned_letters.py +++ b/app/main/views/returned_letters.py @@ -22,14 +22,16 @@ def returned_letter_summary(service_id): def returned_letters_report(service_id, reported_at): returned_letters = service_api_client.get_returned_letters(service_id, reported_at) column_names = OrderedDict([ + ('notification_id', 'Notification ID'), ('client_reference', 'Reference'), ('created_at', 'Date sent'), - ('notification_id', 'Notification ID'), + ('email_address', 'Sent by'), ('template_name', 'Template name'), ('template_id', 'Template ID'), ('template_version', 'Template version'), - ('original_file_name', 'Job file name'), - ('job_row_number', 'Job row number'), + ('original_file_name', 'Spreadsheet file name'), + ('job_row_number', 'Spreadsheet row number'), + ('uploaded_letter', 'Uploaded letter') ]) # initialise with header row diff --git a/tests/app/main/views/test_returned_letters.py b/tests/app/main/views/test_returned_letters.py new file mode 100644 index 000000000..e69de29bb From 4c72efd08a91bf5e319483675bcd569acdea4400 Mon Sep 17 00:00:00 2001 From: Rebecca Law Date: Tue, 24 Dec 2019 14:33:52 +0000 Subject: [PATCH 4/9] Added tests --- .../views/returned-letter-summary.html | 4 +- tests/app/main/views/test_returned_letters.py | 50 +++++++++++++++++++ tests/conftest.py | 13 +++++ 3 files changed, 65 insertions(+), 2 deletions(-) diff --git a/app/templates/views/returned-letter-summary.html b/app/templates/views/returned-letter-summary.html index 436cfd0f4..04dcc117b 100644 --- a/app/templates/views/returned-letter-summary.html +++ b/app/templates/views/returned-letter-summary.html @@ -7,7 +7,7 @@ {% block maincolumn_content %}

- Messages sent + Returned letters

{% call(item, row_number) list_table( @@ -23,7 +23,7 @@ ) %} {% call field() %} - Returned letters reported on {{ item.reported_at | format_datetime_short}} ({{ item.returned_letter_count}} letters) + Returned letters reported on {{ item.reported_at | format_date}} ({{ item.returned_letter_count}} letters) {% endcall %} {% endcall %} diff --git a/tests/app/main/views/test_returned_letters.py b/tests/app/main/views/test_returned_letters.py index e69de29bb..7923e246f 100644 --- a/tests/app/main/views/test_returned_letters.py +++ b/tests/app/main/views/test_returned_letters.py @@ -0,0 +1,50 @@ +from tests.conftest import SERVICE_ONE_ID, normalize_spaces + + +def test_returned_letter_summary( + client_request, + mocker +): + summary_data = [{'returned_letter_count': 30, 'reported_at': '2019-12-24'}] + mock = mocker.patch("app.service_api_client.get_returned_letter_summary", + return_value=summary_data) + + page = client_request.get("main.returned_letter_summary", service_id=SERVICE_ONE_ID) + + mock.assert_called_once_with(SERVICE_ONE_ID) + + expected_text = "Returned letters reported on Tuesday 24 December 2019 (30 letters)" + assert page.h1.string.strip() == 'Returned letters' + assert normalize_spaces(page.select('.table-field-left-aligned')[0].text) == expected_text + + +def test_returned_letters_reports( + client_request, + mocker +): + data = [{ + 'notification_id': '12345678', + 'client_reference': '2344567', + 'created_at': '2019-12-24 13:30', + 'email_address': 'test@gov.uk', + 'template_name': 'First letter template', + 'template_id': '3445667', + 'template_version': 2, + 'original_file_name': None, + 'job_row_number': None, + 'uploaded_letter': 'test_letter.pdf', + }] + mock = mocker.patch("app.service_api_client.get_returned_letters", return_value=data) + + response = client_request.get_response("main.returned_letters_report", + service_id=SERVICE_ONE_ID, + reported_at='2019-12-24') + + report = response.get_data(as_text=True) + mock.assert_called_once_with(SERVICE_ONE_ID, '2019-12-24') + assert report.strip() == ( + 'Notification ID,Reference,Date sent,Sent by,Template name,Template ID,Template version,' + + 'Spreadsheet file name,Spreadsheet row number,Uploaded letter\r\n' + + '12345678,2344567,2019-12-24 13:30,test@gov.uk,' + + 'First letter template,3445667,2,,,test_letter.pdf' + ) diff --git a/tests/conftest.py b/tests/conftest.py index c56337126..c5e4b371f 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -2921,6 +2921,19 @@ def client_request( assert_url_expected(resp.location, _expected_redirect) return BeautifulSoup(resp.data.decode('utf-8'), 'html.parser') + @staticmethod + def get_response( + endpoint, + _expected_status=200, + _optional_args="", + **endpoint_kwargs + ): + resp = logged_in_client.get( + url_for(endpoint, **(endpoint_kwargs or {})) + _optional_args, + ) + assert resp.status_code == _expected_status + return resp + return ClientRequest From a4fed667e4fb0ae20237dc5cf16fc19edcbf2bbf Mon Sep 17 00:00:00 2001 From: Rebecca Law Date: Fri, 27 Dec 2019 12:40:12 +0000 Subject: [PATCH 5/9] Updated to reflect change in API key in json result. --- app/main/views/returned_letters.py | 2 +- tests/app/main/views/test_returned_letters.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/app/main/views/returned_letters.py b/app/main/views/returned_letters.py index 6dce4e967..e720eee0c 100644 --- a/app/main/views/returned_letters.py +++ b/app/main/views/returned_letters.py @@ -31,7 +31,7 @@ def returned_letters_report(service_id, reported_at): ('template_version', 'Template version'), ('original_file_name', 'Spreadsheet file name'), ('job_row_number', 'Spreadsheet row number'), - ('uploaded_letter', 'Uploaded letter') + ('uploaded_letter_file_name', 'Uploaded letter') ]) # initialise with header row diff --git a/tests/app/main/views/test_returned_letters.py b/tests/app/main/views/test_returned_letters.py index 7923e246f..191b7a3d7 100644 --- a/tests/app/main/views/test_returned_letters.py +++ b/tests/app/main/views/test_returned_letters.py @@ -32,7 +32,7 @@ def test_returned_letters_reports( 'template_version': 2, 'original_file_name': None, 'job_row_number': None, - 'uploaded_letter': 'test_letter.pdf', + 'uploaded_letter_file_name': 'test_letter.pdf', }] mock = mocker.patch("app.service_api_client.get_returned_letters", return_value=data) From 401828d1e0fe45cb5f7cec4f34faee691f85c566 Mon Sep 17 00:00:00 2001 From: Rebecca Law Date: Fri, 27 Dec 2019 17:27:55 +0000 Subject: [PATCH 6/9] Remove POST where not needed. Use plural method to display letter or letters Remove unused params from list_table method. --- app/main/views/returned_letters.py | 4 ++-- app/templates/views/returned-letter-summary.html | 15 +++++---------- tests/app/main/views/test_returned_letters.py | 2 +- 3 files changed, 8 insertions(+), 13 deletions(-) diff --git a/app/main/views/returned_letters.py b/app/main/views/returned_letters.py index e720eee0c..39937e3d2 100644 --- a/app/main/views/returned_letters.py +++ b/app/main/views/returned_letters.py @@ -7,7 +7,7 @@ from app.main import main from app.utils import Spreadsheet, user_has_permissions -@main.route("/services//returned-letter-summary", methods=["GET", "POST"]) +@main.route("/services//returned-letter-summary", methods=["GET"]) @user_has_permissions('view_activity') def returned_letter_summary(service_id): summary = service_api_client.get_returned_letter_summary(service_id) @@ -17,7 +17,7 @@ def returned_letter_summary(service_id): ) -@main.route("/services//returned-letters-csv/", methods=["GET", "POST"]) +@main.route("/services//returned-letters-csv/", methods=["GET"]) @user_has_permissions('view_activity') def returned_letters_report(service_id, reported_at): returned_letters = service_api_client.get_returned_letters(service_id, reported_at) diff --git a/app/templates/views/returned-letter-summary.html b/app/templates/views/returned-letter-summary.html index 04dcc117b..ec57325de 100644 --- a/app/templates/views/returned-letter-summary.html +++ b/app/templates/views/returned-letter-summary.html @@ -1,4 +1,5 @@ {% from "components/table.html" import list_table, field %} +{% from "components/message-count-label.html" import message_count_label %} {% extends "withnav_template.html" %} {% block service_page_title %} @@ -12,19 +13,13 @@
{% call(item, row_number) list_table( data, - caption="Report", + caption="Returned letters report", caption_visible=False, - empty_message='If you have returned letter reports they will be listed here', - field_headings=[ - 'Report date', - 'number of letters' - ], - field_headings_visible=False + empty_message='If you have returned letter reports they will be listed here' ) %} {% call field() %} - - Returned letters reported on {{ item.reported_at | format_date}} ({{ item.returned_letter_count}} letters) - + Returned letters reported on {{ item.reported_at | format_date}} - {{ item.returned_letter_count}} {{ message_count_label(item.returned_letter_count, 'letter', suffix='')}} {% endcall %} {% endcall %}
diff --git a/tests/app/main/views/test_returned_letters.py b/tests/app/main/views/test_returned_letters.py index 191b7a3d7..ae7bf3b99 100644 --- a/tests/app/main/views/test_returned_letters.py +++ b/tests/app/main/views/test_returned_letters.py @@ -13,7 +13,7 @@ def test_returned_letter_summary( mock.assert_called_once_with(SERVICE_ONE_ID) - expected_text = "Returned letters reported on Tuesday 24 December 2019 (30 letters)" + expected_text = "Returned letters reported on Tuesday 24 December 2019 - 30 letters" assert page.h1.string.strip() == 'Returned letters' assert normalize_spaces(page.select('.table-field-left-aligned')[0].text) == expected_text From 41be4c054b05a19c851bc12d579c42b6cad1ca33 Mon Sep 17 00:00:00 2001 From: Rebecca Law Date: Mon, 30 Dec 2019 14:06:15 +0000 Subject: [PATCH 7/9] Add test for url and pluralisation --- app/main/views/returned_letters.py | 2 +- tests/app/main/views/test_returned_letters.py | 24 ++++++++++++++++++- 2 files changed, 24 insertions(+), 2 deletions(-) diff --git a/app/main/views/returned_letters.py b/app/main/views/returned_letters.py index 39937e3d2..adda4e29d 100644 --- a/app/main/views/returned_letters.py +++ b/app/main/views/returned_letters.py @@ -31,7 +31,7 @@ def returned_letters_report(service_id, reported_at): ('template_version', 'Template version'), ('original_file_name', 'Spreadsheet file name'), ('job_row_number', 'Spreadsheet row number'), - ('uploaded_letter_file_name', 'Uploaded letter') + ('uploaded_letter_file_name', 'Uploaded letter file name') ]) # initialise with header row diff --git a/tests/app/main/views/test_returned_letters.py b/tests/app/main/views/test_returned_letters.py index ae7bf3b99..96df90981 100644 --- a/tests/app/main/views/test_returned_letters.py +++ b/tests/app/main/views/test_returned_letters.py @@ -1,3 +1,5 @@ +from flask import url_for + from tests.conftest import SERVICE_ONE_ID, normalize_spaces @@ -16,6 +18,26 @@ def test_returned_letter_summary( expected_text = "Returned letters reported on Tuesday 24 December 2019 - 30 letters" assert page.h1.string.strip() == 'Returned letters' assert normalize_spaces(page.select('.table-field-left-aligned')[0].text) == expected_text + assert page.select_one('.table-field-left-aligned a')['href'] == url_for('.returned_letters_report', + service_id=SERVICE_ONE_ID, + reported_at='2019-12-24') + + +def test_returned_letter_summary_with_one_letter( + client_request, + mocker +): + summary_data = [{'returned_letter_count': 1, 'reported_at': '2019-12-24'}] + mock = mocker.patch("app.service_api_client.get_returned_letter_summary", + return_value=summary_data) + + page = client_request.get("main.returned_letter_summary", service_id=SERVICE_ONE_ID) + + mock.assert_called_once_with(SERVICE_ONE_ID) + + expected_text = "Returned letters reported on Tuesday 24 December 2019 - 1 letter" + assert page.h1.string.strip() == 'Returned letters' + assert normalize_spaces(page.select('.table-field-left-aligned')[0].text) == expected_text def test_returned_letters_reports( @@ -44,7 +66,7 @@ def test_returned_letters_reports( mock.assert_called_once_with(SERVICE_ONE_ID, '2019-12-24') assert report.strip() == ( 'Notification ID,Reference,Date sent,Sent by,Template name,Template ID,Template version,' - + 'Spreadsheet file name,Spreadsheet row number,Uploaded letter\r\n' + + 'Spreadsheet file name,Spreadsheet row number,Uploaded letter file name\r\n' + '12345678,2344567,2019-12-24 13:30,test@gov.uk,' + 'First letter template,3445667,2,,,test_letter.pdf' ) From 03fe7674bf4c51b8524ba7fa4fea0739781a867b Mon Sep 17 00:00:00 2001 From: Rebecca Law Date: Mon, 30 Dec 2019 16:53:32 +0000 Subject: [PATCH 8/9] Add a url_converter to check the date format. --- app/__init__.py | 2 ++ app/main/views/returned_letters.py | 2 +- app/url_converters.py | 4 ++++ tests/app/main/views/test_returned_letters.py | 12 ++++++++++++ 4 files changed, 19 insertions(+), 1 deletion(-) diff --git a/app/__init__.py b/app/__init__.py index 0436f5e98..62d070d19 100644 --- a/app/__init__.py +++ b/app/__init__.py @@ -85,6 +85,7 @@ from app.notify_client.template_statistics_api_client import ( from app.notify_client.user_api_client import user_api_client from app.url_converters import ( LetterFileExtensionConverter, + SimpleDateTypeConverter, TemplateTypeConverter, ) from app.utils import format_thousands, get_logo_cdn_domain, id_safe @@ -221,6 +222,7 @@ def init_app(application): application.url_map.converters['uuid'].to_python = lambda self, value: value application.url_map.converters['template_type'] = TemplateTypeConverter application.url_map.converters['letter_file_extension'] = LetterFileExtensionConverter + application.url_map.converters['simple_date'] = SimpleDateTypeConverter def convert_to_boolean(value): diff --git a/app/main/views/returned_letters.py b/app/main/views/returned_letters.py index adda4e29d..6d6b24d12 100644 --- a/app/main/views/returned_letters.py +++ b/app/main/views/returned_letters.py @@ -17,7 +17,7 @@ def returned_letter_summary(service_id): ) -@main.route("/services//returned-letters-csv/", methods=["GET"]) +@main.route("/services//returned-letters-csv/", methods=["GET"]) @user_has_permissions('view_activity') def returned_letters_report(service_id, reported_at): returned_letters = service_api_client.get_returned_letters(service_id, reported_at) diff --git a/app/url_converters.py b/app/url_converters.py index e90012f59..9dc649b5a 100644 --- a/app/url_converters.py +++ b/app/url_converters.py @@ -9,3 +9,7 @@ class TemplateTypeConverter(BaseConverter): class LetterFileExtensionConverter(BaseConverter): regex = '(?:pdf|png)' + + +class SimpleDateTypeConverter(BaseConverter): + regex = r'([12]\d{3}-(0[1-9]|1[0-2])-(0[1-9]|[12]\d|3[01]))' diff --git a/tests/app/main/views/test_returned_letters.py b/tests/app/main/views/test_returned_letters.py index 96df90981..eb373b07d 100644 --- a/tests/app/main/views/test_returned_letters.py +++ b/tests/app/main/views/test_returned_letters.py @@ -70,3 +70,15 @@ def test_returned_letters_reports( + '12345678,2344567,2019-12-24 13:30,test@gov.uk,' + 'First letter template,3445667,2,,,test_letter.pdf' ) + + +def test_returned_letters_reports_returns_404_for_bad_date( + client_request, + mocker +): + mock = mocker.patch("app.service_api_client.get_returned_letters") + client_request.get_response("main.returned_letters_report", + service_id=SERVICE_ONE_ID, + reported_at='19-12-2019', + _expected_status=404) + mock.assert_not_called() From 5320c3b34b1b1058456cf136fbe648be08c88cef Mon Sep 17 00:00:00 2001 From: Rebecca Law Date: Tue, 31 Dec 2019 09:11:07 +0000 Subject: [PATCH 9/9] Add class to anchor tag --- app/templates/views/returned-letter-summary.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/templates/views/returned-letter-summary.html b/app/templates/views/returned-letter-summary.html index ec57325de..9c50d1c40 100644 --- a/app/templates/views/returned-letter-summary.html +++ b/app/templates/views/returned-letter-summary.html @@ -18,7 +18,7 @@ empty_message='If you have returned letter reports they will be listed here' ) %} {% call field() %} - Returned letters reported on {{ item.reported_at | format_date}} - {{ item.returned_letter_count}} {{ message_count_label(item.returned_letter_count, 'letter', suffix='')}} {% endcall %} {% endcall %}