From 86efcba7a33507c2a38d1740bda424981071085e Mon Sep 17 00:00:00 2001 From: Ken Tsang Date: Mon, 22 May 2017 11:33:24 +0100 Subject: [PATCH 01/10] Updated service DAO and API end points --- app/schemas.py | 4 ++++ tests/app/dao/test_services_dao.py | 1 + 2 files changed, 5 insertions(+) diff --git a/app/schemas.py b/app/schemas.py index ff4f83a95..cae2135f4 100644 --- a/app/schemas.py +++ b/app/schemas.py @@ -25,7 +25,11 @@ from notifications_utils.recipients import ( from app import ma from app import models +<<<<<<< HEAD from app.models import ServicePermission, INTERNATIONAL_SMS_TYPE, SMS_TYPE, LETTER_TYPE, EMAIL_TYPE +======= +from app.models import ServicePermission +>>>>>>> Updated service DAO and API end points from app.dao.permissions_dao import permission_dao from app.dao.service_permissions_dao import dao_fetch_service_permissions from app.utils import get_template_instance diff --git a/tests/app/dao/test_services_dao.py b/tests/app/dao/test_services_dao.py index b7b3176dd..98d9f2f36 100644 --- a/tests/app/dao/test_services_dao.py +++ b/tests/app/dao/test_services_dao.py @@ -11,6 +11,7 @@ from app.dao.services_dao import ( dao_create_service, dao_add_user_to_service, dao_remove_user_from_service, + dao_remove_service_permission as dao_services_remove_service_permission, dao_fetch_all_services, dao_fetch_service_by_id, dao_fetch_all_services_by_user, From 253614cd196413d2d1a34a60cc3e813461e954d2 Mon Sep 17 00:00:00 2001 From: Ken Tsang Date: Mon, 22 May 2017 13:44:42 +0100 Subject: [PATCH 02/10] Update tests for existing flags to set service permissions --- tests/app/service/test_rest.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/app/service/test_rest.py b/tests/app/service/test_rest.py index 7b5fda823..6999593f8 100644 --- a/tests/app/service/test_rest.py +++ b/tests/app/service/test_rest.py @@ -159,7 +159,7 @@ def test_get_service_list_has_default_permissions(client, service_factory): assert response.status_code == 200 json_resp = json.loads(response.get_data(as_text=True)) assert len(json_resp['data']) == 3 - assert all([set(json['permissions']) == set([EMAIL_TYPE, SMS_TYPE]) for json in json_resp['data']]) + assert all([set(json['permissions']) & set([EMAIL_TYPE, SMS_TYPE]) for json in json_resp['data']]) def test_get_service_by_id_has_default_service_permissions(client, sample_service): From 67246f2da539e0f7d5c946be29e6d66f59aa6867 Mon Sep 17 00:00:00 2001 From: Ken Tsang Date: Tue, 23 May 2017 13:42:46 +0100 Subject: [PATCH 03/10] Update service permissions to ensure state in sync --- app/schemas.py | 4 ---- tests/app/service/test_rest.py | 2 +- 2 files changed, 1 insertion(+), 5 deletions(-) diff --git a/app/schemas.py b/app/schemas.py index cae2135f4..ff4f83a95 100644 --- a/app/schemas.py +++ b/app/schemas.py @@ -25,11 +25,7 @@ from notifications_utils.recipients import ( from app import ma from app import models -<<<<<<< HEAD from app.models import ServicePermission, INTERNATIONAL_SMS_TYPE, SMS_TYPE, LETTER_TYPE, EMAIL_TYPE -======= -from app.models import ServicePermission ->>>>>>> Updated service DAO and API end points from app.dao.permissions_dao import permission_dao from app.dao.service_permissions_dao import dao_fetch_service_permissions from app.utils import get_template_instance diff --git a/tests/app/service/test_rest.py b/tests/app/service/test_rest.py index 6999593f8..7b5fda823 100644 --- a/tests/app/service/test_rest.py +++ b/tests/app/service/test_rest.py @@ -159,7 +159,7 @@ def test_get_service_list_has_default_permissions(client, service_factory): assert response.status_code == 200 json_resp = json.loads(response.get_data(as_text=True)) assert len(json_resp['data']) == 3 - assert all([set(json['permissions']) & set([EMAIL_TYPE, SMS_TYPE]) for json in json_resp['data']]) + assert all([set(json['permissions']) == set([EMAIL_TYPE, SMS_TYPE]) for json in json_resp['data']]) def test_get_service_by_id_has_default_service_permissions(client, sample_service): From eda3e412f7529bd752ae102051b2dd77c5c21f31 Mon Sep 17 00:00:00 2001 From: Ken Tsang Date: Wed, 24 May 2017 11:40:57 +0100 Subject: [PATCH 04/10] Add svc perms migration script and update readme --- migrations/README | 4 ++- .../0086_migrate_default_svc_perms.py | 28 +++++++++++++++++++ 2 files changed, 31 insertions(+), 1 deletion(-) create mode 100644 migrations/versions/0086_migrate_default_svc_perms.py diff --git a/migrations/README b/migrations/README index 6c36a3e0e..7c44eae44 100644 --- a/migrations/README +++ b/migrations/README @@ -1,7 +1,9 @@ Generic single-database configuration. -python application.py db migration to generate migration script. +python application.py db migrate to generate migration script. python application.py db upgrade to upgrade db with script. python application.py db downgrade to rollback db changes. + +python application.py db current to show current script. diff --git a/migrations/versions/0086_migrate_default_svc_perms.py b/migrations/versions/0086_migrate_default_svc_perms.py new file mode 100644 index 000000000..6b740a969 --- /dev/null +++ b/migrations/versions/0086_migrate_default_svc_perms.py @@ -0,0 +1,28 @@ +"""empty message + +Revision ID: 0086_migrate_default_svc_perms +Revises: 0085_update_incoming_to_inbound +Create Date: 2017-05-23 18:13:03.532095 + +""" + +# revision identifiers, used by Alembic. +revision = '0086_migrate_default_svc_perms' +down_revision = '0085_update_incoming_to_inbound' + +from alembic import op +import sqlalchemy as sa + + +def upgrade(): + def get_values(permission): + return "SELECT id, '{0}' FROM services WHERE "\ + "id NOT IN (SELECT service_id FROM service_permissions "\ + "WHERE service_id=id AND permission='{0}')".format(permission) + + op.execute("INSERT INTO service_permissions (service_id, permission) {}".format(get_values('sms'))) + op.execute("INSERT INTO service_permissions (service_id, permission) {}".format(get_values('email'))) + + +def downgrade(): + op.execute("DELETE FROM service_permissions WHERE created_at IS NULL") From 640ab665d04355d28e7c4c1a87c5d48ea5e364e6 Mon Sep 17 00:00:00 2001 From: Ken Tsang Date: Wed, 24 May 2017 13:22:36 +0100 Subject: [PATCH 05/10] Update migration script for service permissions --- ..._perms.py => 0086_migrate_existing_svc_perms.py} | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) rename migrations/versions/{0086_migrate_default_svc_perms.py => 0086_migrate_existing_svc_perms.py} (54%) diff --git a/migrations/versions/0086_migrate_default_svc_perms.py b/migrations/versions/0086_migrate_existing_svc_perms.py similarity index 54% rename from migrations/versions/0086_migrate_default_svc_perms.py rename to migrations/versions/0086_migrate_existing_svc_perms.py index 6b740a969..14701ce6e 100644 --- a/migrations/versions/0086_migrate_default_svc_perms.py +++ b/migrations/versions/0086_migrate_existing_svc_perms.py @@ -1,13 +1,13 @@ """empty message -Revision ID: 0086_migrate_default_svc_perms +Revision ID: 0086_migrate_existing_svc_perms Revises: 0085_update_incoming_to_inbound Create Date: 2017-05-23 18:13:03.532095 """ # revision identifiers, used by Alembic. -revision = '0086_migrate_default_svc_perms' +revision = '0086_migrate_existing_svc_perms' down_revision = '0085_update_incoming_to_inbound' from alembic import op @@ -20,8 +20,17 @@ def upgrade(): "id NOT IN (SELECT service_id FROM service_permissions "\ "WHERE service_id=id AND permission='{0}')".format(permission) + def get_values_from_flag(permission, flag): + return "SELECT id, '{0}' FROM services WHERE "\ + "{1} AND id NOT IN (SELECT service_id FROM service_permissions "\ + "WHERE service_id=id AND permission='{0}')".format(permission, flag) + op.execute("INSERT INTO service_permissions (service_id, permission) {}".format(get_values('sms'))) op.execute("INSERT INTO service_permissions (service_id, permission) {}".format(get_values('email'))) + op.execute("INSERT INTO service_permissions (service_id, permission) {}".format( + get_values_from_flag('letter', 'can_send_letters'))) + op.execute("INSERT INTO service_permissions (service_id, permission) {}".format( + get_values_from_flag('international_sms', 'can_send_international_sms'))) def downgrade(): From a5ab427577293eed9f17d3f3d42810f6b58876d6 Mon Sep 17 00:00:00 2001 From: Ken Tsang Date: Fri, 26 May 2017 14:56:22 +0100 Subject: [PATCH 06/10] Reword migration script --- ...perms.py => 0088_migrate_existing_svc_perms.py} | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) rename migrations/versions/{0086_migrate_existing_svc_perms.py => 0088_migrate_existing_svc_perms.py} (74%) diff --git a/migrations/versions/0086_migrate_existing_svc_perms.py b/migrations/versions/0088_migrate_existing_svc_perms.py similarity index 74% rename from migrations/versions/0086_migrate_existing_svc_perms.py rename to migrations/versions/0088_migrate_existing_svc_perms.py index 14701ce6e..2556d5bf0 100644 --- a/migrations/versions/0086_migrate_existing_svc_perms.py +++ b/migrations/versions/0088_migrate_existing_svc_perms.py @@ -1,14 +1,14 @@ """empty message -Revision ID: 0086_migrate_existing_svc_perms -Revises: 0085_update_incoming_to_inbound +Revision ID: 0088_migrate_existing_svc_perms +Revises: 0087_scheduled_notifications Create Date: 2017-05-23 18:13:03.532095 """ # revision identifiers, used by Alembic. -revision = '0086_migrate_existing_svc_perms' -down_revision = '0085_update_incoming_to_inbound' +revision = '0088_migrate_existing_svc_perms' +down_revision = '0087_scheduled_notifications' from alembic import op import sqlalchemy as sa @@ -20,7 +20,7 @@ def upgrade(): "id NOT IN (SELECT service_id FROM service_permissions "\ "WHERE service_id=id AND permission='{0}')".format(permission) - def get_values_from_flag(permission, flag): + def get_values_if_flag(permission, flag): return "SELECT id, '{0}' FROM services WHERE "\ "{1} AND id NOT IN (SELECT service_id FROM service_permissions "\ "WHERE service_id=id AND permission='{0}')".format(permission, flag) @@ -28,9 +28,9 @@ def upgrade(): op.execute("INSERT INTO service_permissions (service_id, permission) {}".format(get_values('sms'))) op.execute("INSERT INTO service_permissions (service_id, permission) {}".format(get_values('email'))) op.execute("INSERT INTO service_permissions (service_id, permission) {}".format( - get_values_from_flag('letter', 'can_send_letters'))) + get_values_if_flag('letter', 'can_send_letters'))) op.execute("INSERT INTO service_permissions (service_id, permission) {}".format( - get_values_from_flag('international_sms', 'can_send_international_sms'))) + get_values_if_flag('international_sms', 'can_send_international_sms'))) def downgrade(): From 4228e67486088b228203ae992f164394429397d3 Mon Sep 17 00:00:00 2001 From: Ken Tsang Date: Fri, 26 May 2017 15:21:53 +0100 Subject: [PATCH 07/10] Removed dao_remove_service_permission from import --- tests/app/dao/test_services_dao.py | 1 - 1 file changed, 1 deletion(-) diff --git a/tests/app/dao/test_services_dao.py b/tests/app/dao/test_services_dao.py index 98d9f2f36..b7b3176dd 100644 --- a/tests/app/dao/test_services_dao.py +++ b/tests/app/dao/test_services_dao.py @@ -11,7 +11,6 @@ from app.dao.services_dao import ( dao_create_service, dao_add_user_to_service, dao_remove_user_from_service, - dao_remove_service_permission as dao_services_remove_service_permission, dao_fetch_all_services, dao_fetch_service_by_id, dao_fetch_all_services_by_user, From d2ce7518b43a74fa0734ed0cb483f71a2f0cafbe Mon Sep 17 00:00:00 2001 From: Ken Tsang Date: Fri, 26 May 2017 17:45:33 +0100 Subject: [PATCH 08/10] Added value for created_at --- .../0088_migrate_existing_svc_perms.py | 23 +++++++++++-------- 1 file changed, 13 insertions(+), 10 deletions(-) diff --git a/migrations/versions/0088_migrate_existing_svc_perms.py b/migrations/versions/0088_migrate_existing_svc_perms.py index 2556d5bf0..44d830cf4 100644 --- a/migrations/versions/0088_migrate_existing_svc_perms.py +++ b/migrations/versions/0088_migrate_existing_svc_perms.py @@ -12,26 +12,29 @@ down_revision = '0087_scheduled_notifications' from alembic import op import sqlalchemy as sa +import time + +migration_date = time.strftime('2017-05-26 17:30:00.000000') def upgrade(): def get_values(permission): - return "SELECT id, '{0}' FROM services WHERE "\ + return "SELECT id, '{0}', '{1}' FROM services WHERE "\ "id NOT IN (SELECT service_id FROM service_permissions "\ - "WHERE service_id=id AND permission='{0}')".format(permission) + "WHERE service_id=id AND permission='{0}')".format(permission, migration_date) def get_values_if_flag(permission, flag): - return "SELECT id, '{0}' FROM services WHERE "\ - "{1} AND id NOT IN (SELECT service_id FROM service_permissions "\ - "WHERE service_id=id AND permission='{0}')".format(permission, flag) + return "SELECT id, '{0}', '{1}' FROM services WHERE "\ + "{2} AND id NOT IN (SELECT service_id FROM service_permissions "\ + "WHERE service_id=id AND permission='{0}')".format(permission, migration_date, flag) - op.execute("INSERT INTO service_permissions (service_id, permission) {}".format(get_values('sms'))) - op.execute("INSERT INTO service_permissions (service_id, permission) {}".format(get_values('email'))) - op.execute("INSERT INTO service_permissions (service_id, permission) {}".format( + op.execute("INSERT INTO service_permissions (service_id, permission, created_at) {}".format(get_values('sms'))) + op.execute("INSERT INTO service_permissions (service_id, permission, created_at) {}".format(get_values('email'))) + op.execute("INSERT INTO service_permissions (service_id, permission, created_at) {}".format( get_values_if_flag('letter', 'can_send_letters'))) - op.execute("INSERT INTO service_permissions (service_id, permission) {}".format( + op.execute("INSERT INTO service_permissions (service_id, permission, created_at) {}".format( get_values_if_flag('international_sms', 'can_send_international_sms'))) def downgrade(): - op.execute("DELETE FROM service_permissions WHERE created_at IS NULL") + op.execute("DELETE FROM service_permissions WHERE created_at = '{}'::timestamp".format(migration_date)) From c2d308c3b20df52869099159462a21de1a71506c Mon Sep 17 00:00:00 2001 From: Ken Tsang Date: Fri, 26 May 2017 17:51:06 +0100 Subject: [PATCH 09/10] Removed time import --- migrations/versions/0088_migrate_existing_svc_perms.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/migrations/versions/0088_migrate_existing_svc_perms.py b/migrations/versions/0088_migrate_existing_svc_perms.py index 44d830cf4..9e54ee4b4 100644 --- a/migrations/versions/0088_migrate_existing_svc_perms.py +++ b/migrations/versions/0088_migrate_existing_svc_perms.py @@ -12,9 +12,8 @@ down_revision = '0087_scheduled_notifications' from alembic import op import sqlalchemy as sa -import time -migration_date = time.strftime('2017-05-26 17:30:00.000000') +migration_date = '2017-05-26 17:30:00.000000' def upgrade(): From 0cee176d8b06d13d0406d0ce015c8fcffa9b3ecb Mon Sep 17 00:00:00 2001 From: Rebecca Law Date: Thu, 8 Jun 2017 15:24:18 +0100 Subject: [PATCH 10/10] Fix merge conflicts --- ...ng_svc_perms.py => 0095_migrate_existing_svc_perms.py} | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) rename migrations/versions/{0088_migrate_existing_svc_perms.py => 0095_migrate_existing_svc_perms.py} (89%) diff --git a/migrations/versions/0088_migrate_existing_svc_perms.py b/migrations/versions/0095_migrate_existing_svc_perms.py similarity index 89% rename from migrations/versions/0088_migrate_existing_svc_perms.py rename to migrations/versions/0095_migrate_existing_svc_perms.py index 9e54ee4b4..0211450f8 100644 --- a/migrations/versions/0088_migrate_existing_svc_perms.py +++ b/migrations/versions/0095_migrate_existing_svc_perms.py @@ -1,14 +1,14 @@ """empty message -Revision ID: 0088_migrate_existing_svc_perms -Revises: 0087_scheduled_notifications +Revision ID: 0095_migrate_existing_svc_perms +Revises: 0094_job_stats_update Create Date: 2017-05-23 18:13:03.532095 """ # revision identifiers, used by Alembic. -revision = '0088_migrate_existing_svc_perms' -down_revision = '0087_scheduled_notifications' +revision = '0095_migrate_existing_svc_perms' +down_revision = '0094_job_stats_update' from alembic import op import sqlalchemy as sa