Files
notifications-admin/app/template_previews.py
Katie Smith 7368245c9a Show letter preview once file is uploaded
This shows the sanitised letter preview if the file had no validation
errors or the preview with the overlay if it failed validation.
2019-09-12 09:54:36 +01:00

111 lines
3.8 KiB
Python

import base64
from io import BytesIO
import requests
from flask import current_app, json
from notifications_utils.pdf import extract_page_from_pdf
from app import current_service
class TemplatePreview:
@classmethod
def from_database_object(cls, template, filetype, values=None, page=None):
data = {
'letter_contact_block': template.get('reply_to_text', ''),
'template': template,
'values': values,
'filename': current_service.letter_branding and current_service.letter_branding['filename']
}
resp = requests.post(
'{}/preview.{}{}'.format(
current_app.config['TEMPLATE_PREVIEW_API_HOST'],
filetype,
'?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())
@classmethod
def from_valid_pdf_file(cls, pdf_file, page):
pdf_page = extract_page_from_pdf(BytesIO(pdf_file), int(page) - 1)
response = requests.post(
'{}/precompiled-preview.png{}'.format(
current_app.config['TEMPLATE_PREVIEW_API_HOST'],
'?hide_notify=true' if page == '1' else ''
),
data=base64.b64encode(pdf_page).decode('utf-8'),
headers={'Authorization': 'Token {}'.format(current_app.config['TEMPLATE_PREVIEW_API_KEY'])}
)
return (response.content, response.status_code, response.headers.items())
@classmethod
def from_invalid_pdf_file(cls, pdf_file, page):
pdf_page = extract_page_from_pdf(BytesIO(pdf_file), int(page) - 1)
response = requests.post(
'{}/precompiled/overlay.png{}'.format(
current_app.config['TEMPLATE_PREVIEW_API_HOST'],
'?page_number={}'.format(page)
),
data=pdf_page,
headers={'Authorization': 'Token {}'.format(current_app.config['TEMPLATE_PREVIEW_API_KEY'])}
)
return (response.content, response.status_code, response.headers.items())
@classmethod
def from_example_template(cls, template, filename):
data = {
'letter_contact_block': template.get('reply_to_text'),
'template': template,
'values': None,
'filename': filename
}
resp = requests.post(
'{}/preview.png'.format(current_app.config['TEMPLATE_PREVIEW_API_HOST']),
json=data,
headers={'Authorization': 'Token {}'.format(current_app.config['TEMPLATE_PREVIEW_API_KEY'])}
)
return (resp.content, resp.status_code, resp.headers.items())
@classmethod
def from_utils_template(cls, template, filetype, page=None):
return cls.from_database_object(
template._template,
filetype,
template.values,
page=page,
)
def get_page_count_for_letter(template, values=None):
if template['template_type'] != 'letter':
return None
page_count, _, _ = TemplatePreview.from_database_object(template, 'json', values)
page_count = json.loads(page_count.decode('utf-8'))['count']
return page_count
def validate_letter(pdf_file):
return requests.post(
'{}/precompiled/validate?include_preview=true'.format(current_app.config['TEMPLATE_PREVIEW_API_HOST']),
data=pdf_file,
headers={'Authorization': 'Token {}'.format(current_app.config['TEMPLATE_PREVIEW_API_KEY'])}
)
def sanitise_letter(pdf_file):
return requests.post(
'{}/precompiled/sanitise'.format(current_app.config['TEMPLATE_PREVIEW_API_HOST']),
data=pdf_file,
headers={'Authorization': 'Token {}'.format(current_app.config['TEMPLATE_PREVIEW_API_KEY'])}
)