From 3be129241f0ce07c1601bc683fea77c6ac0771e1 Mon Sep 17 00:00:00 2001 From: Pea Tyczynska Date: Wed, 26 Sep 2018 16:42:40 +0100 Subject: [PATCH] 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 --- app/main/forms.py | 7 ++++ app/main/views/platform_admin.py | 26 ++++++++++++- app/navigation.py | 4 ++ app/template_previews.py | 8 ++++ app/templates/components/file-upload.html | 4 +- .../views/platform-admin/_base_template.html | 1 + .../letter-validation-preview.html | 38 +++++++++++++++++++ tests/app/main/views/test_platform_admin.py | 7 ++++ 8 files changed, 93 insertions(+), 2 deletions(-) create mode 100644 app/templates/views/platform-admin/letter-validation-preview.html diff --git a/app/main/forms.py b/app/main/forms.py index 3ac908a59..0ce88c6b0 100644 --- a/app/main/forms.py +++ b/app/main/forms.py @@ -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()]) diff --git a/app/main/views/platform_admin.py b/app/main/views/platform_admin.py index ed710a50c..5faf5e29c 100644 --- a/app/main/views/platform_admin.py +++ b/app/main/views/platform_admin.py @@ -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(): diff --git a/app/navigation.py b/app/navigation.py index 36a126478..ec99d3b4e 100644 --- a/app/navigation.py +++ b/app/navigation.py @@ -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', diff --git a/app/template_previews.py b/app/template_previews.py index cbaea7f2f..81c78a9fb 100644 --- a/app/template_previews.py +++ b/app/template_previews.py @@ -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'])} + ) diff --git a/app/templates/components/file-upload.html b/app/templates/components/file-upload.html index 8843da7c3..78598ca8a 100644 --- a/app/templates/components/file-upload.html +++ b/app/templates/components/file-upload.html @@ -3,7 +3,9 @@ action=None, button_text="Choose file", alternate_link=None, - alternate_link_text=None + alternate_link_text=None, + hint=None + ) %}