mirror of
https://github.com/GSA/notifications-admin.git
synced 2026-08-26 01:04:00 -04:00
Merge pull request #1237 from alphagov/multi-page-previews
Show all pages of a letter in the app
This commit is contained in:
@@ -8,6 +8,7 @@ from flask import (
|
|||||||
url_for,
|
url_for,
|
||||||
flash,
|
flash,
|
||||||
abort,
|
abort,
|
||||||
|
json,
|
||||||
)
|
)
|
||||||
from flask_login import login_required, current_user
|
from flask_login import login_required, current_user
|
||||||
from dateutil.parser import parse
|
from dateutil.parser import parse
|
||||||
@@ -72,15 +73,21 @@ def choose_template(service_id):
|
|||||||
admin_override=True, any_=True
|
admin_override=True, any_=True
|
||||||
)
|
)
|
||||||
def view_template(service_id, template_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(
|
return render_template(
|
||||||
'views/templates/template.html',
|
'views/templates/template.html',
|
||||||
template=get_template(
|
template=get_template(
|
||||||
service_api_client.get_service_template(service_id, template_id)['data'],
|
template,
|
||||||
current_service,
|
current_service,
|
||||||
expand_emails=True,
|
expand_emails=True,
|
||||||
letter_preview_url=url_for('.view_template', service_id=service_id, template_id=template_id),
|
letter_preview_url=url_for('.view_template', service_id=service_id, template_id=template_id),
|
||||||
show_recipient=True,
|
show_recipient=True,
|
||||||
)
|
page_count=page_count,
|
||||||
|
),
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
@@ -92,7 +99,7 @@ def view_letter_template_preview(service_id, template_id, filetype):
|
|||||||
abort(404)
|
abort(404)
|
||||||
|
|
||||||
db_template = service_api_client.get_service_template(service_id, template_id)['data']
|
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):
|
def _view_template_version(service_id, template_id, version, letters_as_pdf=False):
|
||||||
|
|||||||
@@ -6,7 +6,7 @@ from app import current_service
|
|||||||
|
|
||||||
class TemplatePreview:
|
class TemplatePreview:
|
||||||
@classmethod
|
@classmethod
|
||||||
def from_database_object(cls, template, filetype, values=None):
|
def from_database_object(cls, template, filetype, values=None, page=None):
|
||||||
data = {
|
data = {
|
||||||
'letter_contact_block': current_service['letter_contact_block'],
|
'letter_contact_block': current_service['letter_contact_block'],
|
||||||
'template': template,
|
'template': template,
|
||||||
@@ -14,16 +14,21 @@ class TemplatePreview:
|
|||||||
'dvla_org_id': current_service['dvla_organisation'],
|
'dvla_org_id': current_service['dvla_organisation'],
|
||||||
}
|
}
|
||||||
resp = requests.post(
|
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,
|
json=data,
|
||||||
headers={'Authorization': 'Token {}'.format(current_app.config['TEMPLATE_PREVIEW_API_KEY'])}
|
headers={'Authorization': 'Token {}'.format(current_app.config['TEMPLATE_PREVIEW_API_KEY'])}
|
||||||
)
|
)
|
||||||
return (resp.content, resp.status_code, resp.headers.items())
|
return (resp.content, resp.status_code, resp.headers.items())
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def from_utils_template(cls, template, filetype):
|
def from_utils_template(cls, template, filetype, page=None):
|
||||||
return cls.from_database_object(
|
return cls.from_database_object(
|
||||||
template._template,
|
template._template,
|
||||||
filetype,
|
filetype,
|
||||||
template.values
|
template.values,
|
||||||
|
page=page,
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -255,6 +255,7 @@ def get_template(
|
|||||||
show_recipient=False,
|
show_recipient=False,
|
||||||
expand_emails=False,
|
expand_emails=False,
|
||||||
letter_preview_url=None,
|
letter_preview_url=None,
|
||||||
|
page_count=1,
|
||||||
):
|
):
|
||||||
if 'email' == template['template_type']:
|
if 'email' == template['template_type']:
|
||||||
return EmailPreviewTemplate(
|
return EmailPreviewTemplate(
|
||||||
@@ -276,6 +277,7 @@ def get_template(
|
|||||||
return LetterPDFLinkTemplate(
|
return LetterPDFLinkTemplate(
|
||||||
template,
|
template,
|
||||||
preview_url=letter_preview_url,
|
preview_url=letter_preview_url,
|
||||||
|
page_count=int(page_count),
|
||||||
)
|
)
|
||||||
else:
|
else:
|
||||||
return LetterPreviewTemplate(
|
return LetterPreviewTemplate(
|
||||||
|
|||||||
@@ -28,5 +28,4 @@ notifications-python-client>=3.1,<3.2
|
|||||||
awscli>=1.11,<1.12
|
awscli>=1.11,<1.12
|
||||||
awscli-cwlogs>=1.4,<1.5
|
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
|
||||||
|
|
||||||
|
|||||||
@@ -1,30 +1,61 @@
|
|||||||
|
import pytest
|
||||||
|
|
||||||
|
from functools import partial
|
||||||
from unittest.mock import Mock
|
from unittest.mock import Mock
|
||||||
from notifications_utils.template import LetterPreviewTemplate
|
from notifications_utils.template import LetterPreviewTemplate
|
||||||
|
|
||||||
from app.template_previews import TemplatePreview
|
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')
|
mock_from_db = mocker.patch('app.template_previews.TemplatePreview.from_database_object')
|
||||||
template = LetterPreviewTemplate(mock_get_service_letter_template(None, None)['data'])
|
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
|
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'})
|
resp = Mock(content='a', status_code='b', headers={'c': 'd'})
|
||||||
request_mock = mocker.patch('app.template_previews.requests.post', return_value=resp)
|
request_mock = mocker.patch('app.template_previews.requests.post', return_value=resp)
|
||||||
mocker.patch('app.template_previews.current_service', __getitem__=Mock(return_value='123'))
|
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[0] == 'a'
|
||||||
assert ret[1] == 'b'
|
assert ret[1] == 'b'
|
||||||
assert list(ret[2]) == [('c', 'd')]
|
assert list(ret[2]) == [('c', 'd')]
|
||||||
url = 'http://localhost:6013/preview.bar'
|
|
||||||
data = {
|
data = {
|
||||||
'letter_contact_block': '123',
|
'letter_contact_block': '123',
|
||||||
'template': 'foo',
|
'template': 'foo',
|
||||||
@@ -33,4 +64,4 @@ def test_from_database_object_makes_request(mocker, client):
|
|||||||
}
|
}
|
||||||
headers = {'Authorization': 'Token my-secret-key'}
|
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)
|
||||||
|
|||||||
Reference in New Issue
Block a user