Files
notifications-admin/app/notify_client/job_api_client.py
Chris Hill-Scott 8f5c07336d Add method to get jobs for a contact list
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.
2020-11-30 13:54:53 +00:00

125 lines
3.9 KiB
Python

from app.extensions import redis_client
from app.notify_client import NotifyAdminAPIClient, _attach_current_user, cache
class JobApiClient(NotifyAdminAPIClient):
JOB_STATUSES = {
'scheduled',
'pending',
'in progress',
'finished',
'cancelled',
'sending limits exceeded',
'ready to send',
'sent to dvla'
}
SCHEDULED_JOB_STATUS = 'scheduled'
CANCELLED_JOB_STATUS = 'cancelled'
NON_SCHEDULED_JOB_STATUSES = JOB_STATUSES - {SCHEDULED_JOB_STATUS, CANCELLED_JOB_STATUS}
def get_job(self, service_id, job_id):
params = {}
job = self.get(url='/service/{}/job/{}'.format(service_id, job_id), params=params)
return job
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)
def get_uploads(self, service_id, limit_days=None, page=1):
params = {'page': page}
if limit_days is not None:
params['limit_days'] = limit_days
return self.get(url='/service/{}/upload'.format(service_id), params=params)
def has_sent_previously(self, service_id, template_id, template_version, original_file_name):
return (
template_id, template_version, original_file_name
) in (
(
job['template'], job['template_version'], job['original_file_name'],
)
for job in self.get_jobs(service_id, limit_days=0)['data']
if job['job_status'] != 'cancelled'
)
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):
return self.get_jobs(
service_id,
limit_days=7,
statuses=self.NON_SCHEDULED_JOB_STATUSES,
)['data']
def get_scheduled_jobs(self, service_id):
return sorted(
self.get_jobs(
service_id,
statuses=[self.SCHEDULED_JOB_STATUS]
)['data'],
key=lambda job: job['scheduled_for'],
reverse=True,
)
def get_scheduled_job_stats(self, service_id):
return self.get(
url=f'/service/{service_id}/job/scheduled-job-stats'
)
@cache.set('has_jobs-{service_id}')
def has_jobs(self, service_id):
return bool(self.get_jobs(service_id)['data'])
def create_job(self, job_id, service_id, scheduled_for=None, contact_list_id=None):
data = {"id": job_id}
if scheduled_for:
data.update({'scheduled_for': scheduled_for})
if contact_list_id:
data.update({'contact_list_id': contact_list_id})
data = _attach_current_user(data)
job = self.post(url='/service/{}/job'.format(service_id), data=data)
redis_client.set(
'has_jobs-{}'.format(service_id),
b'true',
ex=cache.TTL,
)
return job
@cache.delete('has_jobs-{service_id}')
def cancel_job(self, service_id, job_id):
return self.post(
url='/service/{}/job/{}/cancel'.format(service_id, job_id),
data={}
)
@cache.delete('has_jobs-{service_id}')
def cancel_letter_job(self, service_id, job_id):
return self.post(
url='/service/{}/job/{}/cancel-letter-job'.format(service_id, job_id),
data={}
)
job_api_client = JobApiClient()