Merge pull request #347 from alphagov/get-jobs-created-in-last-7-days

Add a limit days query param for get all jobs.
This commit is contained in:
Rebecca Law
2016-05-25 11:36:31 +01:00
6 changed files with 97 additions and 11 deletions

View File

@@ -28,3 +28,8 @@ class DAOClass(object):
db.session.delete(inst) db.session.delete(inst)
if _commit: if _commit:
db.session.commit() db.session.commit()
def days_ago(number_of_days):
from datetime import date, timedelta
return date.today() - timedelta(days=number_of_days)

View File

@@ -1,5 +1,8 @@
from sqlalchemy import desc from datetime import date, timedelta
from sqlalchemy import desc, cast, Date as sql_date
from app import db from app import db
from app.dao import days_ago
from app.models import Job from app.models import Job
@@ -7,8 +10,11 @@ def dao_get_job_by_service_id_and_job_id(service_id, job_id):
return Job.query.filter_by(service_id=service_id, id=job_id).one() return Job.query.filter_by(service_id=service_id, id=job_id).one()
def dao_get_jobs_by_service_id(service_id): def dao_get_jobs_by_service_id(service_id, limit_days=None):
return Job.query.filter_by(service_id=service_id).order_by(desc(Job.created_at)).all() query_filter = [Job.service_id == service_id]
if limit_days is not None:
query_filter.append(cast(Job.created_at, sql_date) >= days_ago(limit_days))
return Job.query.filter(*query_filter).order_by(desc(Job.created_at)).all()
def dao_get_job_by_id(job_id): def dao_get_job_by_id(job_id):

View File

@@ -11,6 +11,7 @@ from flask import current_app
from werkzeug.datastructures import MultiDict from werkzeug.datastructures import MultiDict
from app import db from app import db
from app.dao import days_ago
from app.models import ( from app.models import (
Service, Service,
Notification, Notification,
@@ -342,7 +343,3 @@ def delete_notifications_created_more_than_a_week_ago(status):
).delete(synchronize_session='fetch') ).delete(synchronize_session='fetch')
db.session.commit() db.session.commit()
return deleted return deleted
def days_ago(number_of_days):
return date.today() - timedelta(days=number_of_days)

View File

@@ -1,8 +1,8 @@
from flask import ( from flask import (
Blueprint, Blueprint,
jsonify, jsonify,
request request,
) current_app)
from app.dao.jobs_dao import ( from app.dao.jobs_dao import (
dao_create_job, dao_create_job,
@@ -36,7 +36,17 @@ def get_job_by_service_and_job_id(service_id, job_id):
@job.route('', methods=['GET']) @job.route('', methods=['GET'])
def get_jobs_by_service(service_id): def get_jobs_by_service(service_id):
jobs = dao_get_jobs_by_service_id(service_id) if request.args.get('limit_days'):
try:
limit_days = int(request.args['limit_days'])
except ValueError as e:
error = '{} is not an integer'.format(request.args['limit_days'])
current_app.logger.error(error)
return jsonify(result="error", message={'limit_days': [error]}), 400
else:
limit_days = None
jobs = dao_get_jobs_by_service_id(service_id, limit_days)
data, errors = job_schema.dump(jobs, many=True) data, errors = job_schema.dump(jobs, many=True)
if errors: if errors:
return jsonify(result="error", message=errors), 400 return jsonify(result="error", message=errors), 400

View File

@@ -1,4 +1,4 @@
from datetime import datetime from datetime import (datetime, timedelta)
import uuid import uuid
from app.dao.jobs_dao import ( from app.dao.jobs_dao import (
@@ -66,6 +66,46 @@ def test_get_jobs_for_service(notify_db, notify_db_session, sample_template):
assert one_job_from_db != other_job_from_db assert one_job_from_db != other_job_from_db
def test_get_jobs_for_service_with_limit_days_param(notify_db, notify_db_session, sample_template):
from tests.app.conftest import sample_job as create_job
one_job = create_job(notify_db, notify_db_session, sample_template.service, sample_template)
old_job = create_job(notify_db, notify_db_session, sample_template.service, sample_template,
created_at=datetime.now() - timedelta(days=8))
jobs = dao_get_jobs_by_service_id(one_job.service_id)
assert len(jobs) == 2
assert one_job in jobs
assert old_job in jobs
jobs_limit_days = dao_get_jobs_by_service_id(one_job.service_id, limit_days=7)
assert len(jobs_limit_days) == 1
assert one_job in jobs_limit_days
assert old_job not in jobs_limit_days
def test_get_jobs_for_service_with_limit_days_edge_case(notify_db, notify_db_session, sample_template):
from tests.app.conftest import sample_job as create_job
one_job = create_job(notify_db, notify_db_session, sample_template.service, sample_template)
job_two = create_job(notify_db, notify_db_session, sample_template.service, sample_template,
created_at=(datetime.now() - timedelta(days=7)).date())
one_second_after_midnight = datetime.combine((datetime.now() - timedelta(days=7)).date(),
datetime.strptime("000001", "%H%M%S").time())
just_after_midnight_job = create_job(notify_db, notify_db_session, sample_template.service, sample_template,
created_at=one_second_after_midnight)
job_eight_days_old = create_job(notify_db, notify_db_session, sample_template.service, sample_template,
created_at=datetime.now() - timedelta(days=8))
jobs_limit_days = dao_get_jobs_by_service_id(one_job.service_id, limit_days=7)
assert len(jobs_limit_days) == 3
assert one_job in jobs_limit_days
assert job_two in jobs_limit_days
assert just_after_midnight_job in jobs_limit_days
assert job_eight_days_old not in jobs_limit_days
def test_get_jobs_for_service_in_created_at_order(notify_db, notify_db_session, sample_template): def test_get_jobs_for_service_in_created_at_order(notify_db, notify_db_session, sample_template):
from tests.app.conftest import sample_job as create_job from tests.app.conftest import sample_job as create_job

View File

@@ -1,5 +1,7 @@
import json import json
import uuid import uuid
from datetime import datetime, timedelta
import app.celery.tasks import app.celery.tasks
from tests import create_authorization_header from tests import create_authorization_header
@@ -22,6 +24,32 @@ def test_get_jobs(notify_api, notify_db, notify_db_session, sample_template):
assert len(resp_json['data']) == 5 assert len(resp_json['data']) == 5
def test_get_jobs_with_limit_days(notify_api, notify_db, notify_db_session, sample_template):
create_job(
notify_db,
notify_db_session,
service=sample_template.service,
template=sample_template,
)
create_job(
notify_db,
notify_db_session,
service=sample_template.service,
template=sample_template,
created_at=datetime.now() - timedelta(days=7))
service_id = sample_template.service.id
with notify_api.test_request_context():
with notify_api.test_client() as client:
path = '/service/{}/job'.format(service_id)
auth_header = create_authorization_header(service_id=service_id)
response = client.get(path, headers=[auth_header], query_string={'limit_days': 5})
assert response.status_code == 200
resp_json = json.loads(response.get_data(as_text=True))
assert len(resp_json['data']) == 1
def test_get_job_with_invalid_service_id_returns404(notify_api, sample_api_key, sample_service): def test_get_job_with_invalid_service_id_returns404(notify_api, sample_api_key, sample_service):
with notify_api.test_request_context(): with notify_api.test_request_context():
with notify_api.test_client() as client: with notify_api.test_client() as client: