remove pdf/png code from admin app entirely

while PDFs work on paas, they only do that because it turns out the
python buildpack happens to have imagemagick preinstalled - if that
ever changes then it'd break. so move those to the template preview
service. This also means we can get rid of weazyprint and wand
dependencies
This commit is contained in:
Leo Hemsted
2017-04-10 17:25:08 +01:00
parent 64d162d96e
commit a6318f2674
5 changed files with 42 additions and 113 deletions

View File

@@ -19,7 +19,6 @@ from flask import (
) )
from flask_login import login_required, current_user from flask_login import login_required, current_user
from flask_weasyprint import HTML, render_pdf
from notifications_utils.columns import Columns from notifications_utils.columns import Columns
from notifications_utils.recipients import RecipientCSV, first_column_headings, validate_and_format_phone_number from notifications_utils.recipients import RecipientCSV, first_column_headings, validate_and_format_phone_number
@@ -36,9 +35,9 @@ from app.utils import (
get_errors_for_csv, get_errors_for_csv,
Spreadsheet, Spreadsheet,
get_help_argument, get_help_argument,
get_template, get_template
png_from_pdf,
) )
from app.template_previews import TemplatePreview
def get_page_headings(template_type): def get_page_headings(template_type):
@@ -291,24 +290,14 @@ def check_messages(service_id, template_type, upload_id):
) )
@main.route("/services/<service_id>/<template_type>/check/<upload_id>.pdf", methods=['GET']) @main.route("/services/<service_id>/<template_type>/check/<upload_id>.<filetype>", methods=['GET'])
@login_required @login_required
@user_has_permissions('send_texts', 'send_emails', 'send_letters') @user_has_permissions('send_texts', 'send_emails', 'send_letters')
def check_messages_as_pdf(service_id, template_type, upload_id): def check_messages_preview(service_id, template_type, upload_id, filetype):
template = _check_messages( template = _check_messages(
service_id, template_type, upload_id, letters_as_pdf=True service_id, template_type, upload_id, letters_as_pdf=True
)['template'] )['template']
return render_pdf(HTML(string=str(template))) return TemplatePreview.from_utils_template(template, filetype)
@main.route("/services/<service_id>/<template_type>/check/<upload_id>.png", methods=['GET'])
@login_required
@user_has_permissions('send_texts', 'send_emails', 'send_letters')
def check_messages_as_png(service_id, template_type, upload_id):
return send_file(**png_from_pdf(
check_messages_as_pdf(service_id, template_type, upload_id)
))
@main.route("/services/<service_id>/<template_type>/check/<upload_id>", methods=['POST']) @main.route("/services/<service_id>/<template_type>/check/<upload_id>", methods=['POST'])
@login_required @login_required

View File

@@ -1,6 +1,5 @@
from datetime import datetime, timedelta from datetime import datetime, timedelta
from string import ascii_uppercase from string import ascii_uppercase
from io import StringIO
from flask import ( from flask import (
request, request,
@@ -9,21 +8,17 @@ from flask import (
url_for, url_for,
flash, flash,
abort, abort,
send_file,
current_app
) )
from flask_login import login_required, current_user from flask_login import login_required, current_user
from flask_weasyprint import HTML, render_pdf
from dateutil.parser import parse from dateutil.parser import parse
import requests
from notifications_utils.formatters import escape_html from notifications_utils.formatters import escape_html
from notifications_utils.template import LetterPreviewTemplate
from notifications_utils.recipients import first_column_headings from notifications_utils.recipients import first_column_headings
from notifications_python_client.errors import HTTPError from notifications_python_client.errors import HTTPError
from app.main import main from app.main import main
from app.utils import user_has_permissions, get_template, png_from_pdf from app.utils import user_has_permissions, get_template
from app.template_previews import TemplatePreview
from app.main.forms import ( from app.main.forms import (
ChooseTemplateType, ChooseTemplateType,
SMSTemplateForm, SMSTemplateForm,
@@ -89,37 +84,12 @@ def view_template(service_id, template_id):
) )
def get_template_preview(service_id, template_id, filetype): @main.route("/services/<service_id>/templates/<template_id>.<filetype>")
@login_required
@user_has_permissions('view_activity', admin_override=True)
def view_letter_template_as_filetype(service_id, template_id, filetype):
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']
data = { return TemplatePreview.from_database_object(db_template, filetype)
"letter_contact_block": current_service['letter_contact_block'],
"admin_base_url": current_app.config['ADMIN_BASE_URL'],
"template": db_template,
"values": None
}
resp = requests.post(
'{}/preview.{}'.format(current_app.config['TEMPLATE_PREVIEW_SERVICE_URL'], filetype),
json=data,
headers={'Authorization': 'Token my-secret-key'}
)
return resp
@main.route("/services/<service_id>/templates/<template_id>.pdf")
@login_required
@user_has_permissions('view_activity', admin_override=True)
def view_letter_template_as_pdf(service_id, template_id):
resp = get_template_preview(service_id, template_id, 'pdf')
return (resp.content, resp.status_code, resp.headers.items())
@main.route("/services/<service_id>/templates/<template_id>.png")
@login_required
@user_has_permissions('view_activity', admin_override=True)
def view_letter_template_as_png(service_id, template_id):
resp = get_template_preview(service_id, template_id, 'png')
return (resp.content, resp.status_code, resp.headers.items())
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):
return dict(template=get_template( return dict(template=get_template(
@@ -153,7 +123,7 @@ def view_template_version(service_id, template_id, version):
) )
@main.route("/services/<service_id>/templates/<template_id>/version/<int:version>.pdf") @main.route("/services/<service_id>/templates/<template_id>/version/<int:version>.<filetype>")
@login_required @login_required
@user_has_permissions( @user_has_permissions(
'view_activity', 'view_activity',
@@ -164,31 +134,9 @@ def view_template_version(service_id, template_id, version):
admin_override=True, admin_override=True,
any_=True any_=True
) )
def view_template_version_as_pdf(service_id, template_id, version): def view_template_version_preview(service_id, template_id, version, filetype):
return render_pdf(HTML(string=str( db_template = service_api_client.get_service_template(service_id, template_id, version=version)['data']
LetterPreviewTemplate( return TemplatePreview.from_database_object(db_template, filetype)
service_api_client.get_service_template(service_id, template_id, version=version)['data'],
contact_block=current_service['letter_contact_block'],
admin_base_url=current_app.config['ADMIN_BASE_URL']
)
)))
@main.route("/services/<service_id>/templates/<template_id>/version/<int:version>.png")
@login_required
@user_has_permissions(
'view_activity',
'send_texts',
'send_emails',
'manage_templates',
'manage_api_keys',
admin_override=True,
any_=True
)
def view_template_version_as_png(service_id, template_id, version):
return send_file(**png_from_pdf(
view_template_version_as_pdf(service_id, template_id, version)
))
@main.route("/services/<service_id>/templates/add", methods=['GET', 'POST']) @main.route("/services/<service_id>/templates/add", methods=['GET', 'POST'])

View File

@@ -1,17 +1,29 @@
from flask import current_app, current_service from flask import current_app
import requests import requests
from app import current_service
def get_template_preview(template, filetype):
data = { class TemplatePreview:
"letter_contact_block": current_service['letter_contact_block'], @classmethod
"admin_base_url": current_app.config['ADMIN_BASE_URL'], def from_database_object(cls, template, filetype, values=None):
"template": template, data = {
"values": None "letter_contact_block": current_service['letter_contact_block'],
} "admin_base_url": current_app.config['ADMIN_BASE_URL'],
resp = requests.post( "template": template,
'{}/preview.{}'.format(current_app.config['TEMPLATE_PREVIEW_SERVICE_URL'], filetype), "values": values
json=data, }
headers={'Authorization': 'Token my-secret-key'} resp = requests.post(
) '{}/preview.{}'.format(current_app.config['TEMPLATE_PREVIEW_SERVICE_URL'], filetype),
return (resp.content, resp.status_code, resp.headers.items()) json=data,
headers={'Authorization': 'Token my-secret-key'}
)
return (resp.content, resp.status_code, resp.headers.items())
@classmethod
def from_utils_template(cls, template, filetype):
return cls.from_database_object(
template._template,
filetype,
template.values
)

View File

@@ -16,8 +16,6 @@ from flask import (
) )
from flask_login import current_user from flask_login import current_user
from wand.image import Image
from notifications_utils.template import ( from notifications_utils.template import (
SMSPreviewTemplate, SMSPreviewTemplate,
EmailPreviewTemplate, EmailPreviewTemplate,
@@ -327,21 +325,6 @@ def get_template(
) )
def png_from_pdf(pdf_endpoint):
output = BytesIO()
with Image(
blob=pdf_endpoint.get_data(),
resolution=150,
) as image:
with image.convert('png') as converted:
converted.save(file=output)
output.seek(0)
return dict(
filename_or_fp=output,
mimetype='image/png',
)
def get_current_financial_year(): def get_current_financial_year():
now = datetime.utcnow() now = datetime.utcnow()
current_month = int(now.strftime('%-m')) current_month = int(now.strftime('%-m'))

View File

@@ -4,9 +4,7 @@ Flask==0.10.1
Flask-Script==2.0.5 Flask-Script==2.0.5
Flask-WTF==0.11 Flask-WTF==0.11
Flask-Login==0.3.2 Flask-Login==0.3.2
Flask-WeasyPrint==0.5
html5lib==1.0b10
credstash==1.8.0 credstash==1.8.0
boto3==1.4.4 boto3==1.4.4
Pygments==2.0.2 Pygments==2.0.2
@@ -20,7 +18,6 @@ pyexcel-xlsx==0.1.0
pyexcel-ods3==0.1.1 pyexcel-ods3==0.1.1
pytz==2016.4 pytz==2016.4
six==1.10.0 six==1.10.0
wand==0.4.4
gunicorn==19.6.0 gunicorn==19.6.0
whitenoise==1.0.6 #manages static assets whitenoise==1.0.6 #manages static assets