migrations updates:

- retain relevant task order data when migrating request bodies
- set revision relationship for status events
- make relationship between status events and revisions not nullable
This commit is contained in:
dandds 2018-09-04 15:21:10 -04:00
parent 9cbcba5101
commit 7ab313b100
3 changed files with 67 additions and 9 deletions

View File

@ -0,0 +1,32 @@
"""make status event relation to revision non-nullable
Revision ID: 06aa23166ca9
Revises: e66a49285f23
Create Date: 2018-09-04 15:03:20.299607
"""
from alembic import op
import sqlalchemy as sa
from sqlalchemy.dialects import postgresql
# revision identifiers, used by Alembic.
revision = '06aa23166ca9'
down_revision = 'e66a49285f23'
branch_labels = None
depends_on = None
def upgrade():
# ### commands auto generated by Alembic - please adjust! ###
op.alter_column('request_status_events', 'request_revision_id',
existing_type=postgresql.UUID(),
nullable=False)
# ### end Alembic commands ###
def downgrade():
# ### commands auto generated by Alembic - please adjust! ###
op.alter_column('request_status_events', 'request_revision_id',
existing_type=postgresql.UUID(),
nullable=True)
# ### end Alembic commands ###

View File

@ -13,6 +13,7 @@ from sqlalchemy.dialects import postgresql
from atst.models.request import Request from atst.models.request import Request
from atst.utils import deep_merge from atst.utils import deep_merge
from atst.domain.requests import create_revision_from_request_body from atst.domain.requests import create_revision_from_request_body
from atst.domain.task_orders import TaskOrders
# revision identifiers, used by Alembic. # revision identifiers, used by Alembic.
@ -30,9 +31,21 @@ def delete_two_deep(body, key1, key2):
return body return body
TASK_ORDER_DATA = TaskOrders.TASK_ORDER_DATA + ["task_order_id", "csrf_token"]
def create_revision(body):
financials = body.get("financial_verification")
if financials:
for column in TASK_ORDER_DATA:
if column in financials:
del(financials[column])
return create_revision_from_request_body(body)
def massaged_revision(body): def massaged_revision(body):
try: try:
return create_revision_from_request_body(body) return create_revision(body)
except ValueError: except ValueError:
# some of the data on staging has out-of-range dates like "02/29/2019"; # 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 # we don't know how to coerce them to valid dates, so we remove those
@ -40,8 +53,9 @@ def massaged_revision(body):
body = delete_two_deep(body, "details_of_use", "start_date") body = delete_two_deep(body, "details_of_use", "start_date")
body = delete_two_deep(body, "information_about_you", "date_latest_training") body = delete_two_deep(body, "information_about_you", "date_latest_training")
return create_revision_from_request_body(body) return create_revision(body)
from uuid import UUID
def upgrade(): def upgrade():
Session = sessionmaker(bind=op.get_bind()) Session = sessionmaker(bind=op.get_bind())
@ -49,14 +63,14 @@ def upgrade():
for request in session.query(Request).all(): for request in session.query(Request).all():
(body,) = session.execute("SELECT body from requests WHERE id='{}'".format(request.id)).fetchone() (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) revision = massaged_revision(body)
request.revisions.append(revision) request.revisions.append(revision)
session.add(revision)
session.add(request) session.add(request)
session.commit()
op.drop_column('requests', 'body') op.drop_column('requests', 'body')

View File

@ -7,20 +7,32 @@ Create Date: 2018-09-04 14:01:31.548665
""" """
from alembic import op from alembic import op
import sqlalchemy as sa import sqlalchemy as sa
from sqlalchemy.orm import sessionmaker
from sqlalchemy.dialects import postgresql from sqlalchemy.dialects import postgresql
from atst.models.request import Request
# revision identifiers, used by Alembic. # revision identifiers, used by Alembic.
revision = 'e66a49285f23' revision = 'e66a49285f23'
down_revision = '090e1bd0d7ce' down_revision = '090e1bd0d7ce'
branch_labels = None branch_labels = None
depends_on = None depends_on = None
from uuid import UUID
def upgrade(): def upgrade():
# ### commands auto generated by Alembic - please adjust! ### op.add_column('request_status_events', sa.Column('request_revision_id', postgresql.UUID(as_uuid=True)))
op.add_column('request_status_events', sa.Column('request_revision_id', postgresql.UUID(as_uuid=True), nullable=False))
op.create_foreign_key(None, 'request_status_events', 'request_revisions', ['request_revision_id'], ['id']) op.create_foreign_key(None, 'request_status_events', 'request_revisions', ['request_revision_id'], ['id'])
# ### end Alembic commands ###
Session = sessionmaker(bind=op.get_bind())
session = Session()
for request in session.query(Request).all():
for status in request.status_events:
status.revision = request.latest_revision
session.add(status)
session.commit()
def downgrade(): def downgrade():