From 02900ff7717b5591b59b145d0d4005c369aa798a Mon Sep 17 00:00:00 2001 From: richard-dds Date: Thu, 8 Aug 2019 15:30:29 -0400 Subject: [PATCH] Allow TOs to be deleted, along with their associated CLINs --- .../fda6bd7e1b65_clin_delete_cascade.py | 26 +++++++++++++++++++ atst/domain/task_orders.py | 7 +++++ atst/models/task_order.py | 4 ++- tests/domain/test_task_orders.py | 9 ++++++- 4 files changed, 44 insertions(+), 2 deletions(-) create mode 100644 alembic/versions/fda6bd7e1b65_clin_delete_cascade.py diff --git a/alembic/versions/fda6bd7e1b65_clin_delete_cascade.py b/alembic/versions/fda6bd7e1b65_clin_delete_cascade.py new file mode 100644 index 00000000..18b1bf7a --- /dev/null +++ b/alembic/versions/fda6bd7e1b65_clin_delete_cascade.py @@ -0,0 +1,26 @@ +"""clin delete cascade + +Revision ID: fda6bd7e1b65 +Revises: e0c6eb21771f +Create Date: 2019-08-07 16:37:02.451277 + +""" +from alembic import op +import sqlalchemy as sa + + +# revision identifiers, used by Alembic. +revision = 'fda6bd7e1b65' +down_revision = 'e0c6eb21771f' +branch_labels = None +depends_on = None + + +def upgrade(): + op.drop_constraint("clins_task_order_id_fkey", "clins") + op.create_foreign_key("clins_task_order_id_fkey", "clins", "task_orders", ["task_order_id"], ["id"], ondelete="cascade") + + +def downgrade(): + op.drop_constraint("clins_task_order_id_fkey", "clins") + op.create_foreign_key("clins_task_order_id_fkey", "clins", "task_orders", ["task_order_id"], ["id"], ondelete="no action") diff --git a/atst/domain/task_orders.py b/atst/domain/task_orders.py index 94343c7c..6c5ffd86 100644 --- a/atst/domain/task_orders.py +++ b/atst/domain/task_orders.py @@ -71,3 +71,10 @@ class TaskOrders(BaseDomainClass): by_time_created = sorted(task_orders, key=lambda to: to.time_created) by_status = sorted(by_time_created, key=lambda to: SORT_ORDERING.get(to.status)) return by_status + + @classmethod + def delete(cls, task_order_id): + task_order = TaskOrders.get(task_order_id) + if task_order: + db.session.delete(task_order) + db.session.commit() diff --git a/atst/models/task_order.py b/atst/models/task_order.py index 8b060164..61ec03b3 100644 --- a/atst/models/task_order.py +++ b/atst/models/task_order.py @@ -44,7 +44,9 @@ class TaskOrder(Base, mixins.TimestampsMixin): signer_dod_id = Column(String) signed_at = Column(DateTime) - clins = relationship("CLIN", back_populates="task_order") + clins = relationship( + "CLIN", back_populates="task_order", cascade="all, delete-orphan" + ) @hybrid_property def pdf(self): diff --git a/tests/domain/test_task_orders.py b/tests/domain/test_task_orders.py index 8dc07bbc..1c448abe 100644 --- a/tests/domain/test_task_orders.py +++ b/tests/domain/test_task_orders.py @@ -3,7 +3,7 @@ from datetime import date, timedelta from decimal import Decimal from atst.domain.task_orders import TaskOrders -from atst.models.attachment import Attachment +from atst.models import Attachment, TaskOrder from tests.factories import TaskOrderFactory, CLINFactory, PortfolioFactory @@ -165,3 +165,10 @@ def test_update_does_not_duplicate_clins(pdf_upload): assert len(task_order.clins) == 2 for clin in task_order.clins: assert clin.number != "456" + + +def test_delete_task_order_with_clins(session): + task_order = TaskOrderFactory.create(create_clins=[1, 2, 3]) + TaskOrders.delete(task_order.id) + + print(session.query(TaskOrder).filter_by(id=task_order.id).exists())