diff --git a/app/main/views/platform_admin.py b/app/main/views/platform_admin.py index 1029bba3c..e40e33f15 100644 --- a/app/main/views/platform_admin.py +++ b/app/main/views/platform_admin.py @@ -253,20 +253,41 @@ def platform_admin_returned_letters(): @login_required @user_is_platform_admin def platform_admin_letter_validation_preview(): + return letter_validation_preview(from_platform_admin=True) + + +@main.route("/services//letter-validation-preview", methods=["GET", "POST"]) +@login_required +def service_letter_validation_preview(service_id): + return letter_validation_preview(from_platform_admin=False) + + +def letter_validation_preview(from_platform_admin): message, pages, result = None, [], None form = PDFUploadForm() + view_location = 'views/platform-admin/letter-validation-preview.html' \ + if from_platform_admin else'views/letter-validation-preview.html' + if form.validate_on_submit(): pdf_file = form.file.data virus_free = antivirus_client.scan(pdf_file) if not virus_free: return render_template( - 'views/platform-admin/letter-validation-preview.html', + view_location, form=form, message="Document didn't pass the virus scan", pages=pages, result=result ), 400 try: + if len(pdf_file.read()) > (2 * 1024 * 1024): + return render_template( + view_location, + form=form, + message="File must be less than 2MB", + pages=pages, result=result + ), 400 + pdf_file.seek(0) response = validate_letter(pdf_file) response.raise_for_status() if response.status_code == 200: @@ -275,14 +296,14 @@ def platform_admin_letter_validation_preview(): if error.response and error.response.status_code == 400: message = "Something was wrong with the file you tried to upload. Please upload a valid PDF file." return render_template( - 'views/platform-admin/letter-validation-preview.html', + view_location, form=form, message=message, pages=pages, result=result ), 400 else: raise error return render_template( - 'views/platform-admin/letter-validation-preview.html', + view_location, form=form, message=message, pages=pages, result=result ) diff --git a/app/navigation.py b/app/navigation.py index 512c568f5..fd6f18711 100644 --- a/app/navigation.py +++ b/app/navigation.py @@ -233,6 +233,7 @@ class HeaderNavigation(Navigation): 'service_edit_sms_sender', 'service_email_reply_to', 'service_letter_contact_details', + 'service_letter_validation_preview', 'service_name_change', 'service_name_change_confirm', 'service_preview_email_branding', @@ -487,6 +488,7 @@ class MainNavigation(Navigation): 'service_dashboard_updates', 'service_delete_email_reply_to', 'service_delete_sms_sender', + 'service_letter_validation_preview', 'service_switch_can_upload_document', 'service_switch_live', 'service_set_permission', @@ -701,6 +703,7 @@ class CaseworkNavigation(Navigation): 'service_edit_sms_sender', 'service_email_reply_to', 'service_letter_contact_details', + 'service_letter_validation_preview', 'service_name_change', 'service_name_change_confirm', 'service_preview_email_branding', @@ -940,6 +943,7 @@ class OrgNavigation(Navigation): 'service_edit_sms_sender', 'service_email_reply_to', 'service_letter_contact_details', + 'service_letter_validation_preview', 'service_name_change', 'service_name_change_confirm', 'service_preview_email_branding', diff --git a/app/templates/views/letter-validation-preview.html b/app/templates/views/letter-validation-preview.html new file mode 100644 index 000000000..dd9e50740 --- /dev/null +++ b/app/templates/views/letter-validation-preview.html @@ -0,0 +1,57 @@ +{% extends "withnav_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 %} + +{% from "components/form.html" import form_wrapper %} + +{% block service_page_title %} + Letter validation preview +{% endblock %} + +{% block maincolumn_content %} + +
+
+ {% if result %} + {{ banner(message, with_tick=True) }} + {% elif message %} + {{ banner(message, 'dangerous')}} + {% endif %} + +

Letter validation preview

+
+ {{ file_upload( + form.file, + action = url_for('main.service_letter_validation_preview', service_id=current_service.id), + button_text='Choose a file', + )}} +
+ {%if not pages %} +
+

Check your file meets the letter specification

+

Your file must be: +

  • a PDF
  • +
  • no more than 10 pages long
  • +
  • less than 2 MB
  • +

    +

    The content of your letter mut appear inside the printable area.

    +

    + + Download the letter specification for more information. +

    +
    + {% endif%} +
    +
    + + {% for page in pages %} +
    + +
    + {% endfor %} +
    +
    + +{% endblock %} diff --git a/tests/app/main/views/test_platform_admin.py b/tests/app/main/views/test_platform_admin.py index 7fba52400..87a0f90b9 100644 --- a/tests/app/main/views/test_platform_admin.py +++ b/tests/app/main/views/test_platform_admin.py @@ -761,6 +761,36 @@ def test_platform_admin_submit_empty_returned_letters(mocker, client, platform_a assert "Can’t be empty" in response.get_data(as_text=True) +def test_service_letter_validation_preview_renders_correctly( + client_request, + mock_has_no_jobs + +): + page = client_request.get('main.service_letter_validation_preview', service_id="service_1") + + assert page.find('h1').text.strip() == "Letter validation preview" + assert page.find_all('input', class_='file-upload-field') + + +def test_service_letter_validation_preview_returns_400_if_file_is_too_big( + client_request, + mock_has_no_jobs, + mocker + +): + with open('tests/test_pdf_files/big.pdf', 'rb') as file: + page = client_request.post('main.service_letter_validation_preview', service_id="service_1", + _data=dict( + pdf_file=file, + ), + content_type='multipart/form-data', + _follow_redirects=True) + + assert page.find('h1').text.strip() == "Letter validation preview" + assert page.find_all('input', class_='file-upload-field') + page.find('span', class_='error-message').text.strip() == "File must be less than 2MB" + + def test_letter_validation_preview_renders_correctly(mocker, client, platform_admin_user): mock_get_user(mocker, user=platform_admin_user) client.login(platform_admin_user) diff --git a/tests/test_pdf_files/big.pdf b/tests/test_pdf_files/big.pdf new file mode 100644 index 000000000..b617f9a98 Binary files /dev/null and b/tests/test_pdf_files/big.pdf differ