From b20d91c7844181633bc4ed3543f20e0cb619a205 Mon Sep 17 00:00:00 2001 From: dandds Date: Tue, 4 Sep 2018 09:55:15 -0400 Subject: [PATCH] migrate existing request bodies to revisions and remove requests body column --- ...0e1bd0d7ce_remove_revisions_body_column.py | 65 +++++++++++++++++++ atst/models/request.py | 2 - 2 files changed, 65 insertions(+), 2 deletions(-) create mode 100644 alembic/versions/090e1bd0d7ce_remove_revisions_body_column.py diff --git a/alembic/versions/090e1bd0d7ce_remove_revisions_body_column.py b/alembic/versions/090e1bd0d7ce_remove_revisions_body_column.py new file mode 100644 index 00000000..2f86e110 --- /dev/null +++ b/alembic/versions/090e1bd0d7ce_remove_revisions_body_column.py @@ -0,0 +1,65 @@ +"""remove revisions body column + +Revision ID: 090e1bd0d7ce +Revises: a903ebe91ad5 +Create Date: 2018-08-31 12:08:52.376027 + +""" +from alembic import op +import sqlalchemy as sa +from sqlalchemy.orm import sessionmaker +from sqlalchemy.dialects import postgresql + +from atst.models.request import Request +from atst.utils import deep_merge +from atst.domain.requests import create_revision_from_request_body + + +# revision identifiers, used by Alembic. +revision = '090e1bd0d7ce' +down_revision = 'a903ebe91ad5' +branch_labels = None +depends_on = None + + +def delete_two_deep(body, key1, key2): + result = body.get(key1, {}).get(key2) + if result: + del(body[key1][key2]) + + return body + + +def massaged_revision(body): + try: + return create_revision_from_request_body(body) + except ValueError: + # some of the data on staging has out-of-range dates like "02/29/2019"; + # we don't know how to coerce them to valid dates, so we remove those + # fields. + body = delete_two_deep(body, "details_of_use", "start_date") + body = delete_two_deep(body, "information_about_you", "date_latest_training") + + return create_revision_from_request_body(body) + + +def upgrade(): + Session = sessionmaker(bind=op.get_bind()) + session = Session() + for request in session.query(Request).all(): + (body,) = session.execute("SELECT body from requests WHERE id='{}'".format(request.id)).fetchone() + + # this data should already exist as a task_order + if body.get("financial_verification"): + del(body["financial_verification"]) + + revision = massaged_revision(body) + request.revisions.append(revision) + session.add(request) + + op.drop_column('requests', 'body') + + +def downgrade(): + op.add_column('requests', sa.Column('body', postgresql.JSONB(astext_type=sa.Text()), autoincrement=False, nullable=True)) + diff --git a/atst/models/request.py b/atst/models/request.py index b64908f8..aa2db013 100644 --- a/atst/models/request.py +++ b/atst/models/request.py @@ -1,6 +1,5 @@ from sqlalchemy import Column, func, ForeignKey from sqlalchemy.types import DateTime -from sqlalchemy.dialects.postgresql import JSONB from sqlalchemy.orm import relationship import pendulum @@ -32,7 +31,6 @@ class Request(Base): id = Id() time_created = Column(DateTime(timezone=True), server_default=func.now()) - body = Column(JSONB) status_events = relationship( "RequestStatusEvent", backref="request", order_by="RequestStatusEvent.sequence" )