From 18ffccf8c995b417b4b3d28e71691c52bc3131fc Mon Sep 17 00:00:00 2001 From: Chris Hill-Scott Date: Tue, 12 May 2020 11:03:09 +0100 Subject: [PATCH] Allow jobs to be filtered by contact list MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Rather than showing all jobs that have been ‘copied’ from a contact list I think it makes more sense to group them under the contact list. This way it’s easier to see what messages have been sent to a given group of contacts over time. Part of this work means the API needs to return only jobs that have been created from a given contact list, when asked. --- app/dao/jobs_dao.py | 3 +++ app/job/rest.py | 5 ++++- tests/app/dao/test_jobs_dao.py | 22 +++++++++++++++++++++- tests/app/job/test_rest.py | 14 ++++++++++++++ 4 files changed, 42 insertions(+), 2 deletions(-) diff --git a/app/dao/jobs_dao.py b/app/dao/jobs_dao.py index eef1486fd..745e909ae 100644 --- a/app/dao/jobs_dao.py +++ b/app/dao/jobs_dao.py @@ -65,6 +65,7 @@ def dao_get_jobs_by_service_id( page=1, page_size=50, statuses=None, + contact_list_id=None, ): query_filter = [ Job.service_id == service_id, @@ -77,6 +78,8 @@ def dao_get_jobs_by_service_id( query_filter.append( Job.job_status.in_(statuses) ) + if contact_list_id is not None: + query_filter.append(Job.contact_list_id == contact_list_id) return Job.query \ .filter(*query_filter) \ .order_by(Job.processing_started.desc(), Job.created_at.desc()) \ diff --git a/app/job/rest.py b/app/job/rest.py index d324f7e7e..2831f9da9 100644 --- a/app/job/rest.py +++ b/app/job/rest.py @@ -133,6 +133,7 @@ def get_jobs_by_service(service_id): limit_days=limit_days, statuses=[x.strip() for x in request.args.get('statuses', '').split(',')], page=int(request.args.get('page', 1)), + contact_list_id=request.args.get('contact_list_id'), )) @@ -193,13 +194,15 @@ def get_paginated_jobs( limit_days, statuses, page, + contact_list_id, ): pagination = dao_get_jobs_by_service_id( service_id, limit_days=limit_days, page=page, page_size=current_app.config['PAGE_SIZE'], - statuses=statuses + statuses=statuses, + contact_list_id=contact_list_id, ) data = job_schema.dump(pagination.items, many=True).data for job_data in data: diff --git a/tests/app/dao/test_jobs_dao.py b/tests/app/dao/test_jobs_dao.py index 230e279d6..baa6746d4 100644 --- a/tests/app/dao/test_jobs_dao.py +++ b/tests/app/dao/test_jobs_dao.py @@ -25,7 +25,7 @@ from app.models import ( EMAIL_TYPE, SMS_TYPE, LETTER_TYPE, JOB_STATUS_FINISHED ) -from tests.app.db import create_job, create_service, create_template, create_notification +from tests.app.db import create_job, create_service, create_template, create_notification, create_service_contact_list def test_should_have_decorated_notifications_dao_functions(): @@ -168,6 +168,26 @@ def test_get_jobs_for_service_in_processed_at_then_created_at_order(notify_db, n assert jobs[index].id == created_jobs[index].id +def test_get_jobs_for_service_by_contact_list(sample_template): + contact_list = create_service_contact_list() + job_1 = create_job(sample_template) + job_2 = create_job(sample_template, contact_list_id=contact_list.id) + + assert dao_get_jobs_by_service_id( + sample_template.service.id + ).items == [ + job_2, + job_1, + ] + + assert dao_get_jobs_by_service_id( + sample_template.service.id, + contact_list_id=contact_list.id, + ).items == [ + job_2, + ] + + def test_update_job(sample_job): assert sample_job.job_status == 'pending' diff --git a/tests/app/job/test_rest.py b/tests/app/job/test_rest.py index 98605b0d3..d6db5e917 100644 --- a/tests/app/job/test_rest.py +++ b/tests/app/job/test_rest.py @@ -740,6 +740,20 @@ def test_get_jobs_with_limit_days(admin_request, sample_template): assert len(resp_json['data']) == 2 +def test_get_jobs_by_contact_list(admin_request, sample_template): + contact_list = create_service_contact_list() + create_job(template=sample_template) + create_job(template=sample_template, contact_list_id=contact_list.id) + + resp_json = admin_request.get( + 'job.get_jobs_by_service', + service_id=sample_template.service_id, + contact_list_id=contact_list.id, + ) + + assert len(resp_json['data']) == 1 + + def test_get_jobs_should_return_statistics(admin_request, sample_template): now = datetime.utcnow() earlier = datetime.utcnow() - timedelta(days=1)