diff --git a/app/celery/tasks.py b/app/celery/tasks.py index 4682086c4..7d15c6c75 100644 --- a/app/celery/tasks.py +++ b/app/celery/tasks.py @@ -24,7 +24,8 @@ from app.dao.jobs_dao import ( all_notifications_are_created_for_job, dao_get_all_notifications_for_job, dao_update_job_status) -from app.dao.notifications_dao import get_notification_by_id +from app.dao.notifications_dao import get_notification_by_id, dao_update_notification +from app.dao.provider_details_dao import get_current_provider from app.dao.services_dao import dao_fetch_service_by_id, fetch_todays_total_message_count from app.dao.templates_dao import dao_get_template_by_id from app.models import ( @@ -32,7 +33,12 @@ from app.models import ( SMS_TYPE, LETTER_TYPE, KEY_TYPE_NORMAL, - JOB_STATUS_CANCELLED, JOB_STATUS_PENDING, JOB_STATUS_IN_PROGRESS, JOB_STATUS_FINISHED, JOB_STATUS_READY_TO_SEND) + JOB_STATUS_CANCELLED, + JOB_STATUS_PENDING, + JOB_STATUS_IN_PROGRESS, + JOB_STATUS_FINISHED, + JOB_STATUS_READY_TO_SEND, + JOB_STATUS_SENT_TO_DVLA, NOTIFICATION_SENDING) from app.notifications.process_notifications import persist_notification from app.service.utils import service_allowed_to_send_to from app.statsd_decorators import statsd @@ -286,19 +292,34 @@ def build_dvla_file(self, job_id): raise e +@notify_celery.task(bind=True, name='update-letter-job-to-sent') +@statsd(namespace="tasks") +def update_job_to_sent_to_dvla(self, job_id): + # This task will be called by the FTP app to update the job to sent to dvla + # and update all notifications for this job to sending, provider = DVLA + provider = get_current_provider(LETTER_TYPE) + notifications = dao_get_all_notifications_for_job(job_id) + for n in notifications: + n.status = NOTIFICATION_SENDING + n.sent_by = provider.identifier + dao_update_notification(n) + + dao_update_job_status(job_id, JOB_STATUS_SENT_TO_DVLA) + + def create_dvla_file_contents(job_id): - file_contents = '\n'.join( - str(LetterDVLATemplate( - notification.template.__dict__, - notification.personalisation, - # This unique id is a 7 digits requested by DVLA, not known - # if this number needs to be sequential. - numeric_id=random.randint(1, int('9' * 7)), - contact_block=notification.service.letter_contact_block, - )) - for notification in dao_get_all_notifications_for_job(job_id) - ) - return file_contents + file_contents = '\n'.join( + str(LetterDVLATemplate( + notification.template.__dict__, + notification.personalisation, + # This unique id is a 7 digits requested by DVLA, not known + # if this number needs to be sequential. + numeric_id=random.randint(1, int('9' * 7)), + contact_block=notification.service.letter_contact_block, + )) + for notification in dao_get_all_notifications_for_job(job_id) + ) + return file_contents def s3upload(filedata, region, bucket_name, file_location): diff --git a/app/models.py b/app/models.py index 894f42df6..8fd971fd6 100644 --- a/app/models.py +++ b/app/models.py @@ -454,7 +454,9 @@ JOB_STATUS_TYPES = [ JOB_STATUS_FINISHED, JOB_STATUS_SENDING_LIMITS_EXCEEDED, JOB_STATUS_SCHEDULED, - JOB_STATUS_CANCELLED + JOB_STATUS_CANCELLED, + JOB_STATUS_READY_TO_SEND, + JOB_STATUS_SENT_TO_DVLA ] diff --git a/tests/app/celery/test_tasks.py b/tests/app/celery/test_tasks.py index 8bc015008..6fbcd01dc 100644 --- a/tests/app/celery/test_tasks.py +++ b/tests/app/celery/test_tasks.py @@ -19,7 +19,8 @@ from app.celery.tasks import ( send_sms, send_email, persist_letter, - get_template_class + get_template_class, + update_job_to_sent_to_dvla ) from app.dao import jobs_dao, services_dao from app.models import ( @@ -1036,3 +1037,14 @@ def test_dvla_letter_template(sample_letter_notification): sample_letter_notification.personalisation, 12345) assert str(letter) == "140|500|001||201703230012345|||||||||||||A1|A2|A3|A4|A5|A6||A_POST|||||||||23 March 2017

Template subjectDear Sir/Madam, Hello. Yours Truly, The Government." # noqa + + +def test_update_job_to_sent_to_dvla(sample_letter_template, sample_letter_job): + create_notification(template=sample_letter_template, job=sample_letter_job) + create_notification(template=sample_letter_template, job=sample_letter_job) + update_job_to_sent_to_dvla(job_id=sample_letter_job.id) + + updated_notifications = Notification.query.all() + assert [(n.status == 'sending', n.sent_by == 'dvla') for n in updated_notifications] + + assert 'sent to dvla' == Job.query.filter_by(id=sample_letter_job.id).one().job_status diff --git a/tests/app/dao/test_notification_dao.py b/tests/app/dao/test_notification_dao.py index 5591d3f14..170a9a7ea 100644 --- a/tests/app/dao/test_notification_dao.py +++ b/tests/app/dao/test_notification_dao.py @@ -52,7 +52,6 @@ from tests.app.conftest import ( sample_email_template, sample_service, sample_job, - sample_api_key, sample_notification_history as create_notification_history ) diff --git a/tests/app/job/test_rest.py b/tests/app/job/test_rest.py index a2407c750..32a5bdfcb 100644 --- a/tests/app/job/test_rest.py +++ b/tests/app/job/test_rest.py @@ -673,7 +673,8 @@ def test_get_jobs_accepts_page_parameter( @pytest.mark.parametrize('statuses_filter, expected_statuses', [ ('', JOB_STATUS_TYPES), ('pending', [JOB_STATUS_PENDING]), - ('pending, in progress, finished, sending limits exceeded, scheduled, cancelled', JOB_STATUS_TYPES), + ('pending, in progress, finished, sending limits exceeded, scheduled, cancelled, ready to send, sent to dvla', + JOB_STATUS_TYPES), # bad statuses are accepted, just return no data ('foo', []) ]) @@ -691,6 +692,8 @@ def test_get_jobs_can_filter_on_statuses( create_job(notify_db, notify_db_session, job_status='sending limits exceeded') create_job(notify_db, notify_db_session, job_status='scheduled') create_job(notify_db, notify_db_session, job_status='cancelled') + create_job(notify_db, notify_db_session, job_status='ready to send') + create_job(notify_db, notify_db_session, job_status='sent to dvla') path = '/service/{}/job'.format(sample_service.id) response = client.get(