From 09cb94081bcbffb09ba28f1a2bff6cbd915ba37e Mon Sep 17 00:00:00 2001 From: Martyn Inglis Date: Tue, 23 Aug 2016 16:46:58 +0100 Subject: [PATCH 1/4] Returns the outcome statistics for the job on the API call. --- app/dao/jobs_dao.py | 21 ++++++-- app/job/rest.py | 7 ++- app/schemas.py | 6 ++- tests/app/dao/test_jobs_dao.py | 89 ++++++++++++++++++++++++++++++- tests/app/job/test_rest.py | 96 ++++++++++++++++++++++++++++------ 5 files changed, 197 insertions(+), 22 deletions(-) diff --git a/app/dao/jobs_dao.py b/app/dao/jobs_dao.py index 13742418a..1ebba4893 100644 --- a/app/dao/jobs_dao.py +++ b/app/dao/jobs_dao.py @@ -1,9 +1,24 @@ -from datetime import date, timedelta - from sqlalchemy import desc, cast, Date as sql_date from app import db from app.dao import days_ago -from app.models import Job +from app.models import Job, NotificationHistory +from app.statsd_decorators import statsd +from sqlalchemy import func, asc + + +@statsd(namespace="dao") +def dao_get_notification_outcomes_for_job(service_id, job_id): + query = db.session.query( + func.count(NotificationHistory.status).label('count'), + NotificationHistory.status.label('status') + ) + + return query \ + .filter(NotificationHistory.service_id == service_id) \ + .filter(NotificationHistory.job_id == job_id)\ + .group_by(NotificationHistory.status) \ + .order_by(asc(NotificationHistory.status)) \ + .all() def dao_get_job_by_service_id_and_job_id(service_id, job_id): diff --git a/app/job/rest.py b/app/job/rest.py index c40172a85..a9efb3ebf 100644 --- a/app/job/rest.py +++ b/app/job/rest.py @@ -8,7 +8,8 @@ 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_get_jobs_by_service_id, + dao_get_notification_outcomes_for_job ) from app.dao.services_dao import ( @@ -42,7 +43,11 @@ register_errors(job) @job.route('/', methods=['GET']) def get_job_by_service_and_job_id(service_id, job_id): job = dao_get_job_by_service_id_and_job_id(service_id, job_id) + statistics = dao_get_notification_outcomes_for_job(service_id, job_id) data = job_schema.dump(job).data + + data['statistics'] = [{'status': statistic[1], 'count': statistic[0]} for statistic in statistics] + return jsonify(data=data) diff --git a/app/schemas.py b/app/schemas.py index a28c4aa94..db654b0ed 100644 --- a/app/schemas.py +++ b/app/schemas.py @@ -210,7 +210,11 @@ class JobSchema(BaseSchema): class Meta: model = models.Job - exclude = ('notifications',) + exclude = ( + 'notifications', + 'notifications_sent', + 'notifications_delivered', + 'notifications_failed') strict = True diff --git a/tests/app/dao/test_jobs_dao.py b/tests/app/dao/test_jobs_dao.py index 9f265ab0d..0a69ffbc3 100644 --- a/tests/app/dao/test_jobs_dao.py +++ b/tests/app/dao/test_jobs_dao.py @@ -5,10 +5,95 @@ from app.dao.jobs_dao import ( dao_get_job_by_service_id_and_job_id, dao_create_job, dao_update_job, - dao_get_jobs_by_service_id -) + dao_get_jobs_by_service_id, + dao_get_notification_outcomes_for_job) from app.models import Job +from tests.app.conftest import sample_notification, sample_job, sample_service + + +def test_should_have_decorated_notifications_dao_functions(): + assert dao_get_notification_outcomes_for_job.__wrapped__.__name__ == 'dao_get_notification_outcomes_for_job' # noqa + + +def test_should_get_all_statuses_for_notifications_associated_with_job( + notify_db, + notify_db_session, + sample_service, + sample_job): + + sample_notification(notify_db, notify_db_session, service=sample_service, job=sample_job, status='created') + sample_notification(notify_db, notify_db_session, service=sample_service, job=sample_job, status='sending') + sample_notification(notify_db, notify_db_session, service=sample_service, job=sample_job, status='delivered') + sample_notification(notify_db, notify_db_session, service=sample_service, job=sample_job, status='pending') + sample_notification(notify_db, notify_db_session, service=sample_service, job=sample_job, status='failed') + sample_notification(notify_db, notify_db_session, service=sample_service, job=sample_job, status='technical-failure') # noqa + sample_notification(notify_db, notify_db_session, service=sample_service, job=sample_job, status='temporary-failure') # noqa + sample_notification(notify_db, notify_db_session, service=sample_service, job=sample_job, status='permanent-failure') # noqa + + results = dao_get_notification_outcomes_for_job(sample_service.id, sample_job.id) + assert [(row.count, row.status) for row in results] == [ + (1, 'created'), + (1, 'sending'), + (1, 'delivered'), + (1, 'pending'), + (1, 'failed'), + (1, 'technical-failure'), + (1, 'temporary-failure'), + (1, 'permanent-failure') + ] + + +def test_should_count_of_statuses_for_notifications_associated_with_job( + notify_db, + notify_db_session, + sample_service, + sample_job): + sample_notification(notify_db, notify_db_session, service=sample_service, job=sample_job, status='created') + sample_notification(notify_db, notify_db_session, service=sample_service, job=sample_job, status='created') + sample_notification(notify_db, notify_db_session, service=sample_service, job=sample_job, status='sending') + sample_notification(notify_db, notify_db_session, service=sample_service, job=sample_job, status='sending') + sample_notification(notify_db, notify_db_session, service=sample_service, job=sample_job, status='sending') + sample_notification(notify_db, notify_db_session, service=sample_service, job=sample_job, status='sending') + sample_notification(notify_db, notify_db_session, service=sample_service, job=sample_job, status='delivered') + sample_notification(notify_db, notify_db_session, service=sample_service, job=sample_job, status='delivered') + + results = dao_get_notification_outcomes_for_job(sample_service.id, sample_job.id) + assert [(row.count, row.status) for row in results] == [ + (2, 'created'), + (4, 'sending'), + (2, 'delivered') + ] + + +def test_should_return_zero_length_array_if_no_notifications_for_job(sample_service, sample_job): + assert len(dao_get_notification_outcomes_for_job(sample_job.id, sample_service.id)) == 0 + + +def test_should_return_notifications_only_for_this_job(notify_db, notify_db_session, sample_service): + job_1 = sample_job(notify_db, notify_db_session, service=sample_service) + job_2 = sample_job(notify_db, notify_db_session, service=sample_service) + + sample_notification(notify_db, notify_db_session, service=sample_service, job=job_1, status='created') + sample_notification(notify_db, notify_db_session, service=sample_service, job=job_2, status='created') + + results = dao_get_notification_outcomes_for_job(sample_service.id, job_1.id) + assert [(row.count, row.status) for row in results] == [ + (1, 'created') + ] + + +def test_should_return_notifications_only_for_this_service(notify_db, notify_db_session): + service_1 = sample_service(notify_db, notify_db_session, service_name="one", email_from="one") + service_2 = sample_service(notify_db, notify_db_session, service_name="two", email_from="two") + + job_1 = sample_job(notify_db, notify_db_session, service=service_1) + job_2 = sample_job(notify_db, notify_db_session, service=service_2) + + sample_notification(notify_db, notify_db_session, service=service_1, job=job_1, status='created') + sample_notification(notify_db, notify_db_session, service=service_2, job=job_2, status='created') + + assert len(dao_get_notification_outcomes_for_job(service_1.id, job_2.id)) == 0 def test_create_job(sample_template): diff --git a/tests/app/job/test_rest.py b/tests/app/job/test_rest.py index ea65bb447..bf4afeca0 100644 --- a/tests/app/job/test_rest.py +++ b/tests/app/job/test_rest.py @@ -9,7 +9,7 @@ import app.celery.tasks from tests import create_authorization_header from tests.app.conftest import ( sample_job as create_job, - sample_notification as create_sample_notification) + sample_notification as create_sample_notification, sample_notification) from app.dao.templates_dao import dao_update_template from app.models import NOTIFICATION_STATUS_TYPES @@ -94,20 +94,6 @@ def test_get_job_with_unknown_id_returns404(notify_api, sample_template, fake_uu } -def test_get_job_by_id(notify_api, sample_job): - job_id = str(sample_job.id) - service_id = sample_job.service.id - 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=sample_job.service.id) - response = client.get(path, headers=[auth_header]) - assert response.status_code == 200 - resp_json = json.loads(response.get_data(as_text=True)) - assert resp_json['data']['id'] == job_id - assert resp_json['data']['created_by']['name'] == 'Test User' - - def test_create_job(notify_api, sample_template, mocker, fake_uuid): with notify_api.test_request_context(): with notify_api.test_client() as client: @@ -350,3 +336,83 @@ def test_get_all_notifications_for_job_filtered_by_status( resp = json.loads(response.get_data(as_text=True)) assert len(resp['notifications']) == expected_notification_count assert response.status_code == 200 + + +def test_get_job_by_id(notify_api, sample_job): + job_id = str(sample_job.id) + service_id = sample_job.service.id + 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=sample_job.service.id) + response = client.get(path, headers=[auth_header]) + assert response.status_code == 200 + resp_json = json.loads(response.get_data(as_text=True)) + assert resp_json['data']['id'] == job_id + assert resp_json['data']['statistics'] == [] + assert resp_json['data']['created_by']['name'] == 'Test User' + + +def test_get_job_by_id_should_return_statistics(notify_db, notify_db_session, notify_api, sample_job): + job_id = str(sample_job.id) + service_id = sample_job.service.id + + sample_notification(notify_db, notify_db_session, service=sample_job.service, job=sample_job, status='created') + sample_notification(notify_db, notify_db_session, service=sample_job.service, job=sample_job, status='sending') + sample_notification(notify_db, notify_db_session, service=sample_job.service, job=sample_job, status='delivered') + sample_notification(notify_db, notify_db_session, service=sample_job.service, job=sample_job, status='pending') + sample_notification(notify_db, notify_db_session, service=sample_job.service, job=sample_job, status='failed') + sample_notification(notify_db, notify_db_session, service=sample_job.service, job=sample_job, status='technical-failure') # noqa + sample_notification(notify_db, notify_db_session, service=sample_job.service, job=sample_job, status='temporary-failure') # noqa + sample_notification(notify_db, notify_db_session, service=sample_job.service, job=sample_job, status='permanent-failure') # noqa + + 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=sample_job.service.id) + response = client.get(path, headers=[auth_header]) + assert response.status_code == 200 + resp_json = json.loads(response.get_data(as_text=True)) + print(resp_json) + assert resp_json['data']['id'] == job_id + assert {'status': 'created', 'count': 1} in resp_json['data']['statistics'] + assert {'status': 'sending', 'count': 1} in resp_json['data']['statistics'] + assert {'status': 'delivered', 'count': 1} in resp_json['data']['statistics'] + assert {'status': 'pending', 'count': 1} in resp_json['data']['statistics'] + assert {'status': 'failed', 'count': 1} in resp_json['data']['statistics'] + assert {'status': 'technical-failure', 'count': 1} in resp_json['data']['statistics'] + assert {'status': 'temporary-failure', 'count': 1} in resp_json['data']['statistics'] + assert {'status': 'permanent-failure', 'count': 1} in resp_json['data']['statistics'] + assert resp_json['data']['created_by']['name'] == 'Test User' + + +def test_get_job_by_id_should_return_summed_statistics(notify_db, notify_db_session, notify_api, sample_job): + job_id = str(sample_job.id) + service_id = sample_job.service.id + + sample_notification(notify_db, notify_db_session, service=sample_job.service, job=sample_job, status='created') + sample_notification(notify_db, notify_db_session, service=sample_job.service, job=sample_job, status='created') + sample_notification(notify_db, notify_db_session, service=sample_job.service, job=sample_job, status='created') + sample_notification(notify_db, notify_db_session, service=sample_job.service, job=sample_job, status='sending') + sample_notification(notify_db, notify_db_session, service=sample_job.service, job=sample_job, status='failed') + sample_notification(notify_db, notify_db_session, service=sample_job.service, job=sample_job, status='failed') + sample_notification(notify_db, notify_db_session, service=sample_job.service, job=sample_job, status='failed') + sample_notification(notify_db, notify_db_session, service=sample_job.service, job=sample_job, status='technical-failure') # noqa + sample_notification(notify_db, notify_db_session, service=sample_job.service, job=sample_job, status='temporary-failure') # noqa + sample_notification(notify_db, notify_db_session, service=sample_job.service, job=sample_job, status='temporary-failure') # noqa + + 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=sample_job.service.id) + response = client.get(path, headers=[auth_header]) + assert response.status_code == 200 + resp_json = json.loads(response.get_data(as_text=True)) + print(resp_json) + assert resp_json['data']['id'] == job_id + assert {'status': 'created', 'count': 3} in resp_json['data']['statistics'] + assert {'status': 'sending', 'count': 1} in resp_json['data']['statistics'] + assert {'status': 'failed', 'count': 3} in resp_json['data']['statistics'] + assert {'status': 'technical-failure', 'count': 1} in resp_json['data']['statistics'] + assert {'status': 'temporary-failure', 'count': 2} in resp_json['data']['statistics'] + assert resp_json['data']['created_by']['name'] == 'Test User' From 5adecda41e949a22f83384bb2431906c3dca053c Mon Sep 17 00:00:00 2001 From: Martyn Inglis Date: Wed, 24 Aug 2016 13:34:42 +0100 Subject: [PATCH 2/4] Adds new job_status table and FK to jobs. This will replace the job_status enum type. --- app/models.py | 19 +++++++++ .../versions/0048_job_scheduled_time.py | 41 +++++++++++++++++++ 2 files changed, 60 insertions(+) create mode 100644 migrations/versions/0048_job_scheduled_time.py diff --git a/app/models.py b/app/models.py index efe5bb7b7..9c1329576 100644 --- a/app/models.py +++ b/app/models.py @@ -303,6 +303,19 @@ class ProviderDetails(db.Model): JOB_STATUS_TYPES = ['pending', 'in progress', 'finished', 'sending limits exceeded'] +JOB_STATUS_PENDING = 'pending' +JOB_STATUS_IN_PROGRESS = 'in progress' +JOB_STATUS_FINISHED = 'finished' +JOB_STATUS_SENDING_LIMITS_EXCEEDED = 'sending limits exceeded' +JOB_STATUS_SCHEDULED = 'scheduled' + + +class JobStatusTypes(db.Model): + __tablename__ = 'job_status' + + name = db.Column(db.String(255), primary_key=True) + + class Job(db.Model): __tablename__ = 'jobs' @@ -343,6 +356,12 @@ class Job(db.Model): nullable=True) created_by = db.relationship('User') created_by_id = db.Column(UUID(as_uuid=True), db.ForeignKey('users.id'), index=True, nullable=False) + scheduled_for = db.Column( + db.DateTime, + index=True, + unique=False, + nullable=True) + job_status = db.Column(db.String(255), db.ForeignKey('job_status.name'), index=True, nullable=True) VERIFY_CODE_TYPES = [EMAIL_TYPE, SMS_TYPE] diff --git a/migrations/versions/0048_job_scheduled_time.py b/migrations/versions/0048_job_scheduled_time.py new file mode 100644 index 000000000..8edbbb62e --- /dev/null +++ b/migrations/versions/0048_job_scheduled_time.py @@ -0,0 +1,41 @@ +"""empty message + +Revision ID: 0048_job_scheduled_time +Revises: 0047_ukvi_spelling +Create Date: 2016-08-24 13:21:51.744526 + +""" + +# revision identifiers, used by Alembic. +revision = '0048_job_scheduled_time' +down_revision = '0047_ukvi_spelling' + +from alembic import op +import sqlalchemy as sa + + +def upgrade(): + op.create_table('job_status', + sa.Column('name', sa.String(length=255), nullable=False), + sa.PrimaryKeyConstraint('name') + ) + op.add_column('jobs', sa.Column('job_status', sa.String(length=255), nullable=True)) + op.add_column('jobs', sa.Column('scheduled_for', sa.DateTime(), nullable=True)) + op.create_index(op.f('ix_jobs_job_status'), 'jobs', ['job_status'], unique=False) + op.create_index(op.f('ix_jobs_scheduled_for'), 'jobs', ['scheduled_for'], unique=False) + op.create_foreign_key(None, 'jobs', 'job_status', ['job_status'], ['name']) + + op.execute("insert into job_status values ('pending')") + op.execute("insert into job_status values ('in progress')") + op.execute("insert into job_status values ('finished')") + op.execute("insert into job_status values ('sending limits exceeded')") + op.execute("insert into job_status values ('scheduled')") + + +def downgrade(): + op.drop_constraint('jobs_job_status_fkey', 'jobs', type_='foreignkey') + op.drop_index(op.f('ix_jobs_scheduled_for'), table_name='jobs') + op.drop_index(op.f('ix_jobs_job_status'), table_name='jobs') + op.drop_column('jobs', 'scheduled_for') + op.drop_column('jobs', 'job_status') + op.drop_table('job_status') From 805da23d6bccb041a639a3daed4a6d6e7e41a821 Mon Sep 17 00:00:00 2001 From: Martyn Inglis Date: Wed, 24 Aug 2016 14:04:52 +0100 Subject: [PATCH 3/4] Starting to implement scheduling --- app/models.py | 3 +- .../0044_jobs_to_notification_hist.py | 115 ++++++++++-------- tests/app/job/test_rest.py | 2 + 3 files changed, 66 insertions(+), 54 deletions(-) diff --git a/app/models.py b/app/models.py index 9c1329576..d13278715 100644 --- a/app/models.py +++ b/app/models.py @@ -361,7 +361,8 @@ class Job(db.Model): index=True, unique=False, nullable=True) - job_status = db.Column(db.String(255), db.ForeignKey('job_status.name'), index=True, nullable=True) + job_status = db.Column( + db.String(255), db.ForeignKey('job_status.name'), index=True, nullable=True, default="pending") VERIFY_CODE_TYPES = [EMAIL_TYPE, SMS_TYPE] diff --git a/migrations/versions/0044_jobs_to_notification_hist.py b/migrations/versions/0044_jobs_to_notification_hist.py index dc4df6770..119d3e03b 100644 --- a/migrations/versions/0044_jobs_to_notification_hist.py +++ b/migrations/versions/0044_jobs_to_notification_hist.py @@ -20,59 +20,68 @@ from app.models import Job, Template, NotificationHistory def upgrade(): - session = Session(bind=op.get_bind()) - - go_live = datetime.datetime.strptime('2016-05-18', '%Y-%m-%d') - notifications_history_start_date = datetime.datetime.strptime('2016-06-26 23:21:55', '%Y-%m-%d %H:%M:%S') - jobs = session.query(Job).join(Template).filter(Job.service_id == '95316ff0-e555-462d-a6e7-95d26fbfd091', - Job.created_at >= go_live, - Job.created_at < notifications_history_start_date).all() - - for job in jobs: - for i in range(0, job.notifications_delivered): - notification = NotificationHistory(id=uuid.uuid4(), - job_id=job.id, - service_id=job.service_id, - template_id=job.template.id, - template_version=job.template_version, - key_type='normal', - content_char_count=len(job.template.content), - notification_type=job.template.template_type, - created_at=job.created_at, - sent_at=job.processing_finished, - sent_by='ses' if job.template.template_type == 'email' else 'mmg', - status='delivered') - - session.add(notification) - - for i in range(0, job.notifications_failed): - notification = NotificationHistory(id=uuid.uuid4(), - job_id=job.id, - service_id=job.service_id, - template_id=job.template.id, - template_version=job.template_version, - key_type='normal', - content_char_count=len(job.template.content), - notification_type=job.template.template_type, - created_at=job.created_at, - sent_at=job.processing_finished, - sent_by='ses' if job.template.template_type == 'email' else 'mmg', - status='permanent-failure') - session.add(notification) - session.commit() + # + # REMOVED + # This script has been applied and doesn't need to be re-applied + # note that by referencing the model objects in migration files, any subsequent alteration of the model and thus + # the database causes all previous migration scripts to fail as the model and DB will be inconsistent in this + # past state. + # + # session = Session(bind=op.get_bind()) + # + # go_live = datetime.datetime.strptime('2016-05-18', '%Y-%m-%d') + # notifications_history_start_date = datetime.datetime.strptime('2016-06-26 23:21:55', '%Y-%m-%d %H:%M:%S') + # jobs = session.query(Job).join(Template).filter(Job.service_id == '95316ff0-e555-462d-a6e7-95d26fbfd091', + # Job.created_at >= go_live, + # Job.created_at < notifications_history_start_date).all() + # + # for job in jobs: + # for i in range(0, job.notifications_delivered): + # notification = NotificationHistory(id=uuid.uuid4(), + # job_id=job.id, + # service_id=job.service_id, + # template_id=job.template.id, + # template_version=job.template_version, + # key_type='normal', + # content_char_count=len(job.template.content), + # notification_type=job.template.template_type, + # created_at=job.created_at, + # sent_at=job.processing_finished, + # sent_by='ses' if job.template.template_type == 'email' else 'mmg', + # status='delivered') + # + # session.add(notification) + # + # for i in range(0, job.notifications_failed): + # notification = NotificationHistory(id=uuid.uuid4(), + # job_id=job.id, + # service_id=job.service_id, + # template_id=job.template.id, + # template_version=job.template_version, + # key_type='normal', + # content_char_count=len(job.template.content), + # notification_type=job.template.template_type, + # created_at=job.created_at, + # sent_at=job.processing_finished, + # sent_by='ses' if job.template.template_type == 'email' else 'mmg', + # status='permanent-failure') + # session.add(notification) + # session.commit() + pass def downgrade(): - ### commands auto generated by Alembic - please adjust! ### - session = Session(bind=op.get_bind()) - - go_live = datetime.datetime.strptime('2016-05-18', '%Y-%m-%d') - notifications_history_start_date = datetime.datetime.strptime('2016-06-26 23:21:55', '%Y-%m-%d %H:%M:%S') - - session.query(NotificationHistory).filter( - NotificationHistory.created_at >= go_live, - NotificationHistory.service_id == '95316ff0-e555-462d-a6e7-95d26fbfd091', - NotificationHistory.created_at < notifications_history_start_date).delete() - - session.commit() - ### end Alembic commands ### + # ### commands auto generated by Alembic - please adjust! ### + # session = Session(bind=op.get_bind()) + # + # go_live = datetime.datetime.strptime('2016-05-18', '%Y-%m-%d') + # notifications_history_start_date = datetime.datetime.strptime('2016-06-26 23:21:55', '%Y-%m-%d %H:%M:%S') + # + # session.query(NotificationHistory).filter( + # NotificationHistory.created_at >= go_live, + # NotificationHistory.service_id == '95316ff0-e555-462d-a6e7-95d26fbfd091', + # NotificationHistory.created_at < notifications_history_start_date).delete() + # + # session.commit() + # ### end Alembic commands ### + pass diff --git a/tests/app/job/test_rest.py b/tests/app/job/test_rest.py index ea65bb447..4f9fdfc14 100644 --- a/tests/app/job/test_rest.py +++ b/tests/app/job/test_rest.py @@ -123,10 +123,12 @@ def test_create_job(notify_api, sample_template, mocker, fake_uuid): path = '/service/{}/job'.format(sample_template.service.id) auth_header = create_authorization_header(service_id=sample_template.service.id) headers = [('Content-Type', 'application/json'), auth_header] + response = client.post( path, data=json.dumps(data), headers=headers) + print(json.loads(response.get_data(as_text=True))) assert response.status_code == 201 app.celery.tasks.process_job.apply_async.assert_called_once_with( From 1e10c0485c4ab25773c489a56914c685a32aedcf Mon Sep 17 00:00:00 2001 From: Martyn Inglis Date: Wed, 24 Aug 2016 14:05:54 +0100 Subject: [PATCH 4/4] Removed some code --- app/models.py | 2 +- tests/app/job/test_rest.py | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/app/models.py b/app/models.py index d13278715..6bb870b6d 100644 --- a/app/models.py +++ b/app/models.py @@ -362,7 +362,7 @@ class Job(db.Model): unique=False, nullable=True) job_status = db.Column( - db.String(255), db.ForeignKey('job_status.name'), index=True, nullable=True, default="pending") + db.String(255), db.ForeignKey('job_status.name'), index=True, nullable=True) VERIFY_CODE_TYPES = [EMAIL_TYPE, SMS_TYPE] diff --git a/tests/app/job/test_rest.py b/tests/app/job/test_rest.py index 4f9fdfc14..2d77c2a4b 100644 --- a/tests/app/job/test_rest.py +++ b/tests/app/job/test_rest.py @@ -128,7 +128,6 @@ def test_create_job(notify_api, sample_template, mocker, fake_uuid): path, data=json.dumps(data), headers=headers) - print(json.loads(response.get_data(as_text=True))) assert response.status_code == 201 app.celery.tasks.process_job.apply_async.assert_called_once_with(