From 94aab20317b83cf013f82712f424d48636b11e4c Mon Sep 17 00:00:00 2001 From: Rebecca Law Date: Tue, 26 Apr 2016 16:15:34 +0100 Subject: [PATCH 1/2] Add created_by_id to jobs table. The user logged in will be the user marked as creating the job. The admin code already sends the created_by user when creating a job. --- app/models.py | 2 ++ .../versions/0009_created_by_for_jobs.py | 34 +++++++++++++++++++ tests/app/conftest.py | 6 ++-- tests/app/dao/test_jobs_dao.py | 3 +- tests/app/job/test_rest.py | 3 +- 5 files changed, 44 insertions(+), 4 deletions(-) create mode 100644 migrations/versions/0009_created_by_for_jobs.py diff --git a/app/models.py b/app/models.py index d644289bf..bc67d9338 100644 --- a/app/models.py +++ b/app/models.py @@ -247,6 +247,8 @@ class Job(db.Model): index=False, unique=False, nullable=True) + created_by = db.relationship('User') + created_by_id = db.Column(UUID(as_uuid=True), db.ForeignKey('users.id'), index=True, nullable=False) VERIFY_CODE_TYPES = ['email', 'sms'] diff --git a/migrations/versions/0009_created_by_for_jobs.py b/migrations/versions/0009_created_by_for_jobs.py new file mode 100644 index 000000000..edc9ee664 --- /dev/null +++ b/migrations/versions/0009_created_by_for_jobs.py @@ -0,0 +1,34 @@ +"""empty message + +Revision ID: 0009_created_by_for_jobs +Revises: 0008_archive_template +Create Date: 2016-04-26 14:54:56.852642 + +""" + +# revision identifiers, used by Alembic. +revision = '0009_created_by_for_jobs' +down_revision = '0008_archive_template' + +from alembic import op +import sqlalchemy as sa +from sqlalchemy.dialects import postgresql + +def upgrade(): + ### commands auto generated by Alembic - please adjust! ### + op.add_column('jobs', sa.Column('created_by_id', postgresql.UUID(as_uuid=True), nullable=True)) + op.create_index(op.f('ix_jobs_created_by_id'), 'jobs', ['created_by_id'], unique=False) + op.create_foreign_key(None, 'jobs', 'users', ['created_by_id'], ['id']) + op.get_bind() + op.execute('UPDATE jobs SET created_by_id = \ + (SELECT user_id FROM user_to_service WHERE jobs.service_id = user_to_service.service_id LIMIT 1)') + op.alter_column('jobs', 'created_by_id', nullable=False) + ### end Alembic commands ### + + +def downgrade(): + ### commands auto generated by Alembic - please adjust! ### + op.drop_constraint(None, 'jobs', type_='foreignkey') + op.drop_index(op.f('ix_jobs_created_by_id'), table_name='jobs') + op.drop_column('jobs', 'created_by_id') + ### end Alembic commands ### diff --git a/tests/app/conftest.py b/tests/app/conftest.py index b356fba30..1885c049c 100644 --- a/tests/app/conftest.py +++ b/tests/app/conftest.py @@ -235,7 +235,8 @@ def sample_job(notify_db, 'template_id': template.id, 'original_file_name': 'some.csv', 'notification_count': notification_count, - 'created_at': created_at + 'created_at': created_at, + 'created_by': service.created_by } job = Job(**data) dao_create_job(job) @@ -275,7 +276,8 @@ def sample_email_job(notify_db, 'service': service, 'template_id': template.id, 'original_file_name': 'some.csv', - 'notification_count': 1 + 'notification_count': 1, + 'created_by': service.created_by } job = Job(**data) dao_create_job(job) diff --git a/tests/app/dao/test_jobs_dao.py b/tests/app/dao/test_jobs_dao.py index 636bc163f..b8b03c231 100644 --- a/tests/app/dao/test_jobs_dao.py +++ b/tests/app/dao/test_jobs_dao.py @@ -20,7 +20,8 @@ def test_create_job(sample_template): 'service_id': sample_template.service.id, 'template_id': sample_template.id, 'original_file_name': 'some.csv', - 'notification_count': 1 + 'notification_count': 1, + 'created_by': sample_template.created_by } job = Job(**data) diff --git a/tests/app/job/test_rest.py b/tests/app/job/test_rest.py index a604a346f..fffa384cd 100644 --- a/tests/app/job/test_rest.py +++ b/tests/app/job/test_rest.py @@ -97,7 +97,8 @@ def test_create_job(notify_api, sample_template, mocker, fake_uuid): 'service': str(sample_template.service.id), 'template': str(sample_template.id), 'original_file_name': 'thisisatest.csv', - 'notification_count': 1 + 'notification_count': 1, + 'created_by': str(sample_template.created_by.id) } path = '/service/{}/job'.format(sample_template.service.id) auth_header = create_authorization_header( From 3f7bae3428341cdb738079198068919b7c42b1b0 Mon Sep 17 00:00:00 2001 From: Rebecca Law Date: Wed, 27 Apr 2016 09:46:45 +0100 Subject: [PATCH 2/2] Removed update_job endpoint because it is not being used --- app/job/rest.py | 16 +--------------- app/schemas.py | 2 +- tests/app/job/test_rest.py | 29 ----------------------------- 3 files changed, 2 insertions(+), 45 deletions(-) diff --git a/app/job/rest.py b/app/job/rest.py index 59eda8666..1e658ccaf 100644 --- a/app/job/rest.py +++ b/app/job/rest.py @@ -7,8 +7,7 @@ from flask import ( from app.dao.jobs_dao import ( dao_create_job, dao_get_job_by_service_id_and_job_id, - dao_get_jobs_by_service_id, - dao_update_job + dao_get_jobs_by_service_id ) from app.dao.services_dao import ( @@ -57,16 +56,3 @@ def create_job(service_id): dao_create_job(job) process_job.apply_async([str(job.id)], queue="process-job") return jsonify(data=job_schema.dump(job).data), 201 - - -@job.route('/', methods=['POST']) -def update_job(service_id, job_id): - fetched_job = dao_get_job_by_service_id_and_job_id(service_id, job_id) - current_data = dict(job_schema.dump(fetched_job).data.items()) - current_data.update(request.get_json()) - - update_dict, errors = job_schema.load(current_data) - if errors: - return jsonify(result="error", message=errors), 400 - dao_update_job(update_dict) - return jsonify(data=job_schema.dump(update_dict).data), 200 diff --git a/app/schemas.py b/app/schemas.py index 9818e6a97..958efa45d 100644 --- a/app/schemas.py +++ b/app/schemas.py @@ -58,7 +58,7 @@ class CreatedBySchema(ma.Schema): if not isinstance(data.get('created_by'), models.User): created_by = models.User.query.filter_by(id=data.get('created_by')).one() except: - raise ValidationError('Invalid template created_by: {}'.format(data)) + raise ValidationError('Invalid created_by: {}'.format(data)) @post_load def format_created_by(self, item): diff --git a/tests/app/job/test_rest.py b/tests/app/job/test_rest.py index fffa384cd..56bebe51d 100644 --- a/tests/app/job/test_rest.py +++ b/tests/app/job/test_rest.py @@ -180,35 +180,6 @@ def test_create_job_returns_404_if_missing_service(notify_api, sample_template, assert resp_json['message'] == 'No result found' -def test_get_update_job(notify_api, sample_job): - assert sample_job.status == 'pending' - - job_id = str(sample_job.id) - service_id = str(sample_job.service.id) - - update_data = { - 'status': 'in progress' - } - - with notify_api.test_request_context(): - with notify_api.test_client() as client: - path = '/service/{}/job/{}'.format(service_id, job_id) - - auth_header = create_authorization_header( - service_id=service_id, - path=path, - method='POST', - request_body=json.dumps(update_data)) - - headers = [('Content-Type', 'application/json'), auth_header] - - response = client.post(path, headers=headers, data=json.dumps(update_data)) - - resp_json = json.loads(response.get_data(as_text=True)) - assert response.status_code == 200 - 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(