mirror of
https://github.com/GSA/notifications-admin.git
synced 2026-09-10 10:03:21 -04:00
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:
@@ -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
|
||||||
|
|||||||
@@ -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'])
|
||||||
|
|||||||
@@ -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
|
||||||
|
)
|
||||||
|
|||||||
17
app/utils.py
17
app/utils.py
@@ -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'))
|
||||||
|
|||||||
@@ -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
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user