Change process_sanitised_letter to take a single encrypted arg

Template preview will now send an encrypted dict containing all the args
to the `process_sanitised_letter` task, so this updates the task to
handle data in the new format.
This commit is contained in:
Katie Smith
2020-01-24 09:08:27 +00:00
parent 64c2061baa
commit adf9906a96
2 changed files with 50 additions and 46 deletions

View File

@@ -15,7 +15,7 @@ from celery.exceptions import MaxRetriesExceededError
from notifications_utils.statsd_decorators import statsd from notifications_utils.statsd_decorators import statsd
from notifications_utils.s3 import s3upload from notifications_utils.s3 import s3upload
from app import notify_celery from app import encryption, notify_celery
from app.aws import s3 from app.aws import s3
from app.config import QueueNames, TaskNames from app.config import QueueNames, TaskNames
from app.dao.notifications_dao import ( from app.dao.notifications_dao import (
@@ -302,14 +302,12 @@ def sanitise_letter(self, filename):
@notify_celery.task(name='process-sanitised-letter') @notify_celery.task(name='process-sanitised-letter')
def process_sanitised_letter( def process_sanitised_letter(sanitise_data):
page_count, letter_details = encryption.decrypt(sanitise_data)
message,
invalid_pages, filename = letter_details['filename']
validation_status, notification_id = letter_details['notification_id']
filename,
notification_id,
):
current_app.logger.info('Processing sanitised letter with id {}'.format(notification_id)) current_app.logger.info('Processing sanitised letter with id {}'.format(notification_id))
notification = get_notification_by_id(notification_id, _raise=True) notification = get_notification_by_id(notification_id, _raise=True)
@@ -323,7 +321,7 @@ def process_sanitised_letter(
try: try:
original_pdf_object = s3.get_s3_object(current_app.config['LETTERS_SCAN_BUCKET_NAME'], filename) original_pdf_object = s3.get_s3_object(current_app.config['LETTERS_SCAN_BUCKET_NAME'], filename)
if validation_status == 'failed': if letter_details['validation_status'] == 'failed':
current_app.logger.info('Processing invalid precompiled pdf with id {} (file {})'.format( current_app.logger.info('Processing invalid precompiled pdf with id {} (file {})'.format(
notification_id, filename)) notification_id, filename))
@@ -331,16 +329,16 @@ def process_sanitised_letter(
notification=notification, notification=notification,
filename=filename, filename=filename,
scan_pdf_object=original_pdf_object, scan_pdf_object=original_pdf_object,
message=message, message=letter_details['message'],
invalid_pages=invalid_pages, invalid_pages=letter_details['invalid_pages'],
page_count=page_count, page_count=letter_details['page_count'],
) )
return return
current_app.logger.info('Processing valid precompiled pdf with id {} (file {})'.format( current_app.logger.info('Processing valid precompiled pdf with id {} (file {})'.format(
notification_id, filename)) notification_id, filename))
billable_units = get_billable_units_for_letter_page_count(page_count) billable_units = get_billable_units_for_letter_page_count(letter_details['page_count'])
is_test_key = notification.key_type == KEY_TYPE_TEST is_test_key = notification.key_type == KEY_TYPE_TEST
move_sanitised_letter_to_test_or_live_pdf_bucket(filename, is_test_key, notification.created_at) move_sanitised_letter_to_test_or_live_pdf_bucket(filename, is_test_key, notification.created_at)

View File

@@ -13,6 +13,7 @@ from celery.exceptions import MaxRetriesExceededError, Retry
from requests import RequestException from requests import RequestException
from sqlalchemy.orm.exc import NoResultFound from sqlalchemy.orm.exc import NoResultFound
from app import encryption
from app.errors import VirusScanError from app.errors import VirusScanError
from app.exceptions import NotificationTechnicalFailureException from app.exceptions import NotificationTechnicalFailureException
from app.celery.letters_pdf_tasks import ( from app.celery.letters_pdf_tasks import (
@@ -773,14 +774,15 @@ def test_process_sanitised_letter_with_valid_letter(
sample_letter_notification.billable_units = 1 sample_letter_notification.billable_units = 1
sample_letter_notification.created_at = datetime(2018, 7, 1, 12) sample_letter_notification.created_at = datetime(2018, 7, 1, 12)
process_sanitised_letter( encrypted_data = encryption.encrypt({
page_count=2, 'page_count': 2,
message=None, 'message': None,
invalid_pages=None, 'invalid_pages': None,
validation_status='passed', 'validation_status': 'passed',
filename=filename, 'filename': filename,
notification_id=str(sample_letter_notification.id) 'notification_id': str(sample_letter_notification.id)
) })
process_sanitised_letter(encrypted_data)
assert sample_letter_notification.status == expected_status assert sample_letter_notification.status == expected_status
assert sample_letter_notification.billable_units == 1 assert sample_letter_notification.billable_units == 1
@@ -815,14 +817,15 @@ def test_process_sanitised_letter_with_invalid_letter(sample_letter_notification
sample_letter_notification.billable_units = 1 sample_letter_notification.billable_units = 1
sample_letter_notification.created_at = datetime(2018, 7, 1, 12) sample_letter_notification.created_at = datetime(2018, 7, 1, 12)
process_sanitised_letter( encrypted_data = encryption.encrypt({
page_count=2, 'page_count': 2,
message='content-outside-printable-area', 'message': 'content-outside-printable-area',
invalid_pages=[1], 'invalid_pages': [1],
validation_status='failed', 'validation_status': 'failed',
filename=filename, 'filename': filename,
notification_id=str(sample_letter_notification.id) 'notification_id': str(sample_letter_notification.id)
) })
process_sanitised_letter(encrypted_data)
assert sample_letter_notification.status == NOTIFICATION_VALIDATION_FAILED assert sample_letter_notification.status == NOTIFICATION_VALIDATION_FAILED
assert sample_letter_notification.billable_units == 0 assert sample_letter_notification.billable_units == 0
@@ -842,14 +845,15 @@ def test_process_sanitised_letter_when_letter_status_is_not_pending_virus_scan(
mock_s3 = mocker.patch('app.celery.letters_pdf_tasks.s3') mock_s3 = mocker.patch('app.celery.letters_pdf_tasks.s3')
sample_letter_notification.status = NOTIFICATION_CREATED sample_letter_notification.status = NOTIFICATION_CREATED
process_sanitised_letter( encrypted_data = encryption.encrypt({
page_count=2, 'page_count': 2,
message=None, 'message': None,
invalid_pages=None, 'invalid_pages': None,
validation_status='passed', 'validation_status': 'passed',
filename='NOTIFY.{}'.format(sample_letter_notification.reference), 'filename': 'NOTIFY.{}'.format(sample_letter_notification.reference),
notification_id=str(sample_letter_notification.id) 'notification_id': str(sample_letter_notification.id)
) })
process_sanitised_letter(encrypted_data)
assert not mock_s3.called assert not mock_s3.called
@@ -861,15 +865,17 @@ def test_process_sanitised_letter_puts_letter_into_tech_failure_for_boto_errors(
mocker.patch('app.celery.letters_pdf_tasks.s3.get_s3_object', side_effect=ClientError({}, 'operation_name')) mocker.patch('app.celery.letters_pdf_tasks.s3.get_s3_object', side_effect=ClientError({}, 'operation_name'))
sample_letter_notification.status = NOTIFICATION_PENDING_VIRUS_CHECK sample_letter_notification.status = NOTIFICATION_PENDING_VIRUS_CHECK
encrypted_data = encryption.encrypt({
'page_count': 2,
'message': None,
'invalid_pages': None,
'validation_status': 'passed',
'filename': 'NOTIFY.{}'.format(sample_letter_notification.reference),
'notification_id': str(sample_letter_notification.id)
})
with pytest.raises(NotificationTechnicalFailureException): with pytest.raises(NotificationTechnicalFailureException):
process_sanitised_letter( process_sanitised_letter(encrypted_data)
page_count=2,
message=None,
invalid_pages=None,
validation_status='passed',
filename='NOTIFY.{}'.format(sample_letter_notification.reference),
notification_id=str(sample_letter_notification.id)
)
assert sample_letter_notification.status == NOTIFICATION_TECHNICAL_FAILURE assert sample_letter_notification.status == NOTIFICATION_TECHNICAL_FAILURE