diff --git a/alembic/versions/fb22e47972a3_remove_legacy_task_order_table.py b/alembic/versions/fb22e47972a3_remove_legacy_task_order_table.py new file mode 100644 index 00000000..987cfaba --- /dev/null +++ b/alembic/versions/fb22e47972a3_remove_legacy_task_order_table.py @@ -0,0 +1,49 @@ +"""Remove legacy task order table + +Revision ID: fb22e47972a3 +Revises: 978bf56e21b6 +Create Date: 2019-02-20 18:28:56.386152 + +""" +from alembic import op +import sqlalchemy as sa +from sqlalchemy.dialects import postgresql + +# revision identifiers, used by Alembic. +revision = 'fb22e47972a3' +down_revision = '978bf56e21b6' +branch_labels = None +depends_on = None + + +def upgrade(): + # ### commands auto generated by Alembic - please adjust! ### + op.drop_table('legacy_task_orders') + # ### end Alembic commands ### + + +def downgrade(): + # ### commands auto generated by Alembic - please adjust! ### + op.create_table('legacy_task_orders', + sa.Column('time_created', postgresql.TIMESTAMP(timezone=True), server_default=sa.text('now()'), autoincrement=False, nullable=False), + sa.Column('time_updated', postgresql.TIMESTAMP(timezone=True), server_default=sa.text('now()'), autoincrement=False, nullable=False), + sa.Column('id', postgresql.UUID(), server_default=sa.text('uuid_generate_v4()'), autoincrement=False, nullable=False), + sa.Column('number', sa.VARCHAR(), autoincrement=False, nullable=True), + sa.Column('source', sa.VARCHAR(length=6), autoincrement=False, nullable=True), + sa.Column('funding_type', sa.VARCHAR(length=5), autoincrement=False, nullable=True), + sa.Column('funding_type_other', sa.VARCHAR(), autoincrement=False, nullable=True), + sa.Column('clin_0001', sa.INTEGER(), autoincrement=False, nullable=True), + sa.Column('clin_0003', sa.INTEGER(), autoincrement=False, nullable=True), + sa.Column('clin_1001', sa.INTEGER(), autoincrement=False, nullable=True), + sa.Column('clin_1003', sa.INTEGER(), autoincrement=False, nullable=True), + sa.Column('clin_2001', sa.INTEGER(), autoincrement=False, nullable=True), + sa.Column('clin_2003', sa.INTEGER(), autoincrement=False, nullable=True), + sa.Column('expiration_date', sa.DATE(), autoincrement=False, nullable=True), + sa.Column('attachment_id', postgresql.UUID(), autoincrement=False, nullable=True), + sa.CheckConstraint("(funding_type)::text = ANY ((ARRAY['RDTE'::character varying, 'OM'::character varying, 'PROC'::character varying, 'OTHER'::character varying])::text[])", name='fundingtype'), + sa.CheckConstraint("(source)::text = ANY ((ARRAY['MANUAL'::character varying, 'EDA'::character varying])::text[])", name='source'), + sa.ForeignKeyConstraint(['attachment_id'], ['attachments.id'], name='task_orders_attachment_id_fkey'), + sa.PrimaryKeyConstraint('id', name='task_orders_pkey'), + sa.UniqueConstraint('number', name='task_orders_number_key') + ) + # ### end Alembic commands ### diff --git a/atst/domain/legacy_task_orders.py b/atst/domain/legacy_task_orders.py deleted file mode 100644 index e7a5c44f..00000000 --- a/atst/domain/legacy_task_orders.py +++ /dev/null @@ -1,60 +0,0 @@ -from sqlalchemy.orm.exc import NoResultFound -from flask import current_app as app - -from atst.database import db -from atst.models.legacy_task_order import LegacyTaskOrder, Source, FundingType -from .exceptions import NotFoundError -from atst.utils import update_obj - - -class LegacyTaskOrders(object): - TASK_ORDER_DATA = [ - col.name for col in LegacyTaskOrder.__table__.c if col.name != "id" - ] - - @classmethod - def get(cls, order_number): - try: - legacy_task_order = ( - db.session.query(LegacyTaskOrder).filter_by(number=order_number).one() - ) - except NoResultFound: - if LegacyTaskOrders._client(): - legacy_task_order = LegacyTaskOrders.get_from_eda(order_number) - else: - raise NotFoundError("legacy_task_order") - - return legacy_task_order - - @classmethod - def get_from_eda(cls, order_number): - to_data = LegacyTaskOrders._client().get_contract(order_number, status="y") - if to_data: - # TODO: we need to determine exactly what we're getting and storing from the EDA client - return LegacyTaskOrders.create( - source=Source.EDA, funding_type=FundingType.PROC, **to_data - ) - - else: - raise NotFoundError("legacy_task_order") - - @classmethod - def create(cls, source=Source.MANUAL, **kwargs): - to_data = {k: v for k, v in kwargs.items() if v not in ["", None]} - legacy_task_order = LegacyTaskOrder(source=source, **to_data) - - db.session.add(legacy_task_order) - db.session.commit() - - return legacy_task_order - - @classmethod - def _client(cls): - return app.eda_client - - @classmethod - def update(cls, legacy_task_order, dct): - updated = update_obj(legacy_task_order, dct, ignore_vals=["", None]) - db.session.add(updated) - db.session.commit() - return updated diff --git a/atst/models/__init__.py b/atst/models/__init__.py index 7055a637..ee3a7958 100644 --- a/atst/models/__init__.py +++ b/atst/models/__init__.py @@ -6,7 +6,6 @@ from .permissions import Permissions from .role import Role from .user import User from .portfolio_role import PortfolioRole -from .legacy_task_order import LegacyTaskOrder from .portfolio import Portfolio from .application import Application from .environment import Environment diff --git a/atst/models/legacy_task_order.py b/atst/models/legacy_task_order.py deleted file mode 100644 index 72e466b5..00000000 --- a/atst/models/legacy_task_order.py +++ /dev/null @@ -1,75 +0,0 @@ -from enum import Enum - -from sqlalchemy import Column, Integer, String, ForeignKey, Enum as SQLAEnum, Date -from sqlalchemy.orm import relationship - -from atst.models import Base, types, mixins - - -class Source(Enum): - MANUAL = "Manual" - EDA = "EDA" - - -class FundingType(Enum): - RDTE = "RDTE" - OM = "OM" - PROC = "PROC" - OTHER = "OTHER" - - -class LegacyTaskOrder(Base, mixins.TimestampsMixin): - __tablename__ = "legacy_task_orders" - - id = types.Id() - number = Column(String, unique=True) - source = Column(SQLAEnum(Source, native_enum=False)) - funding_type = Column(SQLAEnum(FundingType, native_enum=False)) - funding_type_other = Column(String) - clin_0001 = Column(Integer) - clin_0003 = Column(Integer) - clin_1001 = Column(Integer) - clin_1003 = Column(Integer) - clin_2001 = Column(Integer) - clin_2003 = Column(Integer) - expiration_date = Column(Date) - - attachment_id = Column(ForeignKey("attachments.id")) - pdf = relationship("Attachment") - - @property - def verified(self): - return self.source == Source.EDA - - def to_dictionary(self): - return { - c.name: getattr(self, c.name) - for c in self.__table__.columns - if c.name not in ["id", "attachment_id"] - } - - @property - def budget(self): - return sum( - filter( - None, - [ - self.clin_0001, - self.clin_0003, - self.clin_1001, - self.clin_1003, - self.clin_2001, - self.clin_2003, - ], - ) - ) - - def __repr__(self): # pragma: no cover - return "".format( - self.number, - self.verified, - self.budget, - self.expiration_date, - self.pdf, - self.id, - ) diff --git a/tests/domain/test_legacy_task_orders.py b/tests/domain/test_legacy_task_orders.py deleted file mode 100644 index 5defb88e..00000000 --- a/tests/domain/test_legacy_task_orders.py +++ /dev/null @@ -1,28 +0,0 @@ -import pytest - -from atst.domain.exceptions import NotFoundError -from atst.domain.legacy_task_orders import LegacyTaskOrders -from atst.eda_client import MockEDAClient - -from tests.factories import LegacyTaskOrderFactory - - -def test_can_get_task_order(): - new_to = LegacyTaskOrderFactory.create(number="0101969F") - to = LegacyTaskOrders.get(new_to.number) - - assert to.id == to.id - - -def test_nonexistent_task_order_raises_without_client(): - with pytest.raises(NotFoundError): - LegacyTaskOrders.get("some fake number") - - -def test_nonexistent_task_order_raises_with_client(monkeypatch): - monkeypatch.setattr( - "atst.domain.legacy_task_orders.LegacyTaskOrders._client", - lambda: MockEDAClient(), - ) - with pytest.raises(NotFoundError): - LegacyTaskOrders.get("some other fake numer") diff --git a/tests/factories.py b/tests/factories.py index 47034d77..1226d79a 100644 --- a/tests/factories.py +++ b/tests/factories.py @@ -10,7 +10,6 @@ from atst.forms import data from atst.models.attachment import Attachment from atst.models.environment import Environment from atst.models.application import Application -from atst.models.legacy_task_order import LegacyTaskOrder, Source, FundingType from atst.models.task_order import TaskOrder from atst.models.user import User from atst.models.role import Role @@ -100,25 +99,6 @@ class UserFactory(Base): return cls.create(atat_role=role, **kwargs) -class LegacyTaskOrderFactory(Base): - class Meta: - model = LegacyTaskOrder - - source = Source.MANUAL - funding_type = FundingType.PROC - funding_type_other = None - number = factory.LazyFunction( - lambda: "".join(random.choices(string.ascii_uppercase + string.digits, k=13)) - ) - expiration_date = factory.LazyFunction(random_future_date) - clin_0001 = random.randrange(100, 100_000) - clin_0003 = random.randrange(100, 100_000) - clin_1001 = random.randrange(100, 100_000) - clin_1003 = random.randrange(100, 100_000) - clin_2001 = random.randrange(100, 100_000) - clin_2003 = random.randrange(100, 100_000) - - class PortfolioFactory(Base): class Meta: model = Portfolio diff --git a/tests/models/test_legacy_task_order.py b/tests/models/test_legacy_task_order.py deleted file mode 100644 index 80e02b05..00000000 --- a/tests/models/test_legacy_task_order.py +++ /dev/null @@ -1,20 +0,0 @@ -from tests.factories import LegacyTaskOrderFactory -from tests.assert_util import dict_contains - - -def test_as_dictionary(): - data = LegacyTaskOrderFactory.dictionary() - real_task_order = LegacyTaskOrderFactory.create(**data) - assert dict_contains(real_task_order.to_dictionary(), data) - - -def test_budget(): - legacy_task_order = LegacyTaskOrderFactory.create( - clin_0001=500, - clin_0003=200, - clin_1001=None, - clin_1003=None, - clin_2001=None, - clin_2003=None, - ) - assert legacy_task_order.budget == 700