mirror of
https://github.com/GSA/notifications-api.git
synced 2026-09-09 00:43:12 -04:00
Merge pull request #3341 from alphagov/rebuild-letters
Add task to recreate the PDF file for a non-templated letter
This commit is contained in:
@@ -31,6 +31,7 @@ from app.letters.utils import (
|
|||||||
generate_letter_pdf_filename,
|
generate_letter_pdf_filename,
|
||||||
get_billable_units_for_letter_page_count,
|
get_billable_units_for_letter_page_count,
|
||||||
get_file_names_from_error_bucket,
|
get_file_names_from_error_bucket,
|
||||||
|
get_folder_name,
|
||||||
get_reference_from_filename,
|
get_reference_from_filename,
|
||||||
move_error_pdf_to_scan_bucket,
|
move_error_pdf_to_scan_bucket,
|
||||||
move_failed_pdf,
|
move_failed_pdf,
|
||||||
@@ -524,3 +525,37 @@ def replay_letters_in_error(filename=None):
|
|||||||
[filename],
|
[filename],
|
||||||
queue=QueueNames.LETTERS
|
queue=QueueNames.LETTERS
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
@notify_celery.task(name='resanitise-pdf')
|
||||||
|
def resanitise_pdf(notification_id):
|
||||||
|
"""
|
||||||
|
`notification_id` is the notification id for a PDF letter which was either uploaded or sent using the API.
|
||||||
|
|
||||||
|
This task calls the `recreate_pdf_for_precompiled_letter` template preview task which recreates the
|
||||||
|
PDF for a letter which is already sanitised and in the letters-pdf bucket. The new file that is generated
|
||||||
|
will then overwrite the existing letter in the letters-pdf bucket.
|
||||||
|
"""
|
||||||
|
notification = get_notification_by_id(notification_id)
|
||||||
|
|
||||||
|
# folder_name is the folder that the letter is in the letters-pdf bucket e.g. '2021-10-10/'
|
||||||
|
folder_name = get_folder_name(notification.created_at)
|
||||||
|
|
||||||
|
filename = generate_letter_pdf_filename(
|
||||||
|
reference=notification.reference,
|
||||||
|
created_at=notification.created_at,
|
||||||
|
ignore_folder=True,
|
||||||
|
postage=notification.postage
|
||||||
|
)
|
||||||
|
|
||||||
|
notify_celery.send_task(
|
||||||
|
name=TaskNames.RECREATE_PDF_FOR_PRECOMPILED_LETTER,
|
||||||
|
kwargs={
|
||||||
|
'notification_id': str(notification.id),
|
||||||
|
'file_location': f'{folder_name}{filename}',
|
||||||
|
'allow_international_letters': notification.service.has_permission(
|
||||||
|
INTERNATIONAL_LETTERS
|
||||||
|
),
|
||||||
|
},
|
||||||
|
queue=QueueNames.SANITISE_LETTERS,
|
||||||
|
)
|
||||||
|
|||||||
@@ -19,7 +19,10 @@ from sqlalchemy.orm.exc import NoResultFound
|
|||||||
|
|
||||||
from app import db
|
from app import db
|
||||||
from app.aws import s3
|
from app.aws import s3
|
||||||
from app.celery.letters_pdf_tasks import get_pdf_for_templated_letter
|
from app.celery.letters_pdf_tasks import (
|
||||||
|
get_pdf_for_templated_letter,
|
||||||
|
resanitise_pdf,
|
||||||
|
)
|
||||||
from app.celery.reporting_tasks import (
|
from app.celery.reporting_tasks import (
|
||||||
create_nightly_notification_status_for_day,
|
create_nightly_notification_status_for_day,
|
||||||
)
|
)
|
||||||
@@ -271,14 +274,22 @@ def insert_inbound_numbers_from_file(file_name):
|
|||||||
file.close()
|
file.close()
|
||||||
|
|
||||||
|
|
||||||
@notify_command(name='replay-create-pdf-letters')
|
@notify_command(name='replay-create-pdf-for-templated-letter')
|
||||||
@click.option('-n', '--notification_id', type=click.UUID, required=True,
|
@click.option('-n', '--notification_id', type=click.UUID, required=True,
|
||||||
help="Notification id of the letter that needs the get_pdf_for_templated_letter task replayed")
|
help="Notification id of the letter that needs the get_pdf_for_templated_letter task replayed")
|
||||||
def replay_create_pdf_letters(notification_id):
|
def replay_create_pdf_for_templated_letter(notification_id):
|
||||||
print("Create task to get_pdf_for_templated_letter for notification: {}".format(notification_id))
|
print("Create task to get_pdf_for_templated_letter for notification: {}".format(notification_id))
|
||||||
get_pdf_for_templated_letter.apply_async([str(notification_id)], queue=QueueNames.CREATE_LETTERS_PDF)
|
get_pdf_for_templated_letter.apply_async([str(notification_id)], queue=QueueNames.CREATE_LETTERS_PDF)
|
||||||
|
|
||||||
|
|
||||||
|
@notify_command(name='recreate-pdf-for-precompiled-or-uploaded-letter')
|
||||||
|
@click.option('-n', '--notification_id', type=click.UUID, required=True,
|
||||||
|
help="Notification ID of the precompiled or uploaded letter")
|
||||||
|
def recreate_pdf_for_precompiled_or_uploaded_letter(notification_id):
|
||||||
|
print(f"Call resanitise_pdf task for notification: {notification_id}")
|
||||||
|
resanitise_pdf.apply_async([str(notification_id)], queue=QueueNames.LETTERS)
|
||||||
|
|
||||||
|
|
||||||
@notify_command(name='replay-service-callbacks')
|
@notify_command(name='replay-service-callbacks')
|
||||||
@click.option('-f', '--file_name', required=True,
|
@click.option('-f', '--file_name', required=True,
|
||||||
help="""Full path of the file to upload, file is a contains client references of
|
help="""Full path of the file to upload, file is a contains client references of
|
||||||
|
|||||||
@@ -77,6 +77,7 @@ class TaskNames(object):
|
|||||||
SANITISE_LETTER = 'sanitise-and-upload-letter'
|
SANITISE_LETTER = 'sanitise-and-upload-letter'
|
||||||
CREATE_PDF_FOR_TEMPLATED_LETTER = 'create-pdf-for-templated-letter'
|
CREATE_PDF_FOR_TEMPLATED_LETTER = 'create-pdf-for-templated-letter'
|
||||||
PUBLISH_GOVUK_ALERTS = 'publish-govuk-alerts'
|
PUBLISH_GOVUK_ALERTS = 'publish-govuk-alerts'
|
||||||
|
RECREATE_PDF_FOR_PRECOMPILED_LETTER = 'recreate-pdf-for-precompiled-letter'
|
||||||
|
|
||||||
|
|
||||||
class Config(object):
|
class Config(object):
|
||||||
|
|||||||
@@ -23,6 +23,7 @@ from app.celery.letters_pdf_tasks import (
|
|||||||
process_virus_scan_error,
|
process_virus_scan_error,
|
||||||
process_virus_scan_failed,
|
process_virus_scan_failed,
|
||||||
replay_letters_in_error,
|
replay_letters_in_error,
|
||||||
|
resanitise_pdf,
|
||||||
sanitise_letter,
|
sanitise_letter,
|
||||||
send_letters_volume_email_to_dvla,
|
send_letters_volume_email_to_dvla,
|
||||||
update_billable_units_for_letter,
|
update_billable_units_for_letter,
|
||||||
@@ -1098,3 +1099,33 @@ def test_replay_letters_in_error_for_one_file(notify_api, mocker):
|
|||||||
replay_letters_in_error("file_name")
|
replay_letters_in_error("file_name")
|
||||||
mock_move.assert_called_once_with('file_name')
|
mock_move.assert_called_once_with('file_name')
|
||||||
mock_celery.assert_called_once_with(name='scan-file', kwargs={'filename': 'file_name'}, queue='antivirus-tasks')
|
mock_celery.assert_called_once_with(name='scan-file', kwargs={'filename': 'file_name'}, queue='antivirus-tasks')
|
||||||
|
|
||||||
|
|
||||||
|
@pytest.mark.parametrize('permissions, expected_international_letters_allowed', (
|
||||||
|
([LETTER_TYPE], False),
|
||||||
|
([LETTER_TYPE, INTERNATIONAL_LETTERS], True),
|
||||||
|
))
|
||||||
|
def test_resanitise_pdf_calls_template_preview_with_letter_details(
|
||||||
|
mocker,
|
||||||
|
sample_letter_notification,
|
||||||
|
permissions,
|
||||||
|
expected_international_letters_allowed,
|
||||||
|
):
|
||||||
|
mock_celery = mocker.patch('app.celery.letters_pdf_tasks.notify_celery.send_task')
|
||||||
|
|
||||||
|
sample_letter_notification.created_at = datetime(2021, 2, 7, 12)
|
||||||
|
sample_letter_notification.service = create_service(
|
||||||
|
service_permissions=permissions
|
||||||
|
)
|
||||||
|
|
||||||
|
resanitise_pdf(sample_letter_notification.id)
|
||||||
|
|
||||||
|
mock_celery.assert_called_once_with(
|
||||||
|
name=TaskNames.RECREATE_PDF_FOR_PRECOMPILED_LETTER,
|
||||||
|
kwargs={
|
||||||
|
'notification_id': str(sample_letter_notification.id),
|
||||||
|
'file_location': '2021-02-07/NOTIFY.FOO.D.2.C.20210207120000.PDF',
|
||||||
|
'allow_international_letters': expected_international_letters_allowed,
|
||||||
|
},
|
||||||
|
queue=QueueNames.SANITISE_LETTERS,
|
||||||
|
)
|
||||||
|
|||||||
Reference in New Issue
Block a user