migrate existing request bodies to revisions and remove requests body column

This commit is contained in:
dandds 2018-09-04 09:55:15 -04:00
parent 326d330a40
commit b20d91c784
2 changed files with 65 additions and 2 deletions

View File

@ -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))

View File

@ -1,6 +1,5 @@
from sqlalchemy import Column, func, ForeignKey from sqlalchemy import Column, func, ForeignKey
from sqlalchemy.types import DateTime from sqlalchemy.types import DateTime
from sqlalchemy.dialects.postgresql import JSONB
from sqlalchemy.orm import relationship from sqlalchemy.orm import relationship
import pendulum import pendulum
@ -32,7 +31,6 @@ class Request(Base):
id = Id() id = Id()
time_created = Column(DateTime(timezone=True), server_default=func.now()) time_created = Column(DateTime(timezone=True), server_default=func.now())
body = Column(JSONB)
status_events = relationship( status_events = relationship(
"RequestStatusEvent", backref="request", order_by="RequestStatusEvent.sequence" "RequestStatusEvent", backref="request", order_by="RequestStatusEvent.sequence"
) )