diff --git a/app/dao/jobs_dao.py b/app/dao/jobs_dao.py index d826c822c..e3df928a5 100644 --- a/app/dao/jobs_dao.py +++ b/app/dao/jobs_dao.py @@ -2,9 +2,15 @@ from app import db from app.models import Job -def save_job(job): - db.session.add(job) - db.session.commit() +def save_job(job, update_dict={}): + if update_dict: + update_dict.pop('id') + update_dict.pop('service') + update_dict.pop('template') + Job.query.filter_by(id=job.id).update(update_dict) + else: + db.session.add(job) + db.session.commit() def get_job(service_id, job_id): diff --git a/app/job/rest.py b/app/job/rest.py index 853408b10..5597cc181 100644 --- a/app/job/rest.py +++ b/app/job/rest.py @@ -8,6 +8,7 @@ from flask import ( current_app ) +from sqlalchemy.exc import SQLAlchemyError from sqlalchemy.exc import DataError from sqlalchemy.orm.exc import NoResultFound @@ -19,7 +20,8 @@ from app.dao.jobs_dao import ( from app.schemas import ( job_schema, - jobs_schema + jobs_schema, + job_schema_load_json ) job = Blueprint('job', __name__, url_prefix='/service//job') @@ -56,6 +58,19 @@ def create_job(service_id): return jsonify(data=job_schema.dump(job).data), 201 +@job.route('/', methods=['PUT']) +def update_job(service_id, job_id): + job = get_job(service_id, job_id) + update_dict, errors = job_schema_load_json.load(request.get_json()) + if errors: + return jsonify(result="error", message=errors), 400 + try: + save_job(job, update_dict=update_dict) + except Exception as e: + return jsonify(result="error", message=str(e)), 400 + return jsonify(data=job_schema.dump(job).data), 200 + + def _enqueue_job(job): aws_region = current_app.config['AWS_REGION'] queue_name = current_app.config['NOTIFY_JOB_QUEUE'] diff --git a/tests/app/dao/test_jobs_dao.py b/tests/app/dao/test_jobs_dao.py index d4134f30e..06f515fd6 100644 --- a/tests/app/dao/test_jobs_dao.py +++ b/tests/app/dao/test_jobs_dao.py @@ -1,4 +1,5 @@ import uuid +import json from app.dao.jobs_dao import ( save_job, @@ -79,3 +80,23 @@ def test_get_all_jobs(notify_db, notify_db_session, sample_template): sample_template) jobs_from_db = _get_jobs() assert len(jobs_from_db) == 5 + + +def test_update_job(notify_db, notify_db_session, sample_job): + assert sample_job.status == 'pending' + + update_dict = { + 'id': sample_job.id, + 'service': sample_job.service.id, + 'template': sample_job.template.id, + 'bucket_name': sample_job.bucket_name, + 'file_name': sample_job.file_name, + 'original_file_name': sample_job.original_file_name, + 'status': 'in progress' + } + + save_job(sample_job, update_dict=update_dict) + + job_from_db = Job.query.get(sample_job.id) + + assert job_from_db.status == 'in progress' diff --git a/tests/app/job/test_job_rest.py b/tests/app/job/test_job_rest.py index e70b64120..6a7b385d8 100644 --- a/tests/app/job/test_job_rest.py +++ b/tests/app/job/test_job_rest.py @@ -125,6 +125,44 @@ def test_create_job(notify_api, notify_db, notify_db_session, sample_template): assert expected_message['bucket_name'] == bucket_name +def test_get_update_job_status(notify_api, + notify_db, + notify_db_session, + sample_job): + + assert sample_job.status == 'pending' + + job_id = str(sample_job.id) + service_id = str(sample_job.service.id) + + update_data = { + 'id': job_id, + 'service': service_id, + 'template': sample_job.template.id, + 'bucket_name': sample_job.bucket_name, + 'file_name': sample_job.file_name, + 'original_file_name': sample_job.original_file_name, + 'status': 'in progress' + } + + with notify_api.test_request_context(): + with notify_api.test_client() as client: + path = url_for('job.update_job', service_id=service_id, job_id=job_id) + + auth_header = create_authorization_header(service_id=service_id, + path=path, + method='PUT', + request_body=json.dumps(update_data)) + + headers = [('Content-Type', 'application/json'), auth_header] + + response = client.put(path, headers=headers, data=json.dumps(update_data)) + + assert response.status_code == 200 + resp_json = json.loads(response.get_data(as_text=True)) + assert resp_json['data']['status'] == 'in progress' + + def _setup_jobs(notify_db, notify_db_session, template, number_of_jobs=5): for i in range(number_of_jobs): create_job(notify_db, notify_db_session, service=template.service,