From e3670de6c408551b89c3c6e183972976cb5946d2 Mon Sep 17 00:00:00 2001
From: Chris Hill-Scott
- Validation failed – {{ message.title | safe }}. {{ message.detail | safe }} + Validation failed. {{ message.detail | safe }}
{% elif notification_status == 'technical-failure' %}
diff --git a/tests/app/main/views/test_notifications.py b/tests/app/main/views/test_notifications.py
index 9e1c1bcdf..69e1da316 100644
--- a/tests/app/main/views/test_notifications.py
+++ b/tests/app/main/views/test_notifications.py
@@ -331,9 +331,10 @@ def test_notification_page_shows_validation_failed_precompiled_letter(
)
error_message = page.find('p', class_='notification-status-cancelled').text
- assert normalize_spaces(error_message) == \
- "Validation failed – Your content is outside the printable area. " \
- "You need to edit page 1.Files must meet our letter specification."
+ assert normalize_spaces(error_message) == (
+ 'Validation failed. You need to edit page 1.'
+ 'Files must meet our letter specification.'
+ )
assert not page.select('p.notification-status')
From 72abd89fe0b4616f6b2fb37380863c75cb293ca5 Mon Sep 17 00:00:00 2001
From: Chris Hill-Scott 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.
'
- 'Files must meet our letter specification.'
+ 'detail': (
+ 'You need to change the size or orientation of {invalid_pages}.
'
+ '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}.
'
- 'Files must meet our letter specification.'
+ 'detail': (
+ 'You need to edit {invalid_pages}.
'
+ 'Files must meet our letter specification.'
+ ),
},
'letter-too-long': {
'title': 'Your letter is too long',
- 'detail': 'Letters must be 10 pages or less.
Your letter is {page_count} pages long.'
+ 'detail': (
+ 'Letters must be 10 pages or less.
'
+ 'Your letter is {page_count} pages long.'
+ ),
},
'no-encoded-string': {
'title': 'Sanitise failed - No encoded string'
},
'unable-to-read-the-file': {
'title': 'There’s a problem with your file',
- 'detail': 'Notify cannot read this PDF.
Save a new copy of your file and try again.'
+ 'detail': (
+ 'Notify cannot read this PDF.'
+ '
Save a new copy of your file and try again.'
+ ),
},
'address-is-empty': {
'title': 'The address block is empty',
- 'detail': 'You need to add a recipient address.
'
- 'Files must meet our letter specification.'
+ 'detail': (
+ 'You need to add a recipient address.
'
+ 'Files must meet our letter specification.'
+ ),
}
}
diff --git a/tests/app/test_utils.py b/tests/app/test_utils.py
index 8a62252d4..9c555cd5f 100644
--- a/tests/app/test_utils.py
+++ b/tests/app/test_utils.py
@@ -426,9 +426,9 @@ def test_get_letter_validation_error_for_unknown_error():
'Letters must be 10 pages or less.
Your letter is 13 pages long.')
])
def test_get_letter_validation_error_for_known_errors(
- error_message,
- expected_title,
- expected_content,
+ error_message,
+ expected_title,
+ expected_content,
):
error = get_letter_validation_error(error_message, invalid_pages=[2], page_count=13)
From a186d0eeff136666e5e2b035e6c33813d1ec4ce8 Mon Sep 17 00:00:00 2001
From: Chris Hill-Scott Upload your own letters
Pricing
diff --git a/app/templates/views/uploads/choose-file.html b/app/templates/views/uploads/choose-file.html
index 855134988..0593157e8 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 bacce22b8..171734519 100644 --- a/app/utils.py +++ b/app/utils.py @@ -566,21 +566,25 @@ 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}.- Validation failed. {{ message.detail | safe }} + {{ message.summary | safe }}
{% elif notification_status == 'technical-failure' %}
diff --git a/app/utils.py b/app/utils.py
index 171734519..5c89b0c85 100644
--- a/app/utils.py
+++ b/app/utils.py
@@ -579,6 +579,10 @@ LETTER_VALIDATION_MESSAGES = {
'You need to change the size or orientation of {invalid_pages}. 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.
'
f'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.'
+ ),
},
'content-outside-printable-area': {
'title': 'Your content is outside the printable area',
@@ -586,6 +590,10 @@ LETTER_VALIDATION_MESSAGES = {
'You need to edit {invalid_pages}.
'
f'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.'
+ ),
},
'letter-too-long': {
'title': 'Your letter is too long',
@@ -593,6 +601,10 @@ LETTER_VALIDATION_MESSAGES = {
'Letters must be 10 pages or less.
'
'Your letter is {page_count} pages long.'
),
+ 'summary': (
+ 'Validation failed because this letter is {page_count} pages long.
'
+ 'Letters must be 10 pages or less.'
+ ),
},
'no-encoded-string': {
'title': 'Sanitise failed - No encoded string'
@@ -603,6 +615,10 @@ LETTER_VALIDATION_MESSAGES = {
'Notify cannot read this PDF.'
'
Save a new copy of your file and try again.'
),
+ 'summary': (
+ 'Letters must be 10 pages or less.
'
+ 'This letter is {page_count} pages long.'
+ ),
},
'address-is-empty': {
'title': 'The address block is empty',
@@ -610,6 +626,10 @@ LETTER_VALIDATION_MESSAGES = {
'You need to add a recipient address.
'
f'Files must meet our letter specification.'
),
+ 'summary': (
+ 'Validation failed because the address block is empty.
'
+ f'Files must meet our letter specification.'
+ ),
}
}
@@ -618,6 +638,8 @@ def get_letter_validation_error(validation_message, invalid_pages=None, page_cou
if validation_message not in LETTER_VALIDATION_MESSAGES:
return {'title': 'Validation failed'}
+ invalid_pages_are_or_is = 'is' if len(invalid_pages) == 1 else 'are'
+
invalid_pages = unescaped_formatted_list(
invalid_pages or [],
before_each='',
@@ -630,8 +652,14 @@ def get_letter_validation_error(validation_message, invalid_pages=None, page_cou
'title': LETTER_VALIDATION_MESSAGES[validation_message]['title'],
'detail': LETTER_VALIDATION_MESSAGES[validation_message]['detail'].format(
invalid_pages=invalid_pages,
+ invalid_pages_are_or_is=invalid_pages_are_or_is,
page_count=page_count,
- )
+ ),
+ '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,
+ ),
}
diff --git a/tests/app/main/views/test_notifications.py b/tests/app/main/views/test_notifications.py
index 69e1da316..012ccaa1a 100644
--- a/tests/app/main/views/test_notifications.py
+++ b/tests/app/main/views/test_notifications.py
@@ -332,7 +332,7 @@ def test_notification_page_shows_validation_failed_precompiled_letter(
error_message = page.find('p', class_='notification-status-cancelled').text
assert normalize_spaces(error_message) == (
- 'Validation failed. You need to edit page 1.'
+ 'Validation failed because content is outside the printable area on page 1.'
'Files must meet our letter specification.'
)
diff --git a/tests/app/test_utils.py b/tests/app/test_utils.py
index 9c555cd5f..f0004b774 100644
--- a/tests/app/test_utils.py
+++ b/tests/app/test_utils.py
@@ -413,24 +413,57 @@ def test_get_letter_validation_error_for_unknown_error():
}
-@pytest.mark.parametrize('error_message, expected_title, expected_content', [
- ('letter-not-a4-portrait-oriented', 'Your letter is not A4 portrait size',
- 'You need to change the size or orientation of page 2.
Files must meet our '
- 'letter specification.'),
- ('content-outside-printable-area', 'Your content is outside the printable area',
- 'You need to edit page 2.
Files must meet our '
- 'letter specification.'),
- ('letter-too-long', 'Your letter is too long',
- 'Letters must be 10 pages or less.
Your letter is 13 pages long.')
+@pytest.mark.parametrize('error_message, expected_title, expected_content, expected_summary', [
+ (
+ 'letter-not-a4-portrait-oriented',
+ 'Your letter is not A4 portrait size',
+ (
+ 'You need to change the size or orientation of page 2.
Files must meet our '
+ 'letter specification.'
+ ),
+ (
+ 'Validation failed because page 2 is not A4 portrait size.
'
+ 'Files must meet our '
+ 'letter specification.'
+ ),
+ ),
+ (
+ 'content-outside-printable-area',
+ 'Your content is outside the printable area',
+ (
+ 'You need to edit page 2.
Files must meet our '
+ 'letter specification.'
+ ),
+ (
+ 'Validation failed because content is outside the printable area '
+ 'on page 2.
Files must meet our '
+ 'letter specification.'
+ ),
+ ),
+ (
+ 'letter-too-long',
+ 'Your letter is too long',
+ (
+ 'Letters must be 10 pages or less.
Your letter is 13 pages long.'
+ ),
+ (
+ 'Validation failed because this letter is 13 pages long.
'
+ 'Letters must be 10 pages or less.'
+ ),
+ ),
])
def test_get_letter_validation_error_for_known_errors(
error_message,
expected_title,
expected_content,
+ expected_summary,
):
error = get_letter_validation_error(error_message, invalid_pages=[2], page_count=13)
assert error['title'] == expected_title
assert expected_content in error['detail']
+ assert error['summary'] == expected_summary
From b57e4a0d0de2ef8344283c47986e74b2ed278ec8 Mon Sep 17 00:00:00 2001
From: Chris Hill-Scott
Files must meet our '
- 'letter specification.'
+ 'You need to change the size or orientation of page 2. '
+ 'Files must meet our letter specification.'
),
(
- 'Validation failed because page 2 is not A4 portrait size.
'
- 'Files must meet our '
- 'letter specification.'
+ 'Validation failed because page 2 is not A4 portrait size.'
+ 'Files must meet our letter specification.'
),
),
(
'content-outside-printable-area',
'Your content is outside the printable area',
(
- 'You need to edit page 2.
Files must meet our '
- 'letter specification.'
+ 'You need to edit page 2.'
+ 'Files must meet our letter specification.'
),
(
'Validation failed because content is outside the printable area '
- 'on page 2.
Files must meet our '
- 'letter specification.'
+ 'on page 2.'
+ 'Files must meet our letter specification.'
),
),
(
'letter-too-long',
'Your letter is too long',
(
- 'Letters must be 10 pages or less.
Your letter is 13 pages long.'
+ 'Letters must be 10 pages or less. '
+ 'Your letter is 13 pages long.'
),
(
- 'Validation failed because this letter is 13 pages long.
'
+ 'Validation failed because this letter is 13 pages long.'
'Letters must be 10 pages or less.'
),
),
@@ -462,8 +459,22 @@ def test_get_letter_validation_error_for_known_errors(
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')
assert error['title'] == expected_title
- assert expected_content in error['detail']
- assert error['summary'] == expected_summary
+
+ 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')['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')['target'] == '_blank'
From 3762daad84a3908172781e29f60a68b7fdd7d6dc Mon Sep 17 00:00:00 2001
From: Chris Hill-Scott Upload your own letters
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}.- GOV.UK Notify puts small files (known as ‘cookies’) - onto your computer. -
-These cookies are used to remember you once you’ve logged in.
-- Find out how to manage cookies. + Cookies are small files saved on your phone, tablet or computer when you visit a website.
+We use cookies to make GOV.UK Notify work and collect information about how you use our service.
-- We store session cookies on your computer to help keep your information - secure while you use the service. + Essential cookies keep your information secure while you use Notify. We do not need to ask permission to use them.
| - Used to keep you logged in + Used to keep you signed in | 20 hours | +|
| + cookie_policy + | ++ Saves your cookie consent settings + | ++ 1 year + | +
- When you first use the service, you may see a pop-up ‘welcome’ message.
- Once you’ve seen the message, we store a cookie on your computer so it
- knows not to show it again.
+ With your permission, we use Google Analytics to collect data about how you use Notify.
+
+ This information helps us to improve our service.
+ Google is not allowed to use or share our analytics data with anyone. +
++ Google Analytics cookies collect and store anonymised data about: +
+| - seen_cookie_message + _ga | - Saves a message to let us know that you have seen our cookie - message + Checks if you’ve visited GOV.UK Notify before | - 1 month + 2 years + | +
| + _gid + | ++ Checks if you’ve visited GOV.UK Notify before + | ++ 24 hours |
We will retain your personal data for as long as you have a GOV.UK Notify account.
-We design, build and run our systems to make sure that your data is as safe as possible at any stage, both while it’s processed and when it’s stored.
From 28140104f116a44fecb3dd9629f1d193183371e4 Mon Sep 17 00:00:00 2001 From: Tom Byers+ Cookies are small files saved on your phone, tablet or computer when you visit a website. +
+We use cookies to make GOV.UK Notify work and collect information about how you use our service.
+ +