Merge pull request #3403 from alphagov/pdf-bug-fix

Specify mimetype for PDF letters to be downloaded
This commit is contained in:
Katie Smith
2020-04-09 11:29:39 +01:00
committed by GitHub
2 changed files with 20 additions and 17 deletions

View File

@@ -13,6 +13,7 @@ from flask import (
redirect, redirect,
render_template, render_template,
request, request,
send_file,
stream_with_context, stream_with_context,
url_for, url_for,
) )
@@ -57,7 +58,7 @@ def view_notification(service_id, notification_id):
error_message = None error_message = None
if notification['template']['is_precompiled_letter']: if notification['template']['is_precompiled_letter']:
try: try:
file_contents, metadata = view_letter_notification_as_preview( file_contents, metadata = get_letter_file_data(
service_id, notification_id, "pdf", with_metadata=True service_id, notification_id, "pdf", with_metadata=True
) )
page_count = int( page_count = int(
@@ -187,6 +188,18 @@ def get_preview_error_image():
def view_letter_notification_as_preview( def view_letter_notification_as_preview(
service_id, notification_id, filetype, with_metadata=False service_id, notification_id, filetype, with_metadata=False
): ):
image_data = get_letter_file_data(service_id, notification_id, filetype, with_metadata)
file = io.BytesIO(image_data)
mimetype = 'image/png' if filetype == 'png' else 'application/pdf'
return send_file(
filename_or_fp=file,
mimetype=mimetype,
)
def get_letter_file_data(service_id, notification_id, filetype, with_metadata=False):
try: try:
preview = notification_api_client.get_notification_letter_preview( preview = notification_api_client.get_notification_letter_preview(
service_id, service_id,

View File

@@ -254,7 +254,7 @@ def test_notification_page_shows_uploaded_letter(
fake_uuid, fake_uuid,
): ):
mocker.patch( mocker.patch(
'app.main.views.notifications.view_letter_notification_as_preview', 'app.main.views.notifications.get_letter_file_data',
return_value=(b'foo', { return_value=(b'foo', {
'message': '', 'message': '',
'invalid_pages': '[]', 'invalid_pages': '[]',
@@ -319,18 +319,13 @@ def test_notification_page_shows_page_for_letter_sent_with_test_key(
if is_precompiled_letter: if is_precompiled_letter:
mocker.patch( mocker.patch(
'app.main.views.notifications.view_letter_notification_as_preview', 'app.main.views.notifications.get_letter_file_data',
return_value=(b'foo', { return_value=(b'foo', {
'message': '', 'message': '',
'invalid_pages': '[]', 'invalid_pages': '[]',
'page_count': '1' 'page_count': '1'
}) })
) )
else:
mocker.patch(
'app.main.views.notifications.view_letter_notification_as_preview',
return_value=b'foo'
)
mocker.patch( mocker.patch(
'app.main.views.notifications.pdf_page_count', 'app.main.views.notifications.pdf_page_count',
@@ -383,7 +378,7 @@ def test_notification_page_shows_validation_failed_precompiled_letter(
metadata = {"page_count": "1", "status": "validation-failed", metadata = {"page_count": "1", "status": "validation-failed",
"invalid_pages": "[1]", "invalid_pages": "[1]",
"message": "content-outside-printable-area"} "message": "content-outside-printable-area"}
mocker.patch('app.main.views.notifications.view_letter_notification_as_preview', mocker.patch('app.main.views.notifications.get_letter_file_data',
return_value=("some letter content", metadata)) return_value=("some letter content", metadata))
mocker.patch( mocker.patch(
'app.main.views.notifications.get_page_count_for_letter', 'app.main.views.notifications.get_page_count_for_letter',
@@ -627,7 +622,7 @@ def test_should_show_preview_error_image_letter_notification_on_preview_error(
side_effect=APIError side_effect=APIError
) )
mocker.patch("builtins.open", mock_open(read_data="preview error image")) mocker.patch("builtins.open", mock_open(read_data=b"preview error image"))
response = logged_in_client.get(url_for( response = logged_in_client.get(url_for(
'main.view_letter_notification_as_preview', 'main.view_letter_notification_as_preview',
@@ -651,7 +646,7 @@ def test_notification_page_shows_error_message_if_precompiled_letter_cannot_be_o
is_precompiled_letter=True) is_precompiled_letter=True)
mocker.patch('app.notification_api_client.get_notification', return_value=notification) mocker.patch('app.notification_api_client.get_notification', return_value=notification)
mocker.patch( mocker.patch(
'app.main.views.notifications.view_letter_notification_as_preview', 'app.main.views.notifications.get_letter_file_data',
side_effect=PdfReadError() side_effect=PdfReadError()
) )
mocker.patch( mocker.patch(
@@ -783,14 +778,9 @@ def test_notification_page_has_expected_template_link_for_letter(
if is_precompiled_letter: if is_precompiled_letter:
mocker.patch( mocker.patch(
'app.main.views.notifications.view_letter_notification_as_preview', 'app.main.views.notifications.get_letter_file_data',
side_effect=[(b'foo', {"message": "", "invalid_pages": "[]", "page_count": "1"}), b'foo'] side_effect=[(b'foo', {"message": "", "invalid_pages": "[]", "page_count": "1"}), b'foo']
) )
else:
mocker.patch(
'app.main.views.notifications.view_letter_notification_as_preview',
return_value=b'foo'
)
mocker.patch( mocker.patch(
'app.main.views.notifications.pdf_page_count', 'app.main.views.notifications.pdf_page_count',