mirror of
https://github.com/GSA/notifications-api.git
synced 2026-09-11 18:38:14 -04:00
Merge pull request #2809 from alphagov/bump-utils-38.0.0
Bump utils to 39.0.0
This commit is contained in:
@@ -40,6 +40,7 @@ from app.letters.utils import (
|
|||||||
get_file_names_from_error_bucket,
|
get_file_names_from_error_bucket,
|
||||||
)
|
)
|
||||||
from app.models import (
|
from app.models import (
|
||||||
|
INTERNATIONAL_LETTERS,
|
||||||
KEY_TYPE_TEST,
|
KEY_TYPE_TEST,
|
||||||
NOTIFICATION_CREATED,
|
NOTIFICATION_CREATED,
|
||||||
NOTIFICATION_DELIVERED,
|
NOTIFICATION_DELIVERED,
|
||||||
@@ -227,6 +228,9 @@ def sanitise_letter(self, filename):
|
|||||||
kwargs={
|
kwargs={
|
||||||
'notification_id': str(notification.id),
|
'notification_id': str(notification.id),
|
||||||
'filename': filename,
|
'filename': filename,
|
||||||
|
'allow_international_letters': notification.service.has_permission(
|
||||||
|
INTERNATIONAL_LETTERS
|
||||||
|
),
|
||||||
},
|
},
|
||||||
queue=QueueNames.SANITISE_LETTERS,
|
queue=QueueNames.SANITISE_LETTERS,
|
||||||
)
|
)
|
||||||
|
|||||||
+1
-3
@@ -126,9 +126,7 @@ def get_recipient_csv_and_template_and_sender_id(job):
|
|||||||
template = db_template._as_utils_template()
|
template = db_template._as_utils_template()
|
||||||
|
|
||||||
contents, meta_data = s3.get_job_and_metadata_from_s3(service_id=str(job.service_id), job_id=str(job.id))
|
contents, meta_data = s3.get_job_and_metadata_from_s3(service_id=str(job.service_id), job_id=str(job.id))
|
||||||
recipient_csv = RecipientCSV(file_data=contents,
|
recipient_csv = RecipientCSV(contents, template=template)
|
||||||
template_type=template.template_type,
|
|
||||||
placeholders=template.placeholders)
|
|
||||||
|
|
||||||
return recipient_csv, template, meta_data.get("sender_id")
|
return recipient_csv, template, meta_data.get("sender_id")
|
||||||
|
|
||||||
|
|||||||
@@ -36,6 +36,7 @@ from app.models import (
|
|||||||
NOTIFICATION_SENDING,
|
NOTIFICATION_SENDING,
|
||||||
NOTIFICATION_DELIVERED,
|
NOTIFICATION_DELIVERED,
|
||||||
NOTIFICATION_PENDING_VIRUS_CHECK,
|
NOTIFICATION_PENDING_VIRUS_CHECK,
|
||||||
|
INTERNATIONAL_LETTERS,
|
||||||
Notification)
|
Notification)
|
||||||
from app.notifications.process_letter_notifications import (
|
from app.notifications.process_letter_notifications import (
|
||||||
create_letter_notification
|
create_letter_notification
|
||||||
@@ -345,7 +346,10 @@ def process_letter_notification(*, letter_data, api_key, template, reply_to_text
|
|||||||
template=template,
|
template=template,
|
||||||
reply_to_text=reply_to_text)
|
reply_to_text=reply_to_text)
|
||||||
|
|
||||||
address = PostalAddress.from_personalisation(letter_data['personalisation'])
|
address = PostalAddress.from_personalisation(
|
||||||
|
letter_data['personalisation'],
|
||||||
|
allow_international_letters=api_key.service.has_permission(INTERNATIONAL_LETTERS),
|
||||||
|
)
|
||||||
|
|
||||||
if not address.has_enough_lines:
|
if not address.has_enough_lines:
|
||||||
raise ValidationError(
|
raise ValidationError(
|
||||||
@@ -357,7 +361,11 @@ def process_letter_notification(*, letter_data, api_key, template, reply_to_text
|
|||||||
message=f'Address must be no more than {PostalAddress.MAX_LINES} lines'
|
message=f'Address must be no more than {PostalAddress.MAX_LINES} lines'
|
||||||
)
|
)
|
||||||
|
|
||||||
if not address.postcode:
|
if not address.has_valid_last_line:
|
||||||
|
if address.allow_international_letters:
|
||||||
|
raise ValidationError(
|
||||||
|
message=f'Last line of address must be a real UK postcode or another country'
|
||||||
|
)
|
||||||
raise ValidationError(
|
raise ValidationError(
|
||||||
message='Must be a real UK postcode'
|
message='Must be a real UK postcode'
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -26,6 +26,6 @@ notifications-python-client==5.5.1
|
|||||||
# PaaS
|
# PaaS
|
||||||
awscli-cwlogs>=1.4,<1.5
|
awscli-cwlogs>=1.4,<1.5
|
||||||
|
|
||||||
git+https://github.com/alphagov/notifications-utils.git@37.3.0#egg=notifications-utils==37.3.0
|
git+https://github.com/alphagov/notifications-utils.git@39.0.0#egg=notifications-utils==39.0.0
|
||||||
|
|
||||||
gds-metrics==0.2.0
|
gds-metrics==0.2.0
|
||||||
|
|||||||
+5
-5
@@ -28,7 +28,7 @@ notifications-python-client==5.5.1
|
|||||||
# PaaS
|
# PaaS
|
||||||
awscli-cwlogs>=1.4,<1.5
|
awscli-cwlogs>=1.4,<1.5
|
||||||
|
|
||||||
git+https://github.com/alphagov/notifications-utils.git@37.3.0#egg=notifications-utils==37.3.0
|
git+https://github.com/alphagov/notifications-utils.git@39.0.0#egg=notifications-utils==39.0.0
|
||||||
|
|
||||||
gds-metrics==0.2.0
|
gds-metrics==0.2.0
|
||||||
|
|
||||||
@@ -37,17 +37,17 @@ alembic==1.4.2
|
|||||||
amqp==1.4.9
|
amqp==1.4.9
|
||||||
anyjson==0.3.3
|
anyjson==0.3.3
|
||||||
attrs==19.3.0
|
attrs==19.3.0
|
||||||
awscli==1.18.45
|
awscli==1.18.48
|
||||||
bcrypt==3.1.7
|
bcrypt==3.1.7
|
||||||
billiard==3.3.0.23
|
billiard==3.3.0.23
|
||||||
bleach==3.1.4
|
bleach==3.1.4
|
||||||
blinker==1.4
|
blinker==1.4
|
||||||
boto==2.49.0
|
boto==2.49.0
|
||||||
boto3==1.10.38
|
boto3==1.10.38
|
||||||
botocore==1.15.45
|
botocore==1.15.48
|
||||||
certifi==2020.4.5.1
|
certifi==2020.4.5.1
|
||||||
chardet==3.0.4
|
chardet==3.0.4
|
||||||
click==7.1.1
|
click==7.1.2
|
||||||
colorama==0.4.3
|
colorama==0.4.3
|
||||||
dnspython==1.16.0
|
dnspython==1.16.0
|
||||||
docutils==0.15.2
|
docutils==0.15.2
|
||||||
@@ -74,7 +74,7 @@ pyrsistent==0.16.0
|
|||||||
python-dateutil==2.8.1
|
python-dateutil==2.8.1
|
||||||
python-editor==1.0.4
|
python-editor==1.0.4
|
||||||
python-json-logger==0.1.11
|
python-json-logger==0.1.11
|
||||||
pytz==2019.3
|
pytz==2020.1
|
||||||
PyYAML==5.3.1
|
PyYAML==5.3.1
|
||||||
redis==3.4.1
|
redis==3.4.1
|
||||||
requests==2.23.0
|
requests==2.23.0
|
||||||
|
|||||||
@@ -31,8 +31,10 @@ from app.celery.letters_pdf_tasks import (
|
|||||||
from app.config import QueueNames, TaskNames
|
from app.config import QueueNames, TaskNames
|
||||||
from app.letters.utils import ScanErrorType
|
from app.letters.utils import ScanErrorType
|
||||||
from app.models import (
|
from app.models import (
|
||||||
|
INTERNATIONAL_LETTERS,
|
||||||
KEY_TYPE_NORMAL,
|
KEY_TYPE_NORMAL,
|
||||||
KEY_TYPE_TEST,
|
KEY_TYPE_TEST,
|
||||||
|
LETTER_TYPE,
|
||||||
Notification,
|
Notification,
|
||||||
NOTIFICATION_CREATED,
|
NOTIFICATION_CREATED,
|
||||||
NOTIFICATION_DELIVERED,
|
NOTIFICATION_DELIVERED,
|
||||||
@@ -42,7 +44,7 @@ from app.models import (
|
|||||||
NOTIFICATION_VIRUS_SCAN_FAILED,
|
NOTIFICATION_VIRUS_SCAN_FAILED,
|
||||||
)
|
)
|
||||||
|
|
||||||
from tests.app.db import create_notification, create_letter_branding
|
from tests.app.db import create_notification, create_letter_branding, create_service
|
||||||
|
|
||||||
from tests.conftest import set_config_values
|
from tests.conftest import set_config_values
|
||||||
|
|
||||||
@@ -546,16 +548,32 @@ def test_move_invalid_letter_and_update_status_logs_error_and_sets_tech_failure_
|
|||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
def test_sanitise_letter_calls_template_preview_sanitise_task(mocker, sample_letter_notification):
|
@pytest.mark.parametrize('permissions, expected_international_letters_allowed', (
|
||||||
|
([LETTER_TYPE], False),
|
||||||
|
([LETTER_TYPE, INTERNATIONAL_LETTERS], True),
|
||||||
|
))
|
||||||
|
def test_sanitise_letter_calls_template_preview_sanitise_task(
|
||||||
|
mocker,
|
||||||
|
sample_letter_notification,
|
||||||
|
permissions,
|
||||||
|
expected_international_letters_allowed,
|
||||||
|
):
|
||||||
mock_celery = mocker.patch('app.celery.letters_pdf_tasks.notify_celery.send_task')
|
mock_celery = mocker.patch('app.celery.letters_pdf_tasks.notify_celery.send_task')
|
||||||
filename = 'NOTIFY.{}'.format(sample_letter_notification.reference)
|
filename = 'NOTIFY.{}'.format(sample_letter_notification.reference)
|
||||||
|
sample_letter_notification.service = create_service(
|
||||||
|
service_permissions=permissions
|
||||||
|
)
|
||||||
sample_letter_notification.status = NOTIFICATION_PENDING_VIRUS_CHECK
|
sample_letter_notification.status = NOTIFICATION_PENDING_VIRUS_CHECK
|
||||||
|
|
||||||
sanitise_letter(filename)
|
sanitise_letter(filename)
|
||||||
|
|
||||||
mock_celery.assert_called_once_with(
|
mock_celery.assert_called_once_with(
|
||||||
name=TaskNames.SANITISE_LETTER,
|
name=TaskNames.SANITISE_LETTER,
|
||||||
kwargs={'notification_id': str(sample_letter_notification.id), 'filename': filename},
|
kwargs={
|
||||||
|
'notification_id': str(sample_letter_notification.id),
|
||||||
|
'filename': filename,
|
||||||
|
'allow_international_letters': expected_international_letters_allowed,
|
||||||
|
},
|
||||||
queue=QueueNames.SANITISE_LETTERS,
|
queue=QueueNames.SANITISE_LETTERS,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|||||||
@@ -340,7 +340,7 @@ def test_should_process_letter_job(sample_letter_job, mocker):
|
|||||||
|
|
||||||
row_call = process_row_mock.mock_calls[0][1]
|
row_call = process_row_mock.mock_calls[0][1]
|
||||||
assert row_call[0].index == 0
|
assert row_call[0].index == 0
|
||||||
assert row_call[0].recipient == ['A1', 'A2', 'A3', 'A4', None, None, 'A_POST']
|
assert row_call[0].recipient == ['A1', 'A2', 'A3', 'A4', None, None, 'A_POST', None]
|
||||||
assert row_call[0].personalisation == {
|
assert row_call[0].personalisation == {
|
||||||
'addressline1': 'A1',
|
'addressline1': 'A1',
|
||||||
'addressline2': 'A2',
|
'addressline2': 'A2',
|
||||||
@@ -407,6 +407,7 @@ def test_process_row_sends_letter_task(template_type, research_mode, expected_fu
|
|||||||
recipient_column_headers=['to'],
|
recipient_column_headers=['to'],
|
||||||
placeholders={'foo'},
|
placeholders={'foo'},
|
||||||
template=template,
|
template=template,
|
||||||
|
allow_international_letters=True,
|
||||||
),
|
),
|
||||||
template,
|
template,
|
||||||
job,
|
job,
|
||||||
@@ -449,6 +450,7 @@ def test_process_row_when_sender_id_is_provided(mocker, fake_uuid):
|
|||||||
recipient_column_headers=['to'],
|
recipient_column_headers=['to'],
|
||||||
placeholders={'foo'},
|
placeholders={'foo'},
|
||||||
template=template,
|
template=template,
|
||||||
|
allow_international_letters=True,
|
||||||
),
|
),
|
||||||
template,
|
template,
|
||||||
job,
|
job,
|
||||||
@@ -1418,6 +1420,7 @@ def test_get_letter_template_instance(mocker, sample_job):
|
|||||||
'address line 5',
|
'address line 5',
|
||||||
'address line 6',
|
'address line 6',
|
||||||
'postcode',
|
'postcode',
|
||||||
|
'address line 7',
|
||||||
]
|
]
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -18,7 +18,8 @@ from app.models import (
|
|||||||
NOTIFICATION_SENDING,
|
NOTIFICATION_SENDING,
|
||||||
NOTIFICATION_DELIVERED,
|
NOTIFICATION_DELIVERED,
|
||||||
NOTIFICATION_PENDING_VIRUS_CHECK,
|
NOTIFICATION_PENDING_VIRUS_CHECK,
|
||||||
SMS_TYPE
|
SMS_TYPE,
|
||||||
|
INTERNATIONAL_LETTERS,
|
||||||
)
|
)
|
||||||
from app.schema_validation import validate
|
from app.schema_validation import validate
|
||||||
from app.v2.errors import RateLimitError
|
from app.v2.errors import RateLimitError
|
||||||
@@ -144,8 +145,49 @@ def test_post_letter_notification_formats_postcode(
|
|||||||
assert notification.personalisation["postcode"] == ' Sw1 1aa '
|
assert notification.personalisation["postcode"] == ' Sw1 1aa '
|
||||||
|
|
||||||
|
|
||||||
def test_post_letter_notification_throws_error_for_bad_postcode(
|
def test_post_letter_notification_stores_country(
|
||||||
client, notify_db_session, mocker
|
client, notify_db_session, mocker
|
||||||
|
):
|
||||||
|
service = create_service(service_permissions=[LETTER_TYPE, INTERNATIONAL_LETTERS])
|
||||||
|
template = create_template(service, template_type="letter")
|
||||||
|
mocker.patch('app.celery.tasks.letters_pdf_tasks.create_letters_pdf.apply_async')
|
||||||
|
data = {
|
||||||
|
'template_id': str(template.id),
|
||||||
|
'personalisation': {
|
||||||
|
'address_line_1': 'Kaiser Wilhelm II',
|
||||||
|
'address_line_2': 'Kronprinzenpalais',
|
||||||
|
'address_line_5': ' deutschland ',
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
resp_json = letter_request(client, data, service_id=service.id)
|
||||||
|
|
||||||
|
assert validate(resp_json, post_letter_response) == resp_json
|
||||||
|
notification = Notification.query.one()
|
||||||
|
# In the personalisation we store what the client gives us
|
||||||
|
assert notification.personalisation["address_line_1"] == 'Kaiser Wilhelm II'
|
||||||
|
assert notification.personalisation["address_line_2"] == 'Kronprinzenpalais'
|
||||||
|
assert notification.personalisation["address_line_5"] == ' deutschland '
|
||||||
|
# In the to field we store the whole address with the canonical country
|
||||||
|
assert notification.to == (
|
||||||
|
'Kaiser Wilhelm II\n'
|
||||||
|
'Kronprinzenpalais\n'
|
||||||
|
'Germany'
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
@pytest.mark.parametrize('permissions, expected_error', (
|
||||||
|
(
|
||||||
|
[LETTER_TYPE],
|
||||||
|
'Must be a real UK postcode',
|
||||||
|
),
|
||||||
|
(
|
||||||
|
[LETTER_TYPE, INTERNATIONAL_LETTERS],
|
||||||
|
'Last line of address must be a real UK postcode or another country',
|
||||||
|
),
|
||||||
|
))
|
||||||
|
def test_post_letter_notification_throws_error_for_bad_postcode(
|
||||||
|
client, notify_db_session, mocker, permissions, expected_error
|
||||||
):
|
):
|
||||||
service = create_service(service_permissions=[LETTER_TYPE])
|
service = create_service(service_permissions=[LETTER_TYPE])
|
||||||
template = create_template(service, template_type="letter", postage="first")
|
template = create_template(service, template_type="letter", postage="first")
|
||||||
|
|||||||
Reference in New Issue
Block a user