mirror of
https://github.com/GSA/notifications-api.git
synced 2026-05-29 10:28:41 -04:00
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:
@@ -15,7 +15,7 @@ from celery.exceptions import MaxRetriesExceededError
|
||||
from notifications_utils.statsd_decorators import statsd
|
||||
from notifications_utils.s3 import s3upload
|
||||
|
||||
from app import notify_celery
|
||||
from app import encryption, notify_celery
|
||||
from app.aws import s3
|
||||
from app.config import QueueNames, TaskNames
|
||||
from app.dao.notifications_dao import (
|
||||
@@ -302,14 +302,12 @@ def sanitise_letter(self, filename):
|
||||
|
||||
|
||||
@notify_celery.task(name='process-sanitised-letter')
|
||||
def process_sanitised_letter(
|
||||
page_count,
|
||||
message,
|
||||
invalid_pages,
|
||||
validation_status,
|
||||
filename,
|
||||
notification_id,
|
||||
):
|
||||
def process_sanitised_letter(sanitise_data):
|
||||
letter_details = encryption.decrypt(sanitise_data)
|
||||
|
||||
filename = letter_details['filename']
|
||||
notification_id = letter_details['notification_id']
|
||||
|
||||
current_app.logger.info('Processing sanitised letter with id {}'.format(notification_id))
|
||||
notification = get_notification_by_id(notification_id, _raise=True)
|
||||
|
||||
@@ -323,7 +321,7 @@ def process_sanitised_letter(
|
||||
try:
|
||||
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(
|
||||
notification_id, filename))
|
||||
|
||||
@@ -331,16 +329,16 @@ def process_sanitised_letter(
|
||||
notification=notification,
|
||||
filename=filename,
|
||||
scan_pdf_object=original_pdf_object,
|
||||
message=message,
|
||||
invalid_pages=invalid_pages,
|
||||
page_count=page_count,
|
||||
message=letter_details['message'],
|
||||
invalid_pages=letter_details['invalid_pages'],
|
||||
page_count=letter_details['page_count'],
|
||||
)
|
||||
return
|
||||
|
||||
current_app.logger.info('Processing valid precompiled pdf with id {} (file {})'.format(
|
||||
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
|
||||
|
||||
move_sanitised_letter_to_test_or_live_pdf_bucket(filename, is_test_key, notification.created_at)
|
||||
|
||||
@@ -13,6 +13,7 @@ from celery.exceptions import MaxRetriesExceededError, Retry
|
||||
from requests import RequestException
|
||||
from sqlalchemy.orm.exc import NoResultFound
|
||||
|
||||
from app import encryption
|
||||
from app.errors import VirusScanError
|
||||
from app.exceptions import NotificationTechnicalFailureException
|
||||
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.created_at = datetime(2018, 7, 1, 12)
|
||||
|
||||
process_sanitised_letter(
|
||||
page_count=2,
|
||||
message=None,
|
||||
invalid_pages=None,
|
||||
validation_status='passed',
|
||||
filename=filename,
|
||||
notification_id=str(sample_letter_notification.id)
|
||||
)
|
||||
encrypted_data = encryption.encrypt({
|
||||
'page_count': 2,
|
||||
'message': None,
|
||||
'invalid_pages': None,
|
||||
'validation_status': 'passed',
|
||||
'filename': filename,
|
||||
'notification_id': str(sample_letter_notification.id)
|
||||
})
|
||||
process_sanitised_letter(encrypted_data)
|
||||
|
||||
assert sample_letter_notification.status == expected_status
|
||||
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.created_at = datetime(2018, 7, 1, 12)
|
||||
|
||||
process_sanitised_letter(
|
||||
page_count=2,
|
||||
message='content-outside-printable-area',
|
||||
invalid_pages=[1],
|
||||
validation_status='failed',
|
||||
filename=filename,
|
||||
notification_id=str(sample_letter_notification.id)
|
||||
)
|
||||
encrypted_data = encryption.encrypt({
|
||||
'page_count': 2,
|
||||
'message': 'content-outside-printable-area',
|
||||
'invalid_pages': [1],
|
||||
'validation_status': 'failed',
|
||||
'filename': filename,
|
||||
'notification_id': str(sample_letter_notification.id)
|
||||
})
|
||||
process_sanitised_letter(encrypted_data)
|
||||
|
||||
assert sample_letter_notification.status == NOTIFICATION_VALIDATION_FAILED
|
||||
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')
|
||||
sample_letter_notification.status = NOTIFICATION_CREATED
|
||||
|
||||
process_sanitised_letter(
|
||||
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)
|
||||
)
|
||||
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)
|
||||
})
|
||||
process_sanitised_letter(encrypted_data)
|
||||
|
||||
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'))
|
||||
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):
|
||||
process_sanitised_letter(
|
||||
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)
|
||||
)
|
||||
process_sanitised_letter(encrypted_data)
|
||||
|
||||
assert sample_letter_notification.status == NOTIFICATION_TECHNICAL_FAILURE
|
||||
|
||||
|
||||
Reference in New Issue
Block a user