From 8f5c07336d54221d4cdd8ac599724ab408c7aaa8 Mon Sep 17 00:00:00 2001 From: Chris Hill-Scott Date: Tue, 12 May 2020 17:09:13 +0100 Subject: [PATCH] Add method to get jobs for a contact list MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Because the API lets us query jobs by contact list now, let’s add the model and client layer code that will let us display them in the admin app. --- app/models/contact_list.py | 8 ++++++++ app/models/job.py | 4 ++-- app/notify_client/job_api_client.py | 7 +++++-- tests/app/models/test_contact_list.py | 19 +++++++++++++++++++ tests/conftest.py | 2 +- 5 files changed, 35 insertions(+), 5 deletions(-) diff --git a/app/models/contact_list.py b/app/models/contact_list.py index 355991c61..0261ac28f 100644 --- a/app/models/contact_list.py +++ b/app/models/contact_list.py @@ -8,6 +8,7 @@ from notifications_utils.timezones import utc_string_to_aware_gmt_datetime from werkzeug.utils import cached_property from app.models import JSONModel, ModelList +from app.models.job import PaginatedJobs from app.notify_client.contact_list_api_client import contact_list_api_client from app.s3_client.s3_csv_client import ( get_csv_metadata, @@ -134,6 +135,13 @@ class ContactList(JSONModel): file_name, extention = path.splitext(self.original_file_name) return f'{file_name}.csv' + def get_jobs(self, *, page): + return PaginatedJobs( + self.service_id, + contact_list_id=self.id, + page=page, + ) + class ContactLists(ModelList): diff --git a/app/models/job.py b/app/models/job.py index e5443262e..af196c0f1 100644 --- a/app/models/job.py +++ b/app/models/job.py @@ -234,8 +234,8 @@ class ScheduledJobs(ImmediateJobs): class PaginatedJobs(PaginatedModelList, ImmediateJobs): client_method = job_api_client.get_page_of_jobs - def __init__(self, service_id, *, page=None): - super().__init__(service_id, page=page) + def __init__(self, service_id, *, contact_list_id=None, page=None): + super().__init__(service_id, contact_list_id=contact_list_id, page=page) class PaginatedUploads(PaginatedModelList, ImmediateJobs): diff --git a/app/notify_client/job_api_client.py b/app/notify_client/job_api_client.py index 9e514af6f..caea3d40d 100644 --- a/app/notify_client/job_api_client.py +++ b/app/notify_client/job_api_client.py @@ -24,12 +24,14 @@ class JobApiClient(NotifyAdminAPIClient): return job - def get_jobs(self, service_id, limit_days=None, statuses=None, page=1): + def get_jobs(self, service_id, *, limit_days=None, contact_list_id=None, statuses=None, page=1): params = {'page': page} if limit_days is not None: params['limit_days'] = limit_days if statuses is not None: params['statuses'] = ','.join(statuses) + if contact_list_id is not None: + params['contact_list_id'] = contact_list_id return self.get(url='/service/{}/job'.format(service_id), params=params) @@ -50,11 +52,12 @@ class JobApiClient(NotifyAdminAPIClient): if job['job_status'] != 'cancelled' ) - def get_page_of_jobs(self, service_id, page): + def get_page_of_jobs(self, service_id, *, page, contact_list_id=None): return self.get_jobs( service_id, statuses=self.NON_SCHEDULED_JOB_STATUSES, page=page, + contact_list_id=contact_list_id, ) def get_immediate_jobs(self, service_id): diff --git a/tests/app/models/test_contact_list.py b/tests/app/models/test_contact_list.py index fb1f01c11..24c60ac3a 100644 --- a/tests/app/models/test_contact_list.py +++ b/tests/app/models/test_contact_list.py @@ -1,9 +1,28 @@ from datetime import datetime from app.models.contact_list import ContactList +from app.models.job import PaginatedJobs def test_created_at(): created_at = ContactList({'created_at': '2016-05-06T07:08:09.061258'}).created_at assert isinstance(created_at, datetime) assert created_at.isoformat() == '2016-05-06T08:08:09.061258+01:00' + + +def test_get_jobs(mock_get_jobs): + contact_list = ContactList({'id': 'a', 'service_id': 'b'}) + assert isinstance(contact_list.get_jobs(page=123), PaginatedJobs) + mock_get_jobs.assert_called_once_with( + 'b', + contact_list_id='a', + statuses={ + 'finished', + 'sending limits exceeded', + 'ready to send', + 'sent to dvla', + 'pending', + 'in progress', + }, + page=123, + ) diff --git a/tests/conftest.py b/tests/conftest.py index e7046e7d5..55c031677 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -1808,7 +1808,7 @@ def mock_has_no_jobs(mocker): @pytest.fixture(scope='function') def mock_get_jobs(mocker, api_user_active): - def _get_jobs(service_id, limit_days=None, statuses=None, page=1): + def _get_jobs(service_id, limit_days=None, statuses=None, contact_list_id=None, page=1): if statuses is None: statuses = ['', 'scheduled', 'pending', 'cancelled', 'finished']