diff --git a/app/template/rest.py b/app/template/rest.py index 038f249bf..528fdd22c 100644 --- a/app/template/rest.py +++ b/app/template/rest.py @@ -1,10 +1,11 @@ from flask import ( Blueprint, + current_app, jsonify, - request, - current_app + request ) +from app.dao.notifications_dao import get_notification_by_id from app.dao.templates_dao import ( dao_update_template, dao_create_template, @@ -12,8 +13,8 @@ from app.dao.templates_dao import ( dao_get_template_by_id_and_service_id, dao_get_all_templates_for_service, 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 app.dao.services_dao import dao_fetch_service_by_id from app.models import SMS_TYPE @@ -179,3 +180,43 @@ def redact_template(template, data): if not template.redact_personalisation: dao_redact_template(template, data['created_by']) return 'null', 200 + + +@template_blueprint.route('//pdf-preview//', 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() diff --git a/tests/app/template/test_rest.py b/tests/app/template/test_rest.py index 1324a9915..0747652c3 100644 --- a/tests/app/template/test_rest.py +++ b/tests/app/template/test_rest.py @@ -6,6 +6,7 @@ from datetime import datetime, timedelta import pytest from freezegun import freeze_time +from app.errors import InvalidRequest 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 @@ -14,9 +15,9 @@ from tests.app.conftest import ( sample_template as create_sample_template, sample_template_without_email_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.conftest import set_config_values @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.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