From 1fb040dc619b29ca056e425b29af8e01c784c5e6 Mon Sep 17 00:00:00 2001 From: Pea Tyczynska Date: Thu, 12 Mar 2020 16:05:25 +0000 Subject: [PATCH] Format postcode for CSV letter rows We are formatting the postcode here, because if we did it in template preview, that could break flows like API and admin one-off, since we are not validating postcode there yet, and format_postcode needs a nice validated postcode. We are not doing it in admin, as then we would have to either rewrite the CSV file or pass data differently to API. First would be nasty, second is a lot of overhead. In the long run we might want to move postcode formatting to template preview so that the postcode in letter preview looks the same before and after user sends it, but now to get it out quickly it's better to format the postcode here in the task. --- app/celery/tasks.py | 5 +++++ requirements-app.txt | 2 +- tests/app/celery/test_tasks.py | 29 +++++++++++++++++++++++++++-- 3 files changed, 33 insertions(+), 3 deletions(-) diff --git a/app/celery/tasks.py b/app/celery/tasks.py index 616d9ee77..0d3a6bb4f 100644 --- a/app/celery/tasks.py +++ b/app/celery/tasks.py @@ -4,6 +4,7 @@ from collections import namedtuple, defaultdict from flask import current_app from notifications_utils.recipients import ( + format_postcode_for_printing, RecipientCSV ) from notifications_utils.statsd_decorators import statsd @@ -305,6 +306,10 @@ def save_letter( # we store the recipient as just the first item of the person's address recipient = notification['personalisation']['addressline1'] + notification['personalisation']['postcode'] = format_postcode_for_printing( + notification['personalisation']['postcode'] + ) + service = dao_fetch_service_by_id(service_id) template = dao_get_template_by_id(notification['template'], version=notification['template_version']) diff --git a/requirements-app.txt b/requirements-app.txt index f719bba6b..07d295255 100644 --- a/requirements-app.txt +++ b/requirements-app.txt @@ -27,4 +27,4 @@ notifications-python-client==5.5.1 awscli-cwlogs>=1.4,<1.5 -git+https://github.com/alphagov/notifications-utils.git@36.6.2#egg=notifications-utils==36.6.2 +git+https://github.com/alphagov/notifications-utils.git@36.8.0#egg=notifications-utils==36.8.0 diff --git a/tests/app/celery/test_tasks.py b/tests/app/celery/test_tasks.py index 698e61e74..05f3d3514 100644 --- a/tests/app/celery/test_tasks.py +++ b/tests/app/celery/test_tasks.py @@ -961,7 +961,7 @@ def test_save_letter_saves_letter_to_database(mocker, notify_db_session): 'addressline4': 'Wibble', 'addressline5': 'Wobble', 'addressline6': 'Wubble', - 'postcode': 'Flob', + 'postcode': 'SE1 2SA', } notification_json = _notification_json( template=job.template, @@ -1021,6 +1021,31 @@ def test_save_letter_saves_letter_to_database_with_correct_postage(mocker, notif assert notification_db.postage == postage +def test_save_letter_saves_letter_to_database_with_formatted_postcode(mocker, notify_db_session): + service = create_service(service_permissions=[LETTER_TYPE]) + template = create_template(service=service, template_type=LETTER_TYPE) + letter_job = create_job(template=template) + + mocker.patch('app.celery.tasks.letters_pdf_tasks.create_letters_pdf.apply_async') + notification_json = _notification_json( + template=letter_job.template, + to='Foo', + personalisation={'addressline1': 'Foo', 'addressline2': 'Bar', 'postcode': 'se1 64sa'}, + job_id=letter_job.id, + row_number=1 + ) + notification_id = uuid.uuid4() + save_letter( + letter_job.service_id, + notification_id, + encryption.encrypt(notification_json), + ) + + notification_db = Notification.query.one() + assert notification_db.id == notification_id + assert notification_db.personalisation["postcode"] == "SE16 4SA" + + def test_save_letter_saves_letter_to_database_right_reply_to(mocker, notify_db_session): service = create_service() create_letter_contact(service=service, contact_block="Address contact", is_default=True) @@ -1037,7 +1062,7 @@ def test_save_letter_saves_letter_to_database_right_reply_to(mocker, notify_db_s 'addressline4': 'Wibble', 'addressline5': 'Wobble', 'addressline6': 'Wubble', - 'postcode': 'Flob', + 'postcode': 'SE1 3WS', } notification_json = _notification_json( template=job.template,