Add letter validation preview functionality

- add get/post view
- create a pdf upload form
- add a template where user can upload the file
- check boundaries of the letter by calling template-preview
- display banner messages with boundaries validation result
- display pages of the document, with visible boundaries overlay
if the document did not pass validation, and without overlay
if they do pass validation
This commit is contained in:
Pea Tyczynska
2018-09-26 16:42:40 +01:00
parent 68afbcf60e
commit 3be129241f
8 changed files with 93 additions and 2 deletions

View File

@@ -766,6 +766,13 @@ class ServiceUpdateEmailBranding(StripWhitespaceForm):
)
class PDFUploadForm(StripWhitespaceForm):
file = FileField_wtf(
'Upload a letter in PDF format to check if it fits in the printable area',
validators=[FileAllowed(['pdf'], 'PDF documents only!')]
)
class CreateOrUpdateOrganisation(StripWhitespaceForm):
name = StringField('Name', validators=[DataRequired()])

View File

@@ -13,11 +13,12 @@ from app import (
service_api_client,
)
from app.main import main
from app.main.forms import DateFilterForm, ReturnedLettersForm
from app.main.forms import DateFilterForm, ReturnedLettersForm, PDFUploadForm
from app.statistics_utils import (
get_formatted_percentage,
get_formatted_percentage_two_dp,
)
from app.template_previews import validate_letter
from app.utils import (
generate_next_dict,
generate_previous_dict,
@@ -240,6 +241,29 @@ def platform_admin_returned_letters():
)
@main.route("/platform-admin/letter-validation-preview", methods=["GET", "POST"])
@login_required
@user_is_platform_admin
def platform_admin_letter_validation_preview():
message, pages, result = None, [], None
form = PDFUploadForm()
if request.method == "POST":
pdf_file = form.file.data
response = validate_letter(pdf_file)
if response.status_code == 200:
pages=response.json()["pages"]
message = response.json()["message"]
result = response.json()["result"]
return render_template(
'views/platform-admin/letter-validation-preview.html',
form=form,
message=message,
pages=pages,
result=result
)
def sum_service_usage(service):
total = 0
for notification_type in service['statistics'].keys():

View File

@@ -80,6 +80,7 @@ class HeaderNavigation(Navigation):
'live_services',
'organisations',
'platform_admin',
'platform_admin_letter_validation_preview',
'platform_admin_list_complaints',
'platform_admin_returned_letters',
'suspend_service',
@@ -442,6 +443,7 @@ class MainNavigation(Navigation):
'organisation_settings',
'organisations',
'platform_admin',
'platform_admin_letter_validation_preview',
'platform_admin_list_complaints',
'platform_admin_returned_letters',
'pricing',
@@ -627,6 +629,7 @@ class CaseworkNavigation(Navigation):
'organisation_settings',
'organisations',
'platform_admin',
'platform_admin_letter_validation_preview',
'platform_admin_list_complaints',
'platform_admin_returned_letters',
'pricing',
@@ -853,6 +856,7 @@ class OrgNavigation(Navigation):
'old_using_notify',
'organisations',
'platform_admin',
'platform_admin_letter_validation_preview',
'platform_admin_list_complaints',
'platform_admin_returned_letters',
'pricing',

View File

@@ -43,3 +43,11 @@ def get_page_count_for_letter(template, values=None):
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'])}
)

View File

@@ -3,7 +3,9 @@
action=None,
button_text="Choose file",
alternate_link=None,
alternate_link_text=None
alternate_link_text=None,
hint=None
) %}
<form method="post" enctype="multipart/form-data" {% if action %}action="{{ action }}"{% endif %} class="{% if field.errors %}form-group-error{% endif %}" data-module="file-upload">
<label class="file-upload-label" for="{{ field.name }}">

View File

@@ -23,6 +23,7 @@
('Find users by email', url_for('main.find_users_by_email')),
('Email Complaints', url_for('main.platform_admin_list_complaints')),
('Returned letters', url_for('main.platform_admin_returned_letters')),
('Letter validation preview', url_for('main.platform_admin_letter_validation_preview')),
] %}
<li>
<a href="{{ url }}">

View File

@@ -0,0 +1,38 @@
{% extends "views/platform-admin/_base_template.html" %}
{% from "components/banner.html" import banner %}
{% from "components/textbox.html" import textbox %}
{% from "components/file-upload.html" import file_upload %}
{% from "components/page-footer.html" import page_footer %}
{% block per_page_title %}
{{ page_title|capitalize }}
{% endblock %}
{% block platform_admin_content %}
<div class="grid-row">
<div class="column-whole">
<h1 class="heading-large">Letter Validation Preview</h1>
{{ file_upload(
form.file,
action = url_for('main.platform_admin_letter_validation_preview'),
button_text='Upload a PDF document',
)}}
</div>
<div class="column-whole template-container">
{% if result %}
{{ banner(message, with_tick=True) }}
{% elif message %}
{{ banner(message, 'dangerous')}}
{% endif %}
{% for page in pages %}
<div class="letter">
<img src="data:image/png;base64,{{ page }}">
</div>
{% endfor %}
</div>
</div>
{% endblock %}

View File

@@ -758,3 +758,10 @@ def test_platform_admin_submit_empty_returned_letters(mocker, client, platform_a
assert response.status_code == 200
assert "Cant be empty" in response.get_data(as_text=True)
def test_letter_validation_preview(mocker, client, platform_admin_user):
mock_get_user(mocker, user=platform_admin_user)
client.login(platform_admin_user)
response = client.get(url_for('main.platform_admin_letter_validation_preview'))
assert response.status_code == 200