From 7c0c2a9a0f69e1bf289992c6e243783330504ee6 Mon Sep 17 00:00:00 2001 From: venusbb Date: Tue, 14 Nov 2017 09:43:28 +0000 Subject: [PATCH 1/3] migrate data from service table to annual billing --- .../0136_migrate_sms_allowance_data.py | 49 +++++++++++++++++++ 1 file changed, 49 insertions(+) create mode 100644 migrations/versions/0136_migrate_sms_allowance_data.py diff --git a/migrations/versions/0136_migrate_sms_allowance_data.py b/migrations/versions/0136_migrate_sms_allowance_data.py new file mode 100644 index 000000000..ba0ef3562 --- /dev/null +++ b/migrations/versions/0136_migrate_sms_allowance_data.py @@ -0,0 +1,49 @@ +""" + +Revision ID: 013_migrate_sms_allowance_data.py +Revises: 0135_stats_template_usage.py +Create Date: 2017-11-10 21:42:59.715203 + +""" +from datetime import datetime +from alembic import op +import uuid +from app.dao.date_util import get_current_financial_year_start_year + + +revision = '0136_migrate_sms_allowance_data' +down_revision = '0135_stats_template_usage' + + +def upgrade(): + current_year = get_current_financial_year_start_year() + default_limit = 250000 + + # Step 1: update the column free_sms_fragment_limit in service table if it is empty + update_service_table = """ + UPDATE services SET free_sms_fragment_limit = {} where free_sms_fragment_limit is null + """.format(default_limit) + + op.execute(update_service_table) + + # Step 2: insert at least one row for every service in current year if none exist for that service + insert_row_if_not_exist = """ + INSERT INTO annual_billing + (id, service_id, financial_year_start, free_sms_fragment_limit, created_at, updated_at) + SELECT uuid_in(md5(random()::text || now()::text)::cstring), id, {}, {}, '{}', '{}' + FROM services WHERE id NOT IN + (select service_id from annual_billing) + """.format(current_year, default_limit, datetime.utcnow(), datetime.utcnow()) + op.execute(insert_row_if_not_exist) + + # Step 3: copy the free_sms_fragment_limit data from the services table across to annual_billing table. + update_sms_allowance = """ + UPDATE annual_billing SET free_sms_fragment_limit = services.free_sms_fragment_limit + FROM services + WHERE annual_billing.service_id = services.id + """ + op.execute(update_sms_allowance) + + +def downgrade(): + print('There is no action for downgrading to the previous version.') \ No newline at end of file From 4e487e708be1a1210cdc83edc3b1a16cdbdbac21 Mon Sep 17 00:00:00 2001 From: venusbb Date: Tue, 14 Nov 2017 16:11:59 +0000 Subject: [PATCH 2/3] Bridging API to update annual_billing table --- app/billing/rest.py | 10 ++++++---- app/service/rest.py | 5 +++++ 2 files changed, 11 insertions(+), 4 deletions(-) diff --git a/app/billing/rest.py b/app/billing/rest.py index 614842d3f..1bdeaf6a9 100644 --- a/app/billing/rest.py +++ b/app/billing/rest.py @@ -135,14 +135,16 @@ def create_or_update_free_sms_fragment_limit(service_id): form = validate(req_args, create_or_update_free_sms_fragment_limit_schema) - financial_year_start = form.get('financial_year_start') - free_sms_fragment_limit = form.get('free_sms_fragment_limit') + update_free_sms_fragment_limit_data(service_id, + free_sms_fragment_limit=form.get('free_sms_fragment_limit'), + financial_year_start=form.get('financial_year_start')) + return jsonify(form), 201 + +def update_free_sms_fragment_limit_data(service_id, free_sms_fragment_limit, financial_year_start=None): current_year = get_current_financial_year_start_year() if financial_year_start is None or financial_year_start >= current_year: dao_update_annual_billing_for_current_and_future_years(service_id, free_sms_fragment_limit) else: dao_create_or_update_annual_billing_for_year(service_id, free_sms_fragment_limit, financial_year_start) - - return jsonify(form), 201 diff --git a/app/service/rest.py b/app/service/rest.py index c6e8c4201..a17920d36 100644 --- a/app/service/rest.py +++ b/app/service/rest.py @@ -98,6 +98,7 @@ from app.schemas import ( detailed_service_schema ) from app.utils import pagination_links +from app.billing.rest import update_free_sms_fragment_limit_data service_blueprint = Blueprint('service', __name__) @@ -202,6 +203,10 @@ def update_service(service_id): if 'letter_contact_block' in req_json: create_or_update_letter_contact(fetched_service.id, req_json['letter_contact_block']) + # bridging code between frontend is deployed and data has not been migrated yet. Can only update current year + if 'free_sms_fragment_limit' in req_json: + update_free_sms_fragment_limit_data(fetched_service.id, req_json['free_sms_fragment_limit']) + if service_going_live: send_notification_to_service_users( service_id=service_id, From e903257156f93d8dea364cd189407259436d1f9d Mon Sep 17 00:00:00 2001 From: venusbb Date: Wed, 15 Nov 2017 11:25:27 +0000 Subject: [PATCH 3/3] version change because of other commits --- ...nce_data.py => 0138_migrate_sms_allowance_data.py} | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) rename migrations/versions/{0136_migrate_sms_allowance_data.py => 0138_migrate_sms_allowance_data.py} (81%) diff --git a/migrations/versions/0136_migrate_sms_allowance_data.py b/migrations/versions/0138_migrate_sms_allowance_data.py similarity index 81% rename from migrations/versions/0136_migrate_sms_allowance_data.py rename to migrations/versions/0138_migrate_sms_allowance_data.py index ba0ef3562..95bb8f0a7 100644 --- a/migrations/versions/0136_migrate_sms_allowance_data.py +++ b/migrations/versions/0138_migrate_sms_allowance_data.py @@ -1,7 +1,7 @@ """ -Revision ID: 013_migrate_sms_allowance_data.py -Revises: 0135_stats_template_usage.py +Revision ID: 0138_migrate_sms_allowance_data.py +Revises: 0137_stats_template_usage.py Create Date: 2017-11-10 21:42:59.715203 """ @@ -11,8 +11,8 @@ import uuid from app.dao.date_util import get_current_financial_year_start_year -revision = '0136_migrate_sms_allowance_data' -down_revision = '0135_stats_template_usage' +revision = '0138_migrate_sms_allowance_data' +down_revision = '0137_notification_template_hist' def upgrade(): @@ -30,7 +30,7 @@ def upgrade(): insert_row_if_not_exist = """ INSERT INTO annual_billing (id, service_id, financial_year_start, free_sms_fragment_limit, created_at, updated_at) - SELECT uuid_in(md5(random()::text || now()::text)::cstring), id, {}, {}, '{}', '{}' + SELECT uuid_in(md5(random()::text)::cstring), id, {}, {}, '{}', '{}' FROM services WHERE id NOT IN (select service_id from annual_billing) """.format(current_year, default_limit, datetime.utcnow(), datetime.utcnow()) @@ -46,4 +46,5 @@ def upgrade(): def downgrade(): + # There is no schema change. Only data migration and filling in gaps. print('There is no action for downgrading to the previous version.') \ No newline at end of file