diff --git a/app/main/views/templates.py b/app/main/views/templates.py index 7a9e94beb..034e1c6de 100644 --- a/app/main/views/templates.py +++ b/app/main/views/templates.py @@ -8,6 +8,7 @@ from flask import ( url_for, flash, abort, + json, ) from flask_login import login_required, current_user from dateutil.parser import parse @@ -72,15 +73,21 @@ def choose_template(service_id): admin_override=True, any_=True ) 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( - service_api_client.get_service_template(service_id, template_id)['data'], + template, current_service, expand_emails=True, letter_preview_url=url_for('.view_template', service_id=service_id, template_id=template_id), show_recipient=True, - ) + page_count=page_count, + ), ) @@ -92,7 +99,7 @@ def view_letter_template_preview(service_id, template_id, filetype): abort(404) db_template = service_api_client.get_service_template(service_id, template_id)['data'] - return TemplatePreview.from_database_object(db_template, filetype) + return TemplatePreview.from_database_object(db_template, filetype, page=request.args.get('page')) def _view_template_version(service_id, template_id, version, letters_as_pdf=False): diff --git a/app/template_previews.py b/app/template_previews.py index 466b60a31..323d4102a 100644 --- a/app/template_previews.py +++ b/app/template_previews.py @@ -6,7 +6,7 @@ from app import current_service class TemplatePreview: @classmethod - def from_database_object(cls, template, filetype, values=None): + def from_database_object(cls, template, filetype, values=None, page=None): data = { 'letter_contact_block': current_service['letter_contact_block'], 'template': template, @@ -14,16 +14,21 @@ class TemplatePreview: 'dvla_org_id': current_service['dvla_organisation'], } resp = requests.post( - '{}/preview.{}'.format(current_app.config['TEMPLATE_PREVIEW_API_HOST'], filetype), + '{}/preview.{}{}'.format( + current_app.config['TEMPLATE_PREVIEW_API_HOST'], + filetype, + '?page={}'.format(page) if page else '', + ), json=data, headers={'Authorization': 'Token {}'.format(current_app.config['TEMPLATE_PREVIEW_API_KEY'])} ) return (resp.content, resp.status_code, resp.headers.items()) @classmethod - def from_utils_template(cls, template, filetype): + def from_utils_template(cls, template, filetype, page=None): return cls.from_database_object( template._template, filetype, - template.values + template.values, + page=page, ) diff --git a/app/utils.py b/app/utils.py index 788847aa0..ee69416c7 100644 --- a/app/utils.py +++ b/app/utils.py @@ -255,6 +255,7 @@ def get_template( show_recipient=False, expand_emails=False, letter_preview_url=None, + page_count=1, ): if 'email' == template['template_type']: return EmailPreviewTemplate( @@ -276,6 +277,7 @@ def get_template( return LetterPDFLinkTemplate( template, preview_url=letter_preview_url, + page_count=int(page_count), ) else: return LetterPreviewTemplate( diff --git a/requirements.txt b/requirements.txt index ed4678d73..57464df18 100644 --- a/requirements.txt +++ b/requirements.txt @@ -28,5 +28,4 @@ notifications-python-client>=3.1,<3.2 awscli>=1.11,<1.12 awscli-cwlogs>=1.4,<1.5 -git+https://github.com/alphagov/notifications-utils.git@15.0.4#egg=notifications-utils==15.0.4 - +git+https://github.com/alphagov/notifications-utils.git@16.0.0#egg=notifications-utils==16.0.0 diff --git a/tests/app/test_template_previews.py b/tests/app/test_template_previews.py index 24b9505b0..d01fcdd92 100644 --- a/tests/app/test_template_previews.py +++ b/tests/app/test_template_previews.py @@ -1,30 +1,61 @@ +import pytest + +from functools import partial from unittest.mock import Mock from notifications_utils.template import LetterPreviewTemplate from app.template_previews import TemplatePreview -def test_from_utils_template_calls_through(mocker, mock_get_service_letter_template): +@pytest.mark.parametrize('partial_call, expected_page_argument', [ + (partial(TemplatePreview.from_utils_template), None), + (partial(TemplatePreview.from_utils_template, page=99), 99), +]) +def test_from_utils_template_calls_through( + mocker, + mock_get_service_letter_template, + partial_call, + expected_page_argument, +): mock_from_db = mocker.patch('app.template_previews.TemplatePreview.from_database_object') template = LetterPreviewTemplate(mock_get_service_letter_template(None, None)['data']) - ret = TemplatePreview.from_utils_template(template, 'foo') + ret = partial_call(template, 'foo') assert ret == mock_from_db.return_value - mock_from_db.assert_called_once_with(template._template, 'foo', template.values) + mock_from_db.assert_called_once_with(template._template, 'foo', template.values, page=expected_page_argument) -def test_from_database_object_makes_request(mocker, client): +@pytest.mark.parametrize('partial_call, expected_url', [ + ( + partial(TemplatePreview.from_database_object, filetype='bar'), + 'http://localhost:6013/preview.bar', + ), + ( + partial(TemplatePreview.from_database_object, filetype='baz'), + 'http://localhost:6013/preview.baz', + ), + ( + partial(TemplatePreview.from_database_object, filetype='bar', page=99), + 'http://localhost:6013/preview.bar?page=99', + ), +]) +def test_from_database_object_makes_request( + mocker, + client, + partial_call, + expected_url, +): resp = Mock(content='a', status_code='b', headers={'c': 'd'}) request_mock = mocker.patch('app.template_previews.requests.post', return_value=resp) mocker.patch('app.template_previews.current_service', __getitem__=Mock(return_value='123')) - ret = TemplatePreview.from_database_object(template='foo', filetype='bar') + ret = partial_call(template='foo') assert ret[0] == 'a' assert ret[1] == 'b' assert list(ret[2]) == [('c', 'd')] - url = 'http://localhost:6013/preview.bar' + data = { 'letter_contact_block': '123', 'template': 'foo', @@ -33,4 +64,4 @@ def test_from_database_object_makes_request(mocker, client): } headers = {'Authorization': 'Token my-secret-key'} - request_mock.assert_called_once_with(url, json=data, headers=headers) + request_mock.assert_called_once_with(expected_url, json=data, headers=headers)