diff --git a/app/main/views/templates.py b/app/main/views/templates.py index 3146cbec0..f6505c830 100644 --- a/app/main/views/templates.py +++ b/app/main/views/templates.py @@ -3,10 +3,12 @@ from string import ascii_uppercase from flask import request, render_template, redirect, url_for, flash, abort from flask_login import login_required +from flask_weasyprint import HTML, render_pdf from dateutil.parser import parse from notifications_utils.template import Template from notifications_utils.recipients import first_column_headings +from notifications_utils.renderers import LetterPreview from notifications_python_client.errors import HTTPError from app.main import main @@ -51,6 +53,17 @@ def view_template(service_id, template_id): ) +@main.route("/services//templates/.pdf") +@login_required +@user_has_permissions('view_activity', admin_override=True) +def view_letter_template_as_pdf(service_id, template_id): + template = Template( + service_api_client.get_service_template(service_id, template_id)['data'], + renderer=LetterPreview() + ) + return render_pdf(HTML(string=template.rendered)) + + @main.route("/services//templates//version/") @login_required @user_has_permissions( diff --git a/docker/Dockerfile-build b/docker/Dockerfile-build index 4c665c157..b58e945a2 100644 --- a/docker/Dockerfile-build +++ b/docker/Dockerfile-build @@ -26,6 +26,14 @@ RUN \ python-dev \ libffi-dev \ libssl-dev \ + libexif-dev \ + libfreetype6-dev \ + libjpeg-dev \ + liblcms2-2 \ + libtiff5-dev \ + zlib1g-dev \ + libpango1.0-dev \ + libcairo2-dev \ && echo "Install nodejs" \ && cd /tmp \ diff --git a/tests/app/main/views/test_templates.py b/tests/app/main/views/test_templates.py index 7320b6e24..9d7951a59 100644 --- a/tests/app/main/views/test_templates.py +++ b/tests/app/main/views/test_templates.py @@ -1,5 +1,6 @@ +from functools import partial from datetime import datetime -from unittest.mock import Mock +from unittest.mock import Mock, patch import pytest from bs4 import BeautifulSoup @@ -39,6 +40,38 @@ def test_should_show_page_for_one_template( service_id, template_id) +@pytest.mark.parametrize( + 'view, expected_content_type', + [ + ('.view_letter_template_as_pdf', 'application/pdf'), + ] +) +@patch("app.main.views.templates.LetterPreview.__call__") +def test_should_show_preview_letter_templates( + mock_letter_preview, + view, + expected_content_type, + client, + api_user_active, + mock_login, + mock_get_service, + mock_get_service_template, + mock_get_user, + mock_get_user_by_email, + mock_has_permissions, + fake_uuid +): + client.login(api_user_active) + service_id = fake_uuid + template_id = fake_uuid + response = client.get(url_for(view, service_id=service_id, template_id=template_id)) + + assert response.status_code == 200 + assert response.content_type == expected_content_type + mock_get_service_template.assert_called_with(service_id, template_id) + assert mock_letter_preview.call_args[0][0]['content'] == "Your vehicle tax is about to expire" + + def test_should_redirect_when_saving_a_template(app_, api_user_active, mock_login,