From acae449ab9c818a8998b3a73a81d8adad5b7763d Mon Sep 17 00:00:00 2001 From: Chris Hill-Scott Date: Thu, 11 May 2017 12:01:51 +0100 Subject: [PATCH] Show all pages of a letter everywhere Right now showing all the pages in full is the only way we have of showing a letter that makes sense to our users. Maybe in the future we show some kind of truncated version, but the end of the first page is not a good place to truncate the letter. This commit just extracts the code for showing multiple pages from the template view, refactors it for reuse, and includes it in the send views. --- app/main/views/send.py | 14 ++++++++++--- app/main/views/templates.py | 8 ++------ app/template_previews.py | 13 +++++++++++- tests/app/test_template_previews.py | 31 ++++++++++++++++++++++++++++- 4 files changed, 55 insertions(+), 11 deletions(-) diff --git a/app/main/views/send.py b/app/main/views/send.py index adb6ee3fd..78791a15e 100644 --- a/app/main/views/send.py +++ b/app/main/views/send.py @@ -37,7 +37,7 @@ from app.utils import ( get_help_argument, get_template ) -from app.template_previews import TemplatePreview +from app.template_previews import TemplatePreview, get_page_count_for_letter def get_page_headings(template_type): @@ -83,15 +83,19 @@ def get_example_letter_address(key): @user_has_permissions('send_texts', 'send_emails', 'send_letters') def send_messages(service_id, template_id): + template = service_api_client.get_service_template(service_id, template_id)['data'] + template = get_template( - service_api_client.get_service_template(service_id, template_id)['data'], + template, current_service, show_recipient=True, + expand_emails=True, letter_preview_url=url_for( '.view_letter_template_preview', service_id=service_id, template_id=template_id, filetype='png', + page_count=get_page_count_for_letter(template), ), ) @@ -150,15 +154,19 @@ def send_test(service_id, template_id): file_name = current_app.config['TEST_MESSAGE_FILENAME'] + template = service_api_client.get_service_template(service_id, template_id)['data'] + template = get_template( - service_api_client.get_service_template(service_id, template_id)['data'], + template, current_service, show_recipient=True, + expand_emails=True, letter_preview_url=url_for( '.view_letter_template_preview', service_id=service_id, template_id=template_id, filetype='png', + page_count=get_page_count_for_letter(template), ), ) diff --git a/app/main/views/templates.py b/app/main/views/templates.py index 9ccf46312..71b3a7cef 100644 --- a/app/main/views/templates.py +++ b/app/main/views/templates.py @@ -19,7 +19,7 @@ from notifications_python_client.errors import HTTPError from app.main import main from app.utils import user_has_permissions, get_template -from app.template_previews import TemplatePreview +from app.template_previews import TemplatePreview, get_page_count_for_letter from app.main.forms import ( ChooseTemplateType, SMSTemplateForm, @@ -74,10 +74,6 @@ def choose_template(service_id): ) def view_template(service_id, template_id): template = service_api_client.get_service_template(service_id, template_id)['data'] - page_count = None - if template['template_type'] == 'letter': - page_count, _, _ = TemplatePreview.from_database_object(template, filetype='json') - page_count = json.loads(page_count.decode('utf-8'))['count'] return render_template( 'views/templates/template.html', template=get_template( @@ -91,7 +87,7 @@ def view_template(service_id, template_id): filetype='png', ), show_recipient=True, - page_count=page_count, + page_count=get_page_count_for_letter(template), ), ) diff --git a/app/template_previews.py b/app/template_previews.py index 323d4102a..9ff71f682 100644 --- a/app/template_previews.py +++ b/app/template_previews.py @@ -1,4 +1,4 @@ -from flask import current_app +from flask import current_app, json import requests from app import current_service @@ -32,3 +32,14 @@ class TemplatePreview: template.values, page=page, ) + + +def get_page_count_for_letter(template, values=None): + + if template['template_type'] != 'letter': + return None + + page_count, _, _ = TemplatePreview.from_database_object(template, values, filetype='json') + page_count = json.loads(page_count.decode('utf-8'))['count'] + + return page_count diff --git a/tests/app/test_template_previews.py b/tests/app/test_template_previews.py index d01fcdd92..7af5b90e8 100644 --- a/tests/app/test_template_previews.py +++ b/tests/app/test_template_previews.py @@ -4,7 +4,7 @@ from functools import partial from unittest.mock import Mock from notifications_utils.template import LetterPreviewTemplate -from app.template_previews import TemplatePreview +from app.template_previews import TemplatePreview, get_page_count_for_letter @pytest.mark.parametrize('partial_call, expected_page_argument', [ @@ -65,3 +65,32 @@ def test_from_database_object_makes_request( headers = {'Authorization': 'Token my-secret-key'} request_mock.assert_called_once_with(expected_url, json=data, headers=headers) + + +@pytest.mark.parametrize('template_type', [ + 'email', 'sms' +]) +def test_page_count_returns_none_for_non_letter_templates(template_type): + assert get_page_count_for_letter({'template_type': template_type}) is None + + +@pytest.mark.parametrize('partial_call, expected_template_preview_args', [ + ( + partial(get_page_count_for_letter), + ({'template_type': 'letter'}, None) + ), + ( + partial(get_page_count_for_letter, values={'foo': 'bar'}), + ({'template_type': 'letter'}, {'foo': 'bar'}) + ), +]) +def test_page_count_unpacks_from_json_response( + mocker, + partial_call, + expected_template_preview_args, +): + mock_template_preview = mocker.patch('app.template_previews.TemplatePreview.from_database_object') + mock_template_preview.return_value = (b'{"count": 99}', 200, {}) + + assert partial_call({'template_type': 'letter'}) == 99 + mock_template_preview.assert_called_once_with(*expected_template_preview_args, filetype='json')