Added endpoint to get the letter preview from the template preview app

Is will allow the admin application to call into the api instead of
making the call itself. This will allow the api to make decision for
precompiled pdf without having to update the admin app.

- Added new endpoint
- Added tests for the endpoint
This commit is contained in:
Richard Chapman
2018-02-26 13:57:41 +00:00
committed by Ken Tsang
parent 99a3dc8959
commit 4c8bc9f430
2 changed files with 132 additions and 6 deletions

View File

@@ -1,10 +1,11 @@
from flask import ( from flask import (
Blueprint, Blueprint,
current_app,
jsonify, jsonify,
request, request
current_app
) )
from app.dao.notifications_dao import get_notification_by_id
from app.dao.templates_dao import ( from app.dao.templates_dao import (
dao_update_template, dao_update_template,
dao_create_template, dao_create_template,
@@ -12,8 +13,8 @@ from app.dao.templates_dao import (
dao_get_template_by_id_and_service_id, dao_get_template_by_id_and_service_id,
dao_get_all_templates_for_service, dao_get_all_templates_for_service,
dao_get_template_versions, dao_get_template_versions,
dao_update_template_reply_to dao_update_template_reply_to,
) dao_get_template_by_id)
from notifications_utils.template import SMSMessageTemplate from notifications_utils.template import SMSMessageTemplate
from app.dao.services_dao import dao_fetch_service_by_id from app.dao.services_dao import dao_fetch_service_by_id
from app.models import SMS_TYPE from app.models import SMS_TYPE
@@ -179,3 +180,43 @@ def redact_template(template, data):
if not template.redact_personalisation: if not template.redact_personalisation:
dao_redact_template(template, data['created_by']) dao_redact_template(template, data['created_by'])
return 'null', 200 return 'null', 200
@template_blueprint.route('/<uuid:template_id>/pdf-preview/<uuid:notification_id>/<file_type>', methods=['GET'])
def preview_letter_template_by_notification_id(service_id, template_id, notification_id, file_type):
if file_type not in ('pdf', 'png'):
raise InvalidRequest({'content': ["file_type must be pdf or png"]}, status_code=404)
page = request.args.get('page')
template = dao_get_template_by_id(template_id)
template_for_letter_print = {
"subject": template.subject,
"content": template.content
}
notification = get_notification_by_id(notification_id)
service = dao_fetch_service_by_id(service_id)
data = {
'letter_contact_block': notification.reply_to_text,
'template': template_for_letter_print,
'values': notification.personalisation,
'dvla_org_id': service.dvla_organisation_id,
}
from requests import (post as requests_post)
resp = requests_post(
'{}/preview.{}{}'.format(
current_app.config['TEMPLATE_PREVIEW_API_HOST'],
file_type,
'?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()

View File

@@ -6,6 +6,7 @@ from datetime import datetime, timedelta
import pytest import pytest
from freezegun import freeze_time from freezegun import freeze_time
from app.errors import InvalidRequest
from app.models import Template, SMS_TYPE, EMAIL_TYPE, LETTER_TYPE, TemplateHistory from app.models import Template, SMS_TYPE, EMAIL_TYPE, LETTER_TYPE, TemplateHistory
from app.dao.templates_dao import dao_get_template_by_id, dao_redact_template from app.dao.templates_dao import dao_get_template_by_id, dao_redact_template
@@ -14,9 +15,9 @@ from tests.app.conftest import (
sample_template as create_sample_template, sample_template as create_sample_template,
sample_template_without_email_permission, sample_template_without_email_permission,
sample_template_without_letter_permission, sample_template_without_letter_permission,
sample_template_without_sms_permission, sample_template_without_sms_permission)
)
from tests.app.db import create_service, create_letter_contact, create_template from tests.app.db import create_service, create_letter_contact, create_template
from tests.conftest import set_config_values
@pytest.mark.parametrize('template_type, subject', [ @pytest.mark.parametrize('template_type, subject', [
@@ -794,3 +795,87 @@ def test_update_redact_template_400s_if_no_created_by(admin_request, sample_temp
assert sample_template.redact_personalisation is False assert sample_template.redact_personalisation is False
assert sample_template.template_redacted.updated_at == original_updated_time assert sample_template.template_redacted.updated_at == original_updated_time
def test_preview_letter_template_by_id_invalid_file_type(
sample_service,
sample_letter_template,
sample_letter_notification):
with pytest.raises(InvalidRequest) as exc:
from app.template.rest import preview_letter_template_by_notification_id
preview_letter_template_by_notification_id(
sample_service.id,
sample_letter_template.id,
sample_letter_notification.id,
'doc')
assert 'file_type must be pdf or png' in str(exc.value)
def test_preview_letter_template_by_id_valid_file_type(
notify_api,
client,
sample_service,
sample_letter_template,
sample_letter_notification):
with set_config_values(notify_api, {
'TEMPLATE_PREVIEW_API_HOST': 'http://localhost/notifications-template-preview',
'TEMPLATE_PREVIEW_API_KEY': 'test-key'
}):
import requests_mock
with requests_mock.Mocker() as request_mock:
content = b'\x00\x01'
request_mock.post(
'http://localhost/notifications-template-preview/preview.pdf',
content=content,
headers={'X-pdf-page-count': '1'},
status_code=200
)
from app.template.rest import preview_letter_template_by_notification_id
content, status_code, items = preview_letter_template_by_notification_id(
sample_service.id,
sample_letter_template.id,
sample_letter_notification.id,
'pdf'
)
assert status_code == 200
assert content == content
assert list(items)[0][0] == 'X-pdf-page-count'
assert list(items)[0][1] == '1'
def test_preview_letter_template_by_id_template_preview_404(
notify_api,
client,
sample_service,
sample_letter_template,
sample_letter_notification):
with set_config_values(notify_api, {
'TEMPLATE_PREVIEW_API_HOST': 'http://localhost/notifications-template-preview',
'TEMPLATE_PREVIEW_API_KEY': 'test-key'
}):
import requests_mock
with requests_mock.Mocker() as request_mock:
content = b'\x00\x01'
request_mock.post(
'http://localhost/notifications-template-preview/preview.pdf',
content=content,
headers={'X-pdf-page-count': '1'},
status_code=404
)
from app.template.rest import preview_letter_template_by_notification_id
content, status_code, items = preview_letter_template_by_notification_id(
sample_service.id,
sample_letter_template.id,
sample_letter_notification.id,
'pdf'
)
assert status_code == 404