From 3762daad84a3908172781e29f60a68b7fdd7d6dc Mon Sep 17 00:00:00 2001
From: Chris Hill-Scott
Date: Wed, 15 Jan 2020 10:56:14 +0000
Subject: [PATCH] Add a redirect for the letter specification
This way we have a URL we can give people that always points to the
latest version of the spec.
And it makes our code more Flask-idiomatic to be using `url_for` to be
generating a URL, rather than passing around a constant.
---
app/main/views/index.py | 15 +++++++++------
app/main/views/uploads.py | 2 --
app/navigation.py | 4 ++++
app/templates/views/features/letters.html | 2 +-
app/templates/views/uploads/choose-file.html | 2 +-
app/utils.py | 20 ++++++++------------
tests/app/main/views/test_index.py | 18 ++++++++++++++++++
tests/app/test_utils.py | 10 ++++------
8 files changed, 45 insertions(+), 28 deletions(-)
diff --git a/app/main/views/index.py b/app/main/views/index.py
index 7f21ac340..a910963e6 100644
--- a/app/main/views/index.py
+++ b/app/main/views/index.py
@@ -17,11 +17,7 @@ from app.main import main
from app.main.forms import FieldWithNoneOption, SearchByNameForm
from app.main.views.feedback import QUESTION_TICKET_TYPE
from app.main.views.sub_navigation_dictionaries import features_nav, pricing_nav
-from app.utils import (
- LETTER_SPECIFICATION_URL,
- get_logo_cdn_domain,
- user_is_logged_in,
-)
+from app.utils import get_logo_cdn_domain, user_is_logged_in
@main.route('/')
@@ -273,7 +269,6 @@ def features_sms():
def features_letters():
return render_template(
'views/features/letters.html',
- letter_specification_url=LETTER_SPECIFICATION_URL,
navigation_links=features_nav()
)
@@ -348,3 +343,11 @@ def old_page_redirects():
'main.old_integration_testing': 'main.integration_testing',
}
return redirect(url_for(redirects[request.endpoint]), code=301)
+
+
+@main.route('/docs/notify-pdf-letter-spec-latest.pdf')
+def letter_spec():
+ return redirect(
+ 'https://docs.notifications.service.gov.uk'
+ '/documentation/images/notify-pdf-letter-spec-v2.4.pdf'
+ )
diff --git a/app/main/views/uploads.py b/app/main/views/uploads.py
index a403e76cc..fcbd64ef0 100644
--- a/app/main/views/uploads.py
+++ b/app/main/views/uploads.py
@@ -33,7 +33,6 @@ from app.s3_client.s3_letter_upload_client import (
)
from app.template_previews import TemplatePreview, sanitise_letter
from app.utils import (
- LETTER_SPECIFICATION_URL,
generate_next_dict,
generate_previous_dict,
get_letter_validation_error,
@@ -66,7 +65,6 @@ def uploads(service_id):
prev_page=prev_page,
next_page=next_page,
scheduled_jobs='',
- letter_specification_url=LETTER_SPECIFICATION_URL,
)
diff --git a/app/navigation.py b/app/navigation.py
index 354483c7d..8cbd0ecab 100644
--- a/app/navigation.py
+++ b/app/navigation.py
@@ -208,6 +208,7 @@ class HeaderNavigation(Navigation):
'invite_org_user',
'invite_user',
'no_cookie.letter_branding_preview_image',
+ 'letter_spec',
'letter_template',
'link_service_to_organisation',
'manage_org_users',
@@ -533,6 +534,7 @@ class MainNavigation(Navigation):
'no_cookie.letter_branding_preview_image',
'live_services',
'live_services_csv',
+ 'letter_spec',
'letter_template',
'message_status',
'manage_org_users',
@@ -763,6 +765,7 @@ class CaseworkNavigation(Navigation):
'invite_user',
'no_cookie.letter_branding_preview_image',
'letter_branding',
+ 'letter_spec',
'letter_template',
'link_service_to_organisation',
'live_services',
@@ -1049,6 +1052,7 @@ class OrgNavigation(Navigation):
'invite_user',
'letter_branding',
'no_cookie.letter_branding_preview_image',
+ 'letter_spec',
'letter_template',
'link_service_to_organisation',
'live_services',
diff --git a/app/templates/views/features/letters.html b/app/templates/views/features/letters.html
index 12bd5112f..1b498a05b 100644
--- a/app/templates/views/features/letters.html
+++ b/app/templates/views/features/letters.html
@@ -33,7 +33,7 @@
Upload your own letters
You can create reusable letter templates in Notify, or upload and send your own letters with the Notify API.
- Use the letter specification document to help you set up your letter, save it as a PDF, then upload it to Notify.
+
Use the letter specification document to help you set up your letter, save it as a PDF, then upload it to Notify.
Read our API documentation for more information.
Pricing
diff --git a/app/templates/views/uploads/choose-file.html b/app/templates/views/uploads/choose-file.html
index 0593157e8..70adde281 100644
--- a/app/templates/views/uploads/choose-file.html
+++ b/app/templates/views/uploads/choose-file.html
@@ -33,7 +33,7 @@
)}}
You can upload a single letter as a PDF.
- Your file must meet our letter specification.
+ Your file must meet our letter specification.
To help you set up your letter you can download a Word document template.
diff --git a/app/utils.py b/app/utils.py
index 5c89b0c85..56d711117 100644
--- a/app/utils.py
+++ b/app/utils.py
@@ -566,33 +566,27 @@ def get_letter_printing_statement(status, created_at):
return 'Printed on {} at 5:30pm'.format(printed_date)
-LETTER_SPECIFICATION_URL = (
- 'https://docs.notifications.service.gov.uk'
- '/documentation/images/notify-pdf-letter-spec-v2.4.pdf'
-)
-
-
LETTER_VALIDATION_MESSAGES = {
'letter-not-a4-portrait-oriented': {
'title': 'Your letter is not A4 portrait size',
'detail': (
'You need to change the size or orientation of {invalid_pages}.
'
- f'Files must meet our letter specification.'
+ 'Files must meet our letter specification.'
),
'summary': (
'Validation failed because {invalid_pages} {invalid_pages_are_or_is} not A4 portrait size.
'
- f'Files must meet our letter specification.'
+ 'Files must meet our letter specification.'
),
},
'content-outside-printable-area': {
'title': 'Your content is outside the printable area',
'detail': (
'You need to edit {invalid_pages}.
'
- f'Files must meet our letter specification.'
+ 'Files must meet our letter specification.'
),
'summary': (
'Validation failed because content is outside the printable area on {invalid_pages}.
'
- f'Files must meet our letter specification.'
+ 'Files must meet our letter specification.'
),
},
'letter-too-long': {
@@ -624,11 +618,11 @@ LETTER_VALIDATION_MESSAGES = {
'title': 'The address block is empty',
'detail': (
'You need to add a recipient address.
'
- f'Files must meet our letter specification.'
+ 'Files must meet our letter specification.'
),
'summary': (
'Validation failed because the address block is empty.
'
- f'Files must meet our letter specification.'
+ 'Files must meet our letter specification.'
),
}
}
@@ -654,11 +648,13 @@ def get_letter_validation_error(validation_message, invalid_pages=None, page_cou
invalid_pages=invalid_pages,
invalid_pages_are_or_is=invalid_pages_are_or_is,
page_count=page_count,
+ letter_spec=url_for('.letter_spec'),
),
'summary': LETTER_VALIDATION_MESSAGES[validation_message]['summary'].format(
invalid_pages=invalid_pages,
invalid_pages_are_or_is=invalid_pages_are_or_is,
page_count=page_count,
+ letter_spec=url_for('.letter_spec'),
),
}
diff --git a/tests/app/main/views/test_index.py b/tests/app/main/views/test_index.py
index 2b5232178..191820595 100644
--- a/tests/app/main/views/test_index.py
+++ b/tests/app/main/views/test_index.py
@@ -254,3 +254,21 @@ def test_letter_template_preview_headers(
)
assert response.headers.get('X-Frame-Options') == 'SAMEORIGIN'
+
+
+def test_letter_spec_redirect(client_request):
+ expected_url = (
+ 'https://docs.notifications.service.gov.uk'
+ '/documentation/images/notify-pdf-letter-spec-v2.4.pdf'
+ )
+ client_request.get(
+ 'main.letter_spec',
+ _expected_status=302,
+ _expected_redirect=expected_url,
+ )
+ client_request.logout()
+ client_request.get(
+ 'main.letter_spec',
+ _expected_status=302,
+ _expected_redirect=expected_url,
+ )
diff --git a/tests/app/test_utils.py b/tests/app/test_utils.py
index 635f4c2ca..9cb005208 100644
--- a/tests/app/test_utils.py
+++ b/tests/app/test_utils.py
@@ -5,6 +5,7 @@ from pathlib import Path
import pytest
from bs4 import BeautifulSoup
+from flask import url_for
from freezegun import freeze_time
from app import format_datetime_relative
@@ -454,15 +455,12 @@ def test_get_letter_validation_error_for_unknown_error():
),
])
def test_get_letter_validation_error_for_known_errors(
+ client_request,
error_message,
expected_title,
expected_content,
expected_summary,
):
- expected_letter_spec_url = (
- 'https://docs.notifications.service.gov.uk/'
- 'documentation/images/notify-pdf-letter-spec-v2.4.pdf'
- )
error = get_letter_validation_error(error_message, invalid_pages=[2], page_count=13)
detail = BeautifulSoup(error['detail'], 'html.parser')
summary = BeautifulSoup(error['summary'], 'html.parser')
@@ -471,10 +469,10 @@ def test_get_letter_validation_error_for_known_errors(
assert detail.text == expected_content
if detail.select_one('a'):
- assert detail.select_one('a')['href'] == expected_letter_spec_url
+ assert detail.select_one('a')['href'] == url_for('.letter_spec')
assert detail.select_one('a')['target'] == '_blank'
assert summary.text == expected_summary
if summary.select_one('a'):
- assert summary.select_one('a')['href'] == expected_letter_spec_url
+ assert summary.select_one('a')['href'] == url_for('.letter_spec')
assert summary.select_one('a')['target'] == '_blank'