From a542047581ccb15c9ee0b5de9019b1f2ee32dd43 Mon Sep 17 00:00:00 2001 From: Katie Smith Date: Fri, 8 Nov 2019 09:56:59 +0000 Subject: [PATCH] Show recipient when about to send uploaded letter The recipient of the letter now displays at the bottom of the page when previewing a valid letter. The template preview `/precompiled/sanitise` endpoint returns the address, but we format it to display on a single line with commas between each line. We also need to convert the recipient address to ASCII so that it can be stored as S3 metadata. --- app/main/views/uploads.py | 10 ++++-- app/s3_client/s3_letter_upload_client.py | 32 ++++++++++++++++++- app/templates/views/uploads/preview.html | 4 +++ tests/app/main/views/test_uploads.py | 21 ++++++++---- .../s3_client/test_s3_letter_upload_client.py | 18 ++++++++++- 5 files changed, 75 insertions(+), 10 deletions(-) diff --git a/app/main/views/uploads.py b/app/main/views/uploads.py index c97919062..5054cc4d7 100644 --- a/app/main/views/uploads.py +++ b/app/main/views/uploads.py @@ -92,14 +92,18 @@ def upload_letter(service_id): else: raise ex else: + response = response.json() + recipient = response['recipient_address'] status = 'valid' - file_contents = base64.b64decode(response.json()['file'].encode()) + file_contents = base64.b64decode(response['file'].encode()) + upload_letter_to_s3( file_contents, file_location=file_location, status=status, page_count=page_count, - filename=original_filename) + filename=original_filename, + recipient=recipient) return redirect( url_for( @@ -147,6 +151,7 @@ def uploaded_letter_preview(service_id, file_id): status = metadata.get('status') error_shortcode = metadata.get('message') invalid_pages = metadata.get('invalid_pages') + recipient = metadata.get('recipient') if invalid_pages: invalid_pages = json.loads(invalid_pages) @@ -180,6 +185,7 @@ def uploaded_letter_preview(service_id, file_id): message=error_message, error_code=error_shortcode, form=form, + recipient=recipient, ) diff --git a/app/s3_client/s3_letter_upload_client.py b/app/s3_client/s3_letter_upload_client.py index 1a5bb4611..adff787e9 100644 --- a/app/s3_client/s3_letter_upload_client.py +++ b/app/s3_client/s3_letter_upload_client.py @@ -3,13 +3,24 @@ import json from boto3 import resource from flask import current_app from notifications_utils.s3 import s3upload as utils_s3upload +from notifications_utils.sanitise_text import SanitiseASCII def get_transient_letter_file_location(service_id, upload_id): return 'service-{}/{}.pdf'.format(service_id, upload_id) -def upload_letter_to_s3(data, *, file_location, status, page_count, filename, message=None, invalid_pages=None): +def upload_letter_to_s3( + data, + *, + file_location, + status, + page_count, + filename, + message=None, + invalid_pages=None, + recipient=None +): metadata = { 'status': status, 'page_count': str(page_count), @@ -19,6 +30,8 @@ def upload_letter_to_s3(data, *, file_location, status, page_count, filename, me metadata['message'] = message if invalid_pages: metadata['invalid_pages'] = json.dumps(invalid_pages) + if recipient: + metadata['recipient'] = format_recipient(recipient) utils_s3upload( filedata=data, @@ -46,3 +59,20 @@ def get_letter_metadata(service_id, file_id): s3_object = s3.Object(current_app.config['TRANSIENT_UPLOADED_LETTERS'], file_location).get() return s3_object['Metadata'] + + +def format_recipient(address): + ''' + To format the recipient we need to: + - remove new line characters + - remove whitespace around the lines + - join the address lines, separated by a comma + - convert the string to ASCII (S3 metadata must be stored as ASCII) + ''' + stripped_address_lines_no_trailing_commas = [ + line.lstrip().rstrip(' ,') + for line in address.splitlines() if line + ] + one_line_address = ', '.join(stripped_address_lines_no_trailing_commas) + + return SanitiseASCII.encode(one_line_address) diff --git a/app/templates/views/uploads/preview.html b/app/templates/views/uploads/preview.html index 55f65e055..be7a7abe7 100644 --- a/app/templates/views/uploads/preview.html +++ b/app/templates/views/uploads/preview.html @@ -32,6 +32,10 @@ {% if status == 'valid' and current_service.live %}
+

+ Recipient: {{ recipient }} +

+