Merge pull request #489 from dod-ccpo/legacy-task-orders

change current task order name
This commit is contained in:
dandds 2018-12-13 15:50:39 -05:00 committed by GitHub
commit 76c3bb2bd5
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
33 changed files with 321 additions and 240 deletions

View File

@ -0,0 +1,32 @@
"""change request foreign key to task order
Revision ID: 1c1394e496a7
Revises: 3dc8b7961bd1
Create Date: 2018-12-12 14:39:25.325640
"""
from alembic import op
import sqlalchemy as sa
from sqlalchemy.dialects import postgresql
# revision identifiers, used by Alembic.
revision = '1c1394e496a7'
down_revision = '3dc8b7961bd1'
branch_labels = None
depends_on = None
def upgrade():
# ### commands auto generated by Alembic - please adjust! ###
op.alter_column("requests", "task_order_id", new_column_name="legacy_task_order_id")
op.drop_constraint('requests_task_order_id_fkey', 'requests', type_='foreignkey')
op.create_foreign_key("requests_legacy_task_order_fkey", 'requests', 'legacy_task_orders', ['legacy_task_order_id'], ['id'])
# ### end Alembic commands ###
def downgrade():
# ### commands auto generated by Alembic - please adjust! ###
op.alter_column("requests", "legacy_task_order_id", new_column_name="task_order_id")
op.drop_constraint("requests_legacy_task_order_fkey" 'requests', type_='foreignkey')
op.create_foreign_key('requests_task_order_id_fkey', 'requests', 'legacy_task_orders', ['task_order_id'], ['id'])
# ### end Alembic commands ###

View File

@ -0,0 +1,24 @@
"""rename task orders
Revision ID: 3dc8b7961bd1
Revises: c222327c3963
Create Date: 2018-12-12 13:17:25.728679
"""
from alembic import op
import sqlalchemy as sa
# revision identifiers, used by Alembic.
revision = '3dc8b7961bd1'
down_revision = 'c222327c3963'
branch_labels = None
depends_on = None
def upgrade():
op.rename_table("task_orders", "legacy_task_orders")
def downgrade():
op.rename_table("legacy_task_orders", "task_orders")

View File

@ -0,0 +1,62 @@
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=lambda v: v in ["", None]
)
db.session.add(updated)
db.session.commit()
return updated

View File

@ -203,8 +203,8 @@ class Reports:
if workspace.name in REPORT_FIXTURE_MAP: if workspace.name in REPORT_FIXTURE_MAP:
budget = REPORT_FIXTURE_MAP[workspace.name]["budget"] budget = REPORT_FIXTURE_MAP[workspace.name]["budget"]
spent = _sum_monthly_spend(REPORT_FIXTURE_MAP[workspace.name]["monthly"]) spent = _sum_monthly_spend(REPORT_FIXTURE_MAP[workspace.name]["monthly"])
elif workspace.request and workspace.request.task_order: elif workspace.request and workspace.request.legacy_task_order:
ws_to = workspace.request.task_order ws_to = workspace.request.legacy_task_order
budget = ws_to.budget budget = ws_to.budget
# spent will be derived from CSP data # spent will be derived from CSP data
spent = 0 spent = 0

View File

@ -1,6 +1,6 @@
import re import re
from atst.domain.task_orders import TaskOrders from atst.domain.legacy_task_orders import LegacyTaskOrders
from atst.domain.pe_numbers import PENumbers from atst.domain.pe_numbers import PENumbers
from atst.domain.exceptions import NotFoundError from atst.domain.exceptions import NotFoundError
@ -63,7 +63,7 @@ class PENumberValidator(object):
class TaskOrderNumberValidator(object): class TaskOrderNumberValidator(object):
def validate(self, field): def validate(self, field):
try: try:
TaskOrders.get(field.data) LegacyTaskOrders.get(field.data)
except NotFoundError: except NotFoundError:
self._apply_error(field) self._apply_error(field)
return False return False

View File

@ -187,10 +187,12 @@ class Requests(object):
return Requests.status_count(RequestStatus.APPROVED) return Requests.status_count(RequestStatus.APPROVED)
@classmethod @classmethod
def update_financial_verification(cls, request_id, financial_data, task_order=None): def update_financial_verification(
cls, request_id, financial_data, legacy_task_order=None
):
request = RequestsQuery.get_with_lock(request_id) request = RequestsQuery.get_with_lock(request_id)
if task_order: if legacy_task_order:
request.task_order = task_order request.legacy_task_order = legacy_task_order
request = Requests._update(request, {"financial_verification": financial_data}) request = Requests._update(request, {"financial_verification": financial_data})
return request return request

View File

@ -1,58 +0,0 @@
from sqlalchemy.orm.exc import NoResultFound
from flask import current_app as app
from atst.database import db
from atst.models.task_order import TaskOrder, Source, FundingType
from .exceptions import NotFoundError
from atst.utils import update_obj
class TaskOrders(object):
TASK_ORDER_DATA = [col.name for col in TaskOrder.__table__.c if col.name != "id"]
@classmethod
def get(cls, order_number):
try:
task_order = (
db.session.query(TaskOrder).filter_by(number=order_number).one()
)
except NoResultFound:
if TaskOrders._client():
task_order = TaskOrders.get_from_eda(order_number)
else:
raise NotFoundError("task_order")
return task_order
@classmethod
def get_from_eda(cls, order_number):
to_data = TaskOrders._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 TaskOrders.create(
source=Source.EDA, funding_type=FundingType.PROC, **to_data
)
else:
raise NotFoundError("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]}
task_order = TaskOrder(source=source, **to_data)
db.session.add(task_order)
db.session.commit()
return task_order
@classmethod
def _client(cls):
return app.eda_client
@classmethod
def update(cls, task_order, dct):
updated = update_obj(task_order, dct, ignore_vals=lambda v: v in ["", None])
db.session.add(updated)
db.session.commit()
return updated

View File

@ -46,10 +46,10 @@ def mixedContentToJson(value):
""" """
if ( if (
isinstance(value, dict) isinstance(value, dict)
and "task_order" in value and "legacy_task_order" in value
and hasattr(value["task_order"]["pdf"], "filename") and hasattr(value["legacy_task_order"]["pdf"], "filename")
): ):
value["task_order"]["pdf"] = value["task_order"]["pdf"].filename value["legacy_task_order"]["pdf"] = value["legacy_task_order"]["pdf"].filename
return app.jinja_env.filters["tojson"](value) return app.jinja_env.filters["tojson"](value)

View File

@ -34,13 +34,13 @@ def coerce_choice(val):
class TaskOrderForm(CacheableForm): class TaskOrderForm(CacheableForm):
def do_validate_number(self): def do_validate_number(self):
for field in self: for field in self:
if field.name != "task_order-number": if field.name != "legacy_task_order-number":
field.validators.insert(0, Optional()) field.validators.insert(0, Optional())
valid = super().validate() valid = super().validate()
for field in self: for field in self:
if field.name != "task_order-number": if field.name != "legacy_task_order-number":
field.validators.pop(0) field.validators.pop(0)
return valid return valid
@ -176,25 +176,25 @@ class RequestFinancialVerificationForm(CacheableForm):
class FinancialVerificationForm(CacheableForm): class FinancialVerificationForm(CacheableForm):
task_order = FormField(TaskOrderForm) legacy_task_order = FormField(TaskOrderForm)
request = FormField(RequestFinancialVerificationForm) request = FormField(RequestFinancialVerificationForm)
def validate(self, *args, **kwargs): def validate(self, *args, **kwargs):
if not kwargs.get("is_extended", True): if not kwargs.get("is_extended", True):
return self.do_validate_request() return self.do_validate_request()
if self.task_order.funding_type.data == "OTHER": if self.legacy_task_order.funding_type.data == "OTHER":
self.task_order.funding_type_other.validators.append(InputRequired()) self.legacy_task_order.funding_type_other.validators.append(InputRequired())
to_pdf_validators = None to_pdf_validators = None
if kwargs.get("has_attachment"): if kwargs.get("has_attachment"):
to_pdf_validators = list(self.task_order.pdf.validators) to_pdf_validators = list(self.legacy_task_order.pdf.validators)
self.task_order.pdf.validators = [] self.legacy_task_order.pdf.validators = []
valid = super().validate() valid = super().validate()
if to_pdf_validators: if to_pdf_validators:
self.task_order.pdf.validators = to_pdf_validators self.legacy_task_order.pdf.validators = to_pdf_validators
return valid return valid
@ -204,7 +204,7 @@ class FinancialVerificationForm(CacheableForm):
validator by wtforms. validator by wtforms.
""" """
request_valid = self.request.validate(self) request_valid = self.request.validate(self)
task_order_valid = self.task_order.do_validate_number() task_order_valid = self.legacy_task_order.do_validate_number()
return request_valid and task_order_valid return request_valid and task_order_valid
def reset(self): def reset(self):
@ -216,11 +216,11 @@ class FinancialVerificationForm(CacheableForm):
@property @property
def has_pdf_upload(self): def has_pdf_upload(self):
return isinstance(self.task_order.pdf.data, FileStorage) return isinstance(self.legacy_task_order.pdf.data, FileStorage)
@property @property
def is_missing_task_order_number(self): def is_missing_task_order_number(self):
return "number" in self.errors.get("task_order", {}) return "number" in self.errors.get("legacy_task_order", {})
@property @property
def is_only_missing_task_order_number(self): def is_only_missing_task_order_number(self):

View File

@ -9,7 +9,7 @@ from .role import Role
from .user import User from .user import User
from .workspace_role import WorkspaceRole from .workspace_role import WorkspaceRole
from .pe_number import PENumber from .pe_number import PENumber
from .task_order import TaskOrder from .legacy_task_order import LegacyTaskOrder
from .workspace import Workspace from .workspace import Workspace
from .project import Project from .project import Project
from .environment import Environment from .environment import Environment

View File

@ -18,8 +18,8 @@ class FundingType(Enum):
OTHER = "OTHER" OTHER = "OTHER"
class TaskOrder(Base, mixins.TimestampsMixin): class LegacyTaskOrder(Base, mixins.TimestampsMixin):
__tablename__ = "task_orders" __tablename__ = "legacy_task_orders"
id = types.Id() id = types.Id()
number = Column(String, unique=True) number = Column(String, unique=True)
@ -65,7 +65,7 @@ class TaskOrder(Base, mixins.TimestampsMixin):
) )
def __repr__(self): def __repr__(self):
return "<TaskOrder(number='{}', verified='{}', budget='{}', expiration_date='{}', pdf='{}', id='{}')>".format( return "<LegacyTaskOrder(number='{}', verified='{}', budget='{}', expiration_date='{}', pdf='{}', id='{}')>".format(
self.number, self.number,
self.verified, self.verified,
self.budget, self.budget,

View File

@ -6,7 +6,7 @@ from atst.models import Base, types, mixins
from atst.models.request_status_event import RequestStatus from atst.models.request_status_event import RequestStatus
from atst.utils import first_or_none from atst.utils import first_or_none
from atst.models.request_revision import RequestRevision from atst.models.request_revision import RequestRevision
from atst.models.task_order import Source as TaskOrderSource from atst.models.legacy_task_order import Source as TaskOrderSource
def map_properties_to_dict(properties, instance): def map_properties_to_dict(properties, instance):
@ -39,8 +39,8 @@ class Request(Base, mixins.TimestampsMixin, mixins.AuditableMixin):
user_id = Column(ForeignKey("users.id"), nullable=False) user_id = Column(ForeignKey("users.id"), nullable=False)
creator = relationship("User", backref="owned_requests") creator = relationship("User", backref="owned_requests")
task_order_id = Column(ForeignKey("task_orders.id")) legacy_task_order_id = Column(ForeignKey("legacy_task_orders.id"))
task_order = relationship("TaskOrder") legacy_task_order = relationship("LegacyTaskOrder")
revisions = relationship( revisions = relationship(
"RequestRevision", back_populates="request", order_by="RequestRevision.sequence" "RequestRevision", back_populates="request", order_by="RequestRevision.sequence"
@ -141,8 +141,8 @@ class Request(Base, mixins.TimestampsMixin, mixins.AuditableMixin):
@property @property
def is_financially_verified(self): def is_financially_verified(self):
if self.task_order: if self.legacy_task_order:
return self.task_order.verified return self.legacy_task_order.verified
return False return False
@property @property
@ -209,7 +209,7 @@ class Request(Base, mixins.TimestampsMixin, mixins.AuditableMixin):
self.is_pending_ccpo_approval self.is_pending_ccpo_approval
or self.is_pending_financial_verification_changes or self.is_pending_financial_verification_changes
or self.is_approved or self.is_approved
) and self.task_order ) and self.legacy_task_order
@property @property
def displayname(self): def displayname(self):
@ -233,8 +233,8 @@ class Request(Base, mixins.TimestampsMixin, mixins.AuditableMixin):
@property @property
def has_manual_task_order(self): def has_manual_task_order(self):
return ( return (
self.task_order.source == TaskOrderSource.MANUAL self.legacy_task_order.source == TaskOrderSource.MANUAL
if self.task_order is not None if self.legacy_task_order is not None
else None else None
) )

View File

@ -34,8 +34,8 @@ class Workspace(Base, mixins.TimestampsMixin, mixins.AuditableMixin):
return len(self.users) return len(self.users)
@property @property
def task_order(self): def legacy_task_order(self):
return self.request.task_order return self.request.legacy_task_order
@property @property
def members(self): def members(self):

View File

@ -22,7 +22,7 @@ def map_ccpo_authorizing(user):
def render_approval(request, form=None, internal_comment_form=None): def render_approval(request, form=None, internal_comment_form=None):
data = request.body data = request.body
if request.has_financial_data: if request.has_financial_data:
data["task_order"] = request.task_order.to_dictionary() data["legacy_task_order"] = request.legacy_task_order.to_dictionary()
if not form: if not form:
mo_data = map_ccpo_authorizing(g.current_user) mo_data = map_ccpo_authorizing(g.current_user)
@ -69,8 +69,8 @@ def submit_approval(request_id):
@requests_bp.route("/requests/task_order_download/<string:request_id>", methods=["GET"]) @requests_bp.route("/requests/task_order_download/<string:request_id>", methods=["GET"])
def task_order_pdf_download(request_id): def task_order_pdf_download(request_id):
request = Requests.get(g.current_user, request_id) request = Requests.get(g.current_user, request_id)
if request.task_order and request.task_order.pdf: if request.legacy_task_order and request.legacy_task_order.pdf:
pdf = request.task_order.pdf pdf = request.legacy_task_order.pdf
generator = app.uploader.download_stream(pdf.object_name) generator = app.uploader.download_stream(pdf.object_name)
return Response( return Response(
generator, generator,
@ -81,7 +81,7 @@ def task_order_pdf_download(request_id):
) )
else: else:
raise NotFoundError("task_order pdf") raise NotFoundError("legacy_task_order pdf")
@requests_bp.route("/requests/internal_comments/<string:request_id>", methods=["POST"]) @requests_bp.route("/requests/internal_comments/<string:request_id>", methods=["POST"])

View File

@ -12,7 +12,7 @@ from atst.domain.requests.financial_verification import (
TaskOrderNumberValidator, TaskOrderNumberValidator,
) )
from atst.models.attachment import Attachment from atst.models.attachment import Attachment
from atst.domain.task_orders import TaskOrders from atst.domain.legacy_task_orders import LegacyTaskOrders
from atst.utils.flash import formatted_flash as flash from atst.utils.flash import formatted_flash as flash
@ -23,7 +23,7 @@ def fv_extended(_http_request):
class FinancialVerification(object): class FinancialVerification(object):
def __init__(self, request): def __init__(self, request):
self.request = request.latest_revision self.request = request.latest_revision
self.task_order = request.task_order self.legacy_task_order = request.legacy_task_order
class FinancialVerificationBase(object): class FinancialVerificationBase(object):
@ -33,14 +33,16 @@ class FinancialVerificationBase(object):
form = FinancialVerificationForm(obj=fv, formdata=_formdata) form = FinancialVerificationForm(obj=fv, formdata=_formdata)
if not form.has_pdf_upload: if not form.has_pdf_upload:
if isinstance(form.task_order.pdf.data, Attachment): if isinstance(form.legacy_task_order.pdf.data, Attachment):
form.task_order.pdf.data = form.task_order.pdf.data.filename form.legacy_task_order.pdf.data = (
form.legacy_task_order.pdf.data.filename
)
else: else:
try: try:
attachment = Attachment.get_for_resource( attachment = Attachment.get_for_resource(
"task_order", self.request.id "legacy_task_order", self.request.id
) )
form.task_order.pdf.data = attachment.filename form.legacy_task_order.pdf.data = attachment.filename
except NotFoundError: except NotFoundError:
pass pass
@ -50,47 +52,51 @@ class FinancialVerificationBase(object):
attachment = None attachment = None
if is_extended: if is_extended:
attachment = None attachment = None
if isinstance(form.task_order.pdf.data, FileStorage): if isinstance(form.legacy_task_order.pdf.data, FileStorage):
Attachment.delete_for_resource("task_order", self.request.id) Attachment.delete_for_resource("legacy_task_order", self.request.id)
attachment = Attachment.attach( attachment = Attachment.attach(
form.task_order.pdf.data, "task_order", self.request.id form.legacy_task_order.pdf.data,
"legacy_task_order",
self.request.id,
) )
elif isinstance(form.task_order.pdf.data, str): elif isinstance(form.legacy_task_order.pdf.data, str):
try: try:
attachment = Attachment.get_for_resource( attachment = Attachment.get_for_resource(
"task_order", self.request.id "legacy_task_order", self.request.id
) )
except NotFoundError: except NotFoundError:
pass pass
if attachment: if attachment:
form.task_order.pdf.data = attachment.filename form.legacy_task_order.pdf.data = attachment.filename
return attachment return attachment
def _try_create_task_order(self, form, attachment, is_extended): def _try_create_task_order(self, form, attachment, is_extended):
task_order_number = form.task_order.number.data task_order_number = form.legacy_task_order.number.data
if not task_order_number: if not task_order_number:
return None return None
task_order_data = form.task_order.data task_order_data = form.legacy_task_order.data
if attachment: if attachment:
task_order_data["pdf"] = attachment task_order_data["pdf"] = attachment
try: try:
task_order = TaskOrders.get(task_order_number) legacy_task_order = LegacyTaskOrders.get(task_order_number)
task_order = TaskOrders.update(task_order, task_order_data) legacy_task_order = LegacyTaskOrders.update(
return task_order legacy_task_order, task_order_data
)
return legacy_task_order
except NotFoundError: except NotFoundError:
pass pass
try: try:
return TaskOrders.get_from_eda(task_order_number) return LegacyTaskOrders.get_from_eda(task_order_number)
except NotFoundError: except NotFoundError:
pass pass
return TaskOrders.create(**task_order_data) return LegacyTaskOrders.create(**task_order_data)
def _raise(self, form): def _raise(self, form):
form.reset() form.reset()
@ -142,14 +148,16 @@ class UpdateFinancialVerification(FinancialVerificationBase):
should_submit = False should_submit = False
if not self.is_extended and not self.task_order_validator.validate( if not self.is_extended and not self.task_order_validator.validate(
form.task_order.number form.legacy_task_order.number
): ):
should_submit = False should_submit = False
if should_update: if should_update:
task_order = self._try_create_task_order(form, attachment, self.is_extended) legacy_task_order = self._try_create_task_order(
form, attachment, self.is_extended
)
updated_request = Requests.update_financial_verification( updated_request = Requests.update_financial_verification(
self.request.id, form.request.data, task_order=task_order self.request.id, form.request.data, legacy_task_order=legacy_task_order
) )
if should_submit: if should_submit:
return Requests.submit_financial_verification(updated_request) return Requests.submit_financial_verification(updated_request)
@ -177,9 +185,11 @@ class SaveFinancialVerificationDraft(FinancialVerificationBase):
def execute(self): def execute(self):
form = self._get_form(self.request, self.is_extended, self.fv_data) form = self._get_form(self.request, self.is_extended, self.fv_data)
attachment = self._process_attachment(self.is_extended, form) attachment = self._process_attachment(self.is_extended, form)
task_order = self._try_create_task_order(form, attachment, self.is_extended) legacy_task_order = self._try_create_task_order(
form, attachment, self.is_extended
)
updated_request = Requests.update_financial_verification( updated_request = Requests.update_financial_verification(
self.request.id, form.request.data, task_order=task_order self.request.id, form.request.data, legacy_task_order=legacy_task_order
) )
return updated_request return updated_request
@ -237,7 +247,7 @@ def update_financial_verification(request_id):
extended=is_extended, extended=is_extended,
) )
if updated_request.task_order.verified: if updated_request.legacy_task_order.verified:
workspace = Requests.auto_approve_and_create_workspace(updated_request) workspace = Requests.auto_approve_and_create_workspace(updated_request)
flash("new_workspace") flash("new_workspace")
return redirect(url_for("workspaces.new_project", workspace_id=workspace.id)) return redirect(url_for("workspaces.new_project", workspace_id=workspace.id))

View File

@ -146,7 +146,7 @@ def view_request_details(request_id=None):
data = request.body data = request.body
if request.has_financial_data: if request.has_financial_data:
data["task_order"] = request.task_order.to_dictionary() data["legacy_task_order"] = request.legacy_task_order.to_dictionary()
return render_template( return render_template(
"requests/details.html", "requests/details.html",

View File

@ -58,7 +58,7 @@ def workspace_reports(workspace_id):
prev_month = current_month - timedelta(days=28) prev_month = current_month - timedelta(days=28)
two_months_ago = prev_month - timedelta(days=28) two_months_ago = prev_month - timedelta(days=28)
expiration_date = workspace.request.task_order.expiration_date expiration_date = workspace.request.legacy_task_order.expiration_date
if expiration_date: if expiration_date:
remaining_difference = expiration_date - today remaining_difference = expiration_date - today
remaining_days = remaining_difference.days remaining_days = remaining_difference.days
@ -71,7 +71,7 @@ def workspace_reports(workspace_id):
workspace_totals=Reports.workspace_totals(workspace), workspace_totals=Reports.workspace_totals(workspace),
monthly_totals=Reports.monthly_totals(workspace), monthly_totals=Reports.monthly_totals(workspace),
jedi_request=workspace.request, jedi_request=workspace.request,
task_order=workspace.request.task_order, legacy_task_order=workspace.request.legacy_task_order,
current_month=current_month, current_month=current_month,
prev_month=prev_month, prev_month=prev_month,
two_months_ago=two_months_ago, two_months_ago=two_months_ago,

View File

@ -34,7 +34,7 @@ export default {
computed: { computed: {
showTaskOrderUpload: function() { showTaskOrderUpload: function() {
return !this.initialData.task_order.pdf || this.shouldForceShowTaskOrder return !this.initialData.legacy_task_order.pdf || this.shouldForceShowTaskOrder
} }
}, },

View File

@ -31,7 +31,7 @@ from atst.domain.reports import MONTHLY_SPEND_AARDVARK, MONTHLY_SPEND_BELUGA
from atst.domain.requests import Requests from atst.domain.requests import Requests
from atst.domain.users import Users from atst.domain.users import Users
from atst.domain.workspaces import Workspaces from atst.domain.workspaces import Workspaces
from tests.factories import RequestFactory, TaskOrderFactory from tests.factories import RequestFactory, LegacyTaskOrderFactory
dod_ids = [ dod_ids = [
@ -57,7 +57,7 @@ def create_demo_workspace(name, data):
return return
request = RequestFactory.build(creator=workspace_owner) request = RequestFactory.build(creator=workspace_owner)
request.task_order = TaskOrderFactory.build() request.legacy_task_order = LegacyTaskOrderFactory.build()
request = Requests.update( request = Requests.update(
request.id, {"financial_verification": RequestFactory.mock_financial_data()} request.id, {"financial_verification": RequestFactory.mock_financial_data()}
) )

View File

@ -14,7 +14,7 @@ from atst.domain.projects import Projects
from atst.domain.workspace_roles import WorkspaceRoles from atst.domain.workspace_roles import WorkspaceRoles
from atst.models.invitation import Status as InvitationStatus from atst.models.invitation import Status as InvitationStatus
from atst.domain.exceptions import AlreadyExistsError from atst.domain.exceptions import AlreadyExistsError
from tests.factories import RequestFactory, TaskOrderFactory, InvitationFactory from tests.factories import RequestFactory, LegacyTaskOrderFactory, InvitationFactory
from atst.routes.dev import _DEV_USERS as DEV_USERS from atst.routes.dev import _DEV_USERS as DEV_USERS
WORKSPACE_USERS = [ WORKSPACE_USERS = [
@ -102,7 +102,7 @@ def seed_db():
requests.append(request) requests.append(request)
request = requests[0] request = requests[0]
request.task_order = TaskOrderFactory.build() request.legacy_task_order = LegacyTaskOrderFactory.build()
request = Requests.update( request = Requests.update(
request.id, {"financial_verification": RequestFactory.mock_financial_data()} request.id, {"financial_verification": RequestFactory.mock_financial_data()}
) )

View File

@ -154,7 +154,7 @@
</h2> </h2>
<div> <div>
{% if jedi_request.task_order.pdf %} {% if jedi_request.legacy_task_order.pdf %}
<a href="{{ url_for("requests.task_order_pdf_download", request_id=request_id)}}" download> <a href="{{ url_for("requests.task_order_pdf_download", request_id=request_id)}}" download>
Download the Task Order PDF Download the Task Order PDF
</a> </a>
@ -164,29 +164,29 @@
</div> </div>
<dl> <dl>
{{ DefinitionReviewField("Task Order Information Source", "task_order", "source", filter="getOptionLabel", filter_args=[task_order_sources]) }} {{ DefinitionReviewField("Task Order Information Source", "legacy_task_order", "source", filter="getOptionLabel", filter_args=[task_order_sources]) }}
{{ DefinitionReviewField("Task Order Number", "task_order", "number") }} {{ DefinitionReviewField("Task Order Number", "legacy_task_order", "number") }}
{{ DefinitionReviewField("What is the source of funding?", "task_order", "funding_type", filter="getOptionLabel", filter_args=[funding_types]) }} {{ DefinitionReviewField("What is the source of funding?", "legacy_task_order", "funding_type", filter="getOptionLabel", filter_args=[funding_types]) }}
{% if data["task_order"] and data["task_order"]["funding_type"].value == "OTHER" %} {% if data["legacy_task_order"] and data["legacy_task_order"]["funding_type"].value == "OTHER" %}
{{ DefinitionReviewField("If other, please specify", "task_order", "funding_type_other") }} {{ DefinitionReviewField("If other, please specify", "legacy_task_order", "funding_type_other") }}
{% endif %} {% endif %}
{{ DefinitionReviewField("Task Order Expiration Date", "task_order", "expiration_date") }} {{ DefinitionReviewField("Task Order Expiration Date", "legacy_task_order", "expiration_date") }}
{{ DefinitionReviewField("<dl><dt>CLIN 0001</dt> - <dd>Unclassified IaaS and PaaS Amount</dd></dl>", "task_order", "clin_0001", filter="dollars") }} {{ DefinitionReviewField("<dl><dt>CLIN 0001</dt> - <dd>Unclassified IaaS and PaaS Amount</dd></dl>", "legacy_task_order", "clin_0001", filter="dollars") }}
{{ DefinitionReviewField("<dl><dt>CLIN 0003</dt> - <dd>Unclassified Cloud Support Package</dd></dl>", "task_order", "clin_0003", filter="dollars") }} {{ DefinitionReviewField("<dl><dt>CLIN 0003</dt> - <dd>Unclassified Cloud Support Package</dd></dl>", "legacy_task_order", "clin_0003", filter="dollars") }}
{{ DefinitionReviewField("<dl><dt>CLIN 1001</dt> - <dd>Unclassified IaaS and PaaS Amount <br> OPTION PERIOD 1</dd></dl>", "task_order", "clin_1001", filter="dollars") }} {{ DefinitionReviewField("<dl><dt>CLIN 1001</dt> - <dd>Unclassified IaaS and PaaS Amount <br> OPTION PERIOD 1</dd></dl>", "legacy_task_order", "clin_1001", filter="dollars") }}
{{ DefinitionReviewField("<dl><dt>CLIN 1003</dt> - <dd>Unclassified Cloud Support Package <br> OPTION PERIOD 1</dd></dl>", "task_order", "clin_1003", filter="dollars") }} {{ DefinitionReviewField("<dl><dt>CLIN 1003</dt> - <dd>Unclassified Cloud Support Package <br> OPTION PERIOD 1</dd></dl>", "legacy_task_order", "clin_1003", filter="dollars") }}
{{ DefinitionReviewField("<dl><dt>CLIN 2001</dt> - <dd>Unclassified IaaS and PaaS Amount <br> OPTION PERIOD 2</dd></dl>", "task_order", "clin_2001", filter="dollars") }} {{ DefinitionReviewField("<dl><dt>CLIN 2001</dt> - <dd>Unclassified IaaS and PaaS Amount <br> OPTION PERIOD 2</dd></dl>", "legacy_task_order", "clin_2001", filter="dollars") }}
{{ DefinitionReviewField("<dl><dt>CLIN 2003</dt> - <dd>Unclassified Cloud Support Package <br> OPTION PERIOD 2</dd></dl>", "task_order", "clin_2003", filter="dollars") }} {{ DefinitionReviewField("<dl><dt>CLIN 2003</dt> - <dd>Unclassified Cloud Support Package <br> OPTION PERIOD 2</dd></dl>", "legacy_task_order", "clin_2003", filter="dollars") }}
{{ DefinitionReviewField("Unique Item Identifier (UII)s related to your application(s) if you already have them", "financial_verification", "uii_ids", filter="renderList") }} {{ DefinitionReviewField("Unique Item Identifier (UII)s related to your application(s) if you already have them", "financial_verification", "uii_ids", filter="renderList") }}

View File

@ -71,55 +71,55 @@
{% if extended %} {% if extended %}
<fieldset class="form__sub-fields form__sub-fields--warning"> <fieldset class="form__sub-fields form__sub-fields--warning">
{{ OptionsInput(f.task_order.funding_type) }} {{ OptionsInput(f.legacy_task_order.funding_type) }}
<template v-if="funding_type == 'OTHER'" v-cloak> <template v-if="funding_type == 'OTHER'" v-cloak>
{{ TextInput(f.task_order.funding_type_other) }} {{ TextInput(f.legacy_task_order.funding_type_other) }}
</template> </template>
{{ DateInput(f.task_order.expiration_date, placeholder='MM / DD / YYYY', validation='date', tooltip='Please enter the expiration date for the task order only and do not include options that you may choose to exercise in the future.') }} {{ DateInput(f.legacy_task_order.expiration_date, placeholder='MM / DD / YYYY', validation='date', tooltip='Please enter the expiration date for the task order only and do not include options that you may choose to exercise in the future.') }}
{{ TextInput( {{ TextInput(
f.task_order.clin_0001, f.legacy_task_order.clin_0001,
validation='dollars' validation='dollars'
) }} ) }}
{{ TextInput( {{ TextInput(
f.task_order.clin_0003, f.legacy_task_order.clin_0003,
validation='dollars' validation='dollars'
) }} ) }}
{{ TextInput( {{ TextInput(
f.task_order.clin_1001, f.legacy_task_order.clin_1001,
validation='dollars' validation='dollars'
) }} ) }}
{{ TextInput( {{ TextInput(
f.task_order.clin_1003, f.legacy_task_order.clin_1003,
validation='dollars' validation='dollars'
) }} ) }}
{{ TextInput( {{ TextInput(
f.task_order.clin_2001, f.legacy_task_order.clin_2001,
validation='dollars' validation='dollars'
) }} ) }}
{{ TextInput( {{ TextInput(
f.task_order.clin_2003, f.legacy_task_order.clin_2003,
validation='dollars' validation='dollars'
) }} ) }}
<template v-if="showTaskOrderUpload"> <template v-if="showTaskOrderUpload">
<div class="usa-input {% if f.task_order.pdf.errors %} usa-input--error {% endif %}"> <div class="usa-input {% if f.legacy_task_order.pdf.errors %} usa-input--error {% endif %}">
{{ f.task_order.pdf.label }} {{ f.legacy_task_order.pdf.label }}
{{ f.task_order.pdf }} {{ f.legacy_task_order.pdf }}
{% for error in f.task_order.pdf.errors %} {% for error in f.legacy_task_order.pdf.errors %}
<span class="usa-input__message">{{error}}</span> <span class="usa-input__message">{{error}}</span>
{% endfor %} {% endfor %}
</div> </div>
</template> </template>
<template v-else> <template v-else>
<p>Uploaded {{ f.task_order.pdf.data }}.</p> <p>Uploaded {{ f.legacy_task_order.pdf.data }}.</p>
<div> <div>
<button v-on:click="forceShowTaskOrderUpload($event)">Change</button> <button v-on:click="forceShowTaskOrderUpload($event)">Change</button>
</div> </div>
@ -128,7 +128,7 @@
{% endif %} {% endif %}
{{ TextInput( {{ TextInput(
f.task_order.number, f.legacy_task_order.number,
placeholder="e.g.: 1234567899C0001", placeholder="e.g.: 1234567899C0001",
tooltip="A Contracting Officer will likely be the best source for this number.", tooltip="A Contracting Officer will likely be the best source for this number.",
validation="requiredField" validation="requiredField"

View File

@ -17,7 +17,7 @@
<a class='icon-link icon-link--large' href="/workspaces/{{ workspace.id }}/projects">{{ workspace.name }}</a><br> <a class='icon-link icon-link--large' href="/workspaces/{{ workspace.id }}/projects">{{ workspace.name }}</a><br>
</td> </td>
<td> <td>
#{{ workspace.task_order.number }} #{{ workspace.legacy_task_order.number }}
</td> </td>
<td> <td>
<span class="label">{{ workspace.user_count }}</span><span class='h6'>Users</span> <span class="label">{{ workspace.user_count }}</span><span class='h6'>Users</span>

View File

@ -56,7 +56,7 @@
<h2 class='to-summary__heading'>Task Order</h2> <h2 class='to-summary__heading'>Task Order</h2>
<dl class='to-summary__to-number'> <dl class='to-summary__to-number'>
<dt class='usa-sr-only'>Task Order Number</dt> <dt class='usa-sr-only'>Task Order Number</dt>
<dd>{{ task_order.number }}</dd> <dd>{{ legacy_task_order.number }}</dd>
</dl> </dl>
</div> </div>

View File

@ -139,7 +139,7 @@ def extended_financial_verification_data(pdf_upload):
"clin_1003": "7000", "clin_1003": "7000",
"clin_2001": "30000", "clin_2001": "30000",
"clin_2003": "7000", "clin_2003": "7000",
"task_order": pdf_upload, "legacy_task_order": pdf_upload,
} }

View File

@ -1,17 +1,17 @@
from atst.domain.reports import Reports from atst.domain.reports import Reports
from tests.factories import RequestFactory, TaskOrderFactory, WorkspaceFactory from tests.factories import RequestFactory, LegacyTaskOrderFactory, WorkspaceFactory
CLIN_NUMS = ["0001", "0003", "1001", "1003", "2001", "2003"] CLIN_NUMS = ["0001", "0003", "1001", "1003", "2001", "2003"]
def test_workspace_totals(): def test_workspace_totals():
task_order = TaskOrderFactory.create() legacy_task_order = LegacyTaskOrderFactory.create()
for num in CLIN_NUMS: for num in CLIN_NUMS:
setattr(task_order, "clin_{}".format(num), 200) setattr(legacy_task_order, "clin_{}".format(num), 200)
request = RequestFactory.create(task_order=task_order) request = RequestFactory.create(legacy_task_order=legacy_task_order)
workspace = WorkspaceFactory.create(request=request) workspace = WorkspaceFactory.create(request=request)
report = Reports.workspace_totals(workspace) report = Reports.workspace_totals(workspace)
total = 200 * len(CLIN_NUMS) total = 200 * len(CLIN_NUMS)

View File

@ -1,27 +1,28 @@
import pytest import pytest
from atst.domain.exceptions import NotFoundError from atst.domain.exceptions import NotFoundError
from atst.domain.task_orders import TaskOrders from atst.domain.legacy_task_orders import LegacyTaskOrders
from atst.eda_client import MockEDAClient from atst.eda_client import MockEDAClient
from tests.factories import TaskOrderFactory from tests.factories import LegacyTaskOrderFactory
def test_can_get_task_order(): def test_can_get_task_order():
new_to = TaskOrderFactory.create(number="0101969F") new_to = LegacyTaskOrderFactory.create(number="0101969F")
to = TaskOrders.get(new_to.number) to = LegacyTaskOrders.get(new_to.number)
assert to.id == to.id assert to.id == to.id
def test_nonexistent_task_order_raises_without_client(): def test_nonexistent_task_order_raises_without_client():
with pytest.raises(NotFoundError): with pytest.raises(NotFoundError):
TaskOrders.get("some fake number") LegacyTaskOrders.get("some fake number")
def test_nonexistent_task_order_raises_with_client(monkeypatch): def test_nonexistent_task_order_raises_with_client(monkeypatch):
monkeypatch.setattr( monkeypatch.setattr(
"atst.domain.task_orders.TaskOrders._client", lambda: MockEDAClient() "atst.domain.legacy_task_orders.LegacyTaskOrders._client",
lambda: MockEDAClient(),
) )
with pytest.raises(NotFoundError): with pytest.raises(NotFoundError):
TaskOrders.get("some other fake numer") LegacyTaskOrders.get("some other fake numer")

View File

@ -13,7 +13,7 @@ from atst.models.request_review import RequestReview
from atst.models.request_status_event import RequestStatusEvent, RequestStatus from atst.models.request_status_event import RequestStatusEvent, RequestStatus
from atst.models.pe_number import PENumber from atst.models.pe_number import PENumber
from atst.models.project import Project from atst.models.project import Project
from atst.models.task_order import TaskOrder, Source, FundingType from atst.models.legacy_task_order import LegacyTaskOrder, Source, FundingType
from atst.models.user import User from atst.models.user import User
from atst.models.role import Role from atst.models.role import Role
from atst.models.workspace import Workspace from atst.models.workspace import Workspace
@ -122,8 +122,8 @@ class RequestFactory(Base):
@classmethod @classmethod
def _adjust_kwargs(cls, **kwargs): def _adjust_kwargs(cls, **kwargs):
if kwargs.pop("with_task_order", False) and "task_order" not in kwargs: if kwargs.pop("with_task_order", False) and "legacy_task_order" not in kwargs:
kwargs["task_order"] = TaskOrderFactory.build() kwargs["legacy_task_order"] = LegacyTaskOrderFactory.build()
return kwargs return kwargs
@classmethod @classmethod
@ -212,9 +212,9 @@ class PENumberFactory(Base):
model = PENumber model = PENumber
class TaskOrderFactory(Base): class LegacyTaskOrderFactory(Base):
class Meta: class Meta:
model = TaskOrder model = LegacyTaskOrder
source = Source.MANUAL source = Source.MANUAL
funding_type = FundingType.PROC funding_type = FundingType.PROC

View File

@ -20,17 +20,17 @@ def test_suggest_pe_id(input_, expected):
def test_funding_type_other_not_required_if_funding_type_is_not_other(): def test_funding_type_other_not_required_if_funding_type_is_not_other():
form_data = ImmutableMultiDict({"task_order-funding_type": "PROC"}) form_data = ImmutableMultiDict({"legacy_task_order-funding_type": "PROC"})
form = FinancialVerificationForm(form_data) form = FinancialVerificationForm(form_data)
form.validate() form.validate()
assert "funding_type_other" not in form.errors assert "funding_type_other" not in form.errors
def test_funding_type_other_required_if_funding_type_is_other(): def test_funding_type_other_required_if_funding_type_is_other():
form_data = ImmutableMultiDict({"task_order-funding_type": "OTHER"}) form_data = ImmutableMultiDict({"legacy_task_order-funding_type": "OTHER"})
form = FinancialVerificationForm(form_data) form = FinancialVerificationForm(form_data)
form.validate() form.validate()
assert "funding_type_other" in form.errors["task_order"] assert "funding_type_other" in form.errors["legacy_task_order"]
@pytest.mark.parametrize( @pytest.mark.parametrize(
@ -85,8 +85,8 @@ def test_ba_code_validation(input_, expected):
def test_can_submit_zero_for_clin(): def test_can_submit_zero_for_clin():
form_first = FinancialVerificationForm() form_first = FinancialVerificationForm()
form_first.validate() form_first.validate()
assert "clin_0001" in form_first.errors["task_order"] assert "clin_0001" in form_first.errors["legacy_task_order"]
form_data = ImmutableMultiDict([("task_order-clin_0001", "0")]) form_data = ImmutableMultiDict([("legacy_task_order-clin_0001", "0")])
form_second = FinancialVerificationForm(form_data) form_second = FinancialVerificationForm(form_data)
form_second.validate() form_second.validate()
assert "clin_0001" not in form_second.errors["task_order"] assert "clin_0001" not in form_second.errors["legacy_task_order"]

View File

@ -1,15 +1,15 @@
from tests.factories import TaskOrderFactory from tests.factories import LegacyTaskOrderFactory
from tests.assert_util import dict_contains from tests.assert_util import dict_contains
def test_as_dictionary(): def test_as_dictionary():
data = TaskOrderFactory.dictionary() data = LegacyTaskOrderFactory.dictionary()
real_task_order = TaskOrderFactory.create(**data) real_task_order = LegacyTaskOrderFactory.create(**data)
assert dict_contains(real_task_order.to_dictionary(), data) assert dict_contains(real_task_order.to_dictionary(), data)
def test_budget(): def test_budget():
task_order = TaskOrderFactory.create( legacy_task_order = LegacyTaskOrderFactory.create(
clin_0001=500, clin_0001=500,
clin_0003=200, clin_0003=200,
clin_1001=None, clin_1001=None,
@ -17,4 +17,4 @@ def test_budget():
clin_2001=None, clin_2001=None,
clin_2003=None, clin_2003=None,
) )
assert task_order.budget == 700 assert legacy_task_order.budget == 700

View File

@ -3,16 +3,18 @@ from flask import url_for
from atst.models.request_status_event import RequestStatus from atst.models.request_status_event import RequestStatus
from tests.factories import RequestFactory, TaskOrderFactory, UserFactory from tests.factories import RequestFactory, LegacyTaskOrderFactory, UserFactory
def test_can_show_financial_data(client, user_session): def test_can_show_financial_data(client, user_session):
user = UserFactory.create() user = UserFactory.create()
user_session(user) user_session(user)
task_order = TaskOrderFactory.create() legacy_task_order = LegacyTaskOrderFactory.create()
request = RequestFactory.create_with_status( request = RequestFactory.create_with_status(
status=RequestStatus.PENDING_CCPO_APPROVAL, task_order=task_order, creator=user status=RequestStatus.PENDING_CCPO_APPROVAL,
legacy_task_order=legacy_task_order,
creator=user,
) )
response = client.get( response = client.get(
url_for("requests.view_request_details", request_id=request.id) url_for("requests.view_request_details", request_id=request.id)

View File

@ -7,7 +7,7 @@ from atst.domain.roles import Roles
from tests.factories import ( from tests.factories import (
RequestFactory, RequestFactory,
TaskOrderFactory, LegacyTaskOrderFactory,
UserFactory, UserFactory,
RequestReviewFactory, RequestReviewFactory,
RequestStatusEventFactory, RequestStatusEventFactory,
@ -46,10 +46,12 @@ def test_non_ccpo_cannot_view_approval(user_session, client):
def prepare_request_pending_approval(creator, pdf_attachment=None): def prepare_request_pending_approval(creator, pdf_attachment=None):
task_order = TaskOrderFactory.create(number="abc123", pdf=pdf_attachment) legacy_task_order = LegacyTaskOrderFactory.create(
number="abc123", pdf=pdf_attachment
)
return RequestFactory.create_with_status( return RequestFactory.create_with_status(
status=RequestStatus.PENDING_CCPO_APPROVAL, status=RequestStatus.PENDING_CCPO_APPROVAL,
task_order=task_order, legacy_task_order=legacy_task_order,
creator=creator, creator=creator,
) )
@ -86,8 +88,8 @@ def test_task_order_download(app, client, user_session, pdf_upload):
user_session(user) user_session(user)
attachment = Attachment.attach(pdf_upload) attachment = Attachment.attach(pdf_upload)
task_order = TaskOrderFactory.create(number="abc123", pdf=attachment) legacy_task_order = LegacyTaskOrderFactory.create(number="abc123", pdf=attachment)
request = RequestFactory.create(task_order=task_order, creator=user) request = RequestFactory.create(legacy_task_order=legacy_task_order, creator=user)
# ensure that real data for pdf upload has been flushed to disk # ensure that real data for pdf upload has been flushed to disk
pdf_upload.seek(0) pdf_upload.seek(0)

View File

@ -11,7 +11,7 @@ from atst.routes.requests.financial_verification import (
) )
from tests.mocks import MOCK_VALID_PE_ID from tests.mocks import MOCK_VALID_PE_ID
from tests.factories import RequestFactory, UserFactory, TaskOrderFactory from tests.factories import RequestFactory, UserFactory, LegacyTaskOrderFactory
from atst.forms.exceptions import FormValidationError from atst.forms.exceptions import FormValidationError
from atst.domain.requests.financial_verification import ( from atst.domain.requests.financial_verification import (
PENumberValidator, PENumberValidator,
@ -26,7 +26,7 @@ from atst.domain.requests.query import RequestsQuery
def fv_data(): def fv_data():
return { return {
"request-pe_id": "123", "request-pe_id": "123",
"task_order-number": MockEDAClient.MOCK_CONTRACT_NUMBER, "legacy_task_order-number": MockEDAClient.MOCK_CONTRACT_NUMBER,
"request-fname_co": "Contracting", "request-fname_co": "Contracting",
"request-lname_co": "Officer", "request-lname_co": "Officer",
"request-email_co": "jane@mail.mil", "request-email_co": "jane@mail.mil",
@ -44,16 +44,18 @@ def fv_data():
@pytest.fixture @pytest.fixture
def e_fv_data(pdf_upload): def e_fv_data(pdf_upload):
return { return {
"task_order-funding_type": "RDTE", "legacy_task_order-funding_type": "RDTE",
"task_order-funding_type_other": "other", "legacy_task_order-funding_type_other": "other",
"task_order-expiration_date": "1/1/{}".format(datetime.date.today().year + 1), "legacy_task_order-expiration_date": "1/1/{}".format(
"task_order-clin_0001": "50000", datetime.date.today().year + 1
"task_order-clin_0003": "13000", ),
"task_order-clin_1001": "30000", "legacy_task_order-clin_0001": "50000",
"task_order-clin_1003": "7000", "legacy_task_order-clin_0003": "13000",
"task_order-clin_2001": "30000", "legacy_task_order-clin_1001": "30000",
"task_order-clin_2003": "7000", "legacy_task_order-clin_1003": "7000",
"task_order-pdf": pdf_upload, "legacy_task_order-clin_2001": "30000",
"legacy_task_order-clin_2003": "7000",
"legacy_task_order-pdf": pdf_upload,
} }
@ -97,7 +99,7 @@ def test_update_fv_re_enter_pe_number(fv_data):
def test_update_fv_invalid_task_order_number(fv_data): def test_update_fv_invalid_task_order_number(fv_data):
request = RequestFactory.create() request = RequestFactory.create()
user = UserFactory.create() user = UserFactory.create()
data = {**fv_data, "task_order-number": MANUAL_TO_NUMBER} data = {**fv_data, "legacy_task_order-number": MANUAL_TO_NUMBER}
update_fv = UpdateFinancialVerification( update_fv = UpdateFinancialVerification(
TrueValidator, TrueValidator,
TaskOrderNumberValidator(), TaskOrderNumberValidator(),
@ -139,7 +141,7 @@ def test_update_fv_extended(fv_data, e_fv_data):
def test_update_fv_extended_does_not_validate_task_order(fv_data, e_fv_data): def test_update_fv_extended_does_not_validate_task_order(fv_data, e_fv_data):
request = RequestFactory.create() request = RequestFactory.create()
user = UserFactory.create() user = UserFactory.create()
data = {**fv_data, **e_fv_data, "task_order-number": "abc123"} data = {**fv_data, **e_fv_data, "legacy_task_order-number": "abc123"}
update_fv = UpdateFinancialVerification( update_fv = UpdateFinancialVerification(
TrueValidator, TaskOrderNumberValidator(), user, request, data, is_extended=True TrueValidator, TaskOrderNumberValidator(), user, request, data, is_extended=True
) )
@ -197,7 +199,7 @@ def test_save_draft_allows_invalid_data():
request = RequestFactory.create() request = RequestFactory.create()
user = UserFactory.create() user = UserFactory.create()
data = { data = {
"task_order-number": MANUAL_TO_NUMBER, "legacy_task_order-number": MANUAL_TO_NUMBER,
"request-pe_id": "123", "request-pe_id": "123",
"request-ba_code": "a", "request-ba_code": "a",
} }
@ -229,44 +231,44 @@ def test_save_draft_and_then_submit():
def test_updated_request_has_pdf(fv_data, e_fv_data): def test_updated_request_has_pdf(fv_data, e_fv_data):
request = RequestFactory.create() request = RequestFactory.create()
user = UserFactory.create() user = UserFactory.create()
data = {**fv_data, **e_fv_data, "task_order-number": MANUAL_TO_NUMBER} data = {**fv_data, **e_fv_data, "legacy_task_order-number": MANUAL_TO_NUMBER}
updated_request = UpdateFinancialVerification( updated_request = UpdateFinancialVerification(
TrueValidator, TrueValidator, user, request, data, is_extended=True TrueValidator, TrueValidator, user, request, data, is_extended=True
).execute() ).execute()
assert updated_request.task_order.pdf assert updated_request.legacy_task_order.pdf
def test_can_save_draft_with_just_pdf(e_fv_data): def test_can_save_draft_with_just_pdf(e_fv_data):
request = RequestFactory.create() request = RequestFactory.create()
user = UserFactory.create() user = UserFactory.create()
data = {"task_order-pdf": e_fv_data["task_order-pdf"]} data = {"legacy_task_order-pdf": e_fv_data["legacy_task_order-pdf"]}
SaveFinancialVerificationDraft( SaveFinancialVerificationDraft(
TrueValidator, TrueValidator, user, request, data, is_extended=True TrueValidator, TrueValidator, user, request, data, is_extended=True
).execute() ).execute()
form = GetFinancialVerificationForm(user, request, is_extended=True).execute() form = GetFinancialVerificationForm(user, request, is_extended=True).execute()
assert form.task_order.pdf assert form.legacy_task_order.pdf
def test_task_order_info_present_in_extended_form(fv_data, e_fv_data): def test_task_order_info_present_in_extended_form(fv_data, e_fv_data):
request = RequestFactory.create() request = RequestFactory.create()
user = UserFactory.create() user = UserFactory.create()
data = { data = {
"task_order-clin_0001": "1", "legacy_task_order-clin_0001": "1",
"task_order-number": fv_data["task_order-number"], "legacy_task_order-number": fv_data["legacy_task_order-number"],
} }
SaveFinancialVerificationDraft( SaveFinancialVerificationDraft(
TrueValidator, TrueValidator, user, request, data, is_extended=True TrueValidator, TrueValidator, user, request, data, is_extended=True
).execute() ).execute()
form = GetFinancialVerificationForm(user, request, is_extended=True).execute() form = GetFinancialVerificationForm(user, request, is_extended=True).execute()
assert form.task_order.clin_0001.data assert form.legacy_task_order.clin_0001.data
def test_update_ignores_empty_values(fv_data, e_fv_data): def test_update_ignores_empty_values(fv_data, e_fv_data):
request = RequestFactory.create() request = RequestFactory.create()
user = UserFactory.create() user = UserFactory.create()
data = {**fv_data, **e_fv_data, "task_order-funding_type": ""} data = {**fv_data, **e_fv_data, "legacy_task_order-funding_type": ""}
SaveFinancialVerificationDraft( SaveFinancialVerificationDraft(
TrueValidator, TrueValidator, user, request, data, is_extended=True TrueValidator, TrueValidator, user, request, data, is_extended=True
).execute() ).execute()
@ -276,14 +278,14 @@ def test_can_save_draft_with_funding_type(fv_data, e_fv_data):
request = RequestFactory.create() request = RequestFactory.create()
user = UserFactory.create() user = UserFactory.create()
data = { data = {
"task_order-number": fv_data["task_order-number"], "legacy_task_order-number": fv_data["legacy_task_order-number"],
"task_order-funding_type": e_fv_data["task_order-funding_type"], "legacy_task_order-funding_type": e_fv_data["legacy_task_order-funding_type"],
} }
updated_request = SaveFinancialVerificationDraft( updated_request = SaveFinancialVerificationDraft(
TrueValidator, TrueValidator, user, request, data, is_extended=False TrueValidator, TrueValidator, user, request, data, is_extended=False
).execute() ).execute()
assert updated_request.task_order.funding_type assert updated_request.legacy_task_order.funding_type
def test_update_fv_route(client, user_session, fv_data): def test_update_fv_route(client, user_session, fv_data):
@ -331,7 +333,7 @@ def test_manual_task_order_triggers_extended_form(
user = UserFactory.create() user = UserFactory.create()
request = RequestFactory.create(creator=user) request = RequestFactory.create(creator=user)
data = {**fv_data, **e_fv_data, "task_order-number": MANUAL_TO_NUMBER} data = {**fv_data, **e_fv_data, "legacy_task_order-number": MANUAL_TO_NUMBER}
UpdateFinancialVerification( UpdateFinancialVerification(
TrueValidator, TrueValidator, user, request, data, is_extended=True TrueValidator, TrueValidator, user, request, data, is_extended=True
@ -352,7 +354,7 @@ def test_manual_to_does_not_trigger_approval(client, user_session, fv_data, e_fv
data = { data = {
**fv_data, **fv_data,
**e_fv_data, **e_fv_data,
"task_order-number": MANUAL_TO_NUMBER, "legacy_task_order-number": MANUAL_TO_NUMBER,
"request-pe_id": "0101228N", "request-pe_id": "0101228N",
} }
user_session(user) user_session(user)
@ -374,7 +376,7 @@ def test_eda_task_order_does_trigger_approval(client, user_session, fv_data, e_f
data = { data = {
**fv_data, **fv_data,
**e_fv_data, **e_fv_data,
"task_order-number": MockEDAClient.MOCK_CONTRACT_NUMBER, "legacy_task_order-number": MockEDAClient.MOCK_CONTRACT_NUMBER,
"request-pe_id": "0101228N", "request-pe_id": "0101228N",
} }
user_session(user) user_session(user)
@ -396,7 +398,7 @@ def test_attachment_on_non_extended_form(client, user_session, fv_data, e_fv_dat
data = { data = {
**fv_data, **fv_data,
**e_fv_data, **e_fv_data,
"task_order-number": MockEDAClient.MOCK_CONTRACT_NUMBER, "legacy_task_order-number": MockEDAClient.MOCK_CONTRACT_NUMBER,
"request-pe_id": "0101228N", "request-pe_id": "0101228N",
} }
user_session(user) user_session(user)
@ -420,7 +422,7 @@ def test_task_order_number_persists_in_form(fv_data, e_fv_data):
request = RequestFactory.create(creator=user) request = RequestFactory.create(creator=user)
data = { data = {
**fv_data, **fv_data,
"task_order-number": MANUAL_TO_NUMBER, "legacy_task_order-number": MANUAL_TO_NUMBER,
"request-pe_id": "0101228N", "request-pe_id": "0101228N",
} }
@ -432,7 +434,7 @@ def test_task_order_number_persists_in_form(fv_data, e_fv_data):
pass pass
form = GetFinancialVerificationForm(user, request, is_extended=True).execute() form = GetFinancialVerificationForm(user, request, is_extended=True).execute()
assert form.task_order.number.data == MANUAL_TO_NUMBER assert form.legacy_task_order.number.data == MANUAL_TO_NUMBER
def test_can_submit_once_to_details_are_entered(fv_data, e_fv_data): def test_can_submit_once_to_details_are_entered(fv_data, e_fv_data):
@ -440,7 +442,7 @@ def test_can_submit_once_to_details_are_entered(fv_data, e_fv_data):
request = RequestFactory.create(creator=user) request = RequestFactory.create(creator=user)
data = { data = {
**fv_data, **fv_data,
"task_order-number": MANUAL_TO_NUMBER, "legacy_task_order-number": MANUAL_TO_NUMBER,
"request-pe_id": "0101228N", "request-pe_id": "0101228N",
} }
@ -454,7 +456,7 @@ def test_can_submit_once_to_details_are_entered(fv_data, e_fv_data):
data = { data = {
**fv_data, **fv_data,
**e_fv_data, **e_fv_data,
"task_order-number": MANUAL_TO_NUMBER, "legacy_task_order-number": MANUAL_TO_NUMBER,
"request-pe_id": "0101228N", "request-pe_id": "0101228N",
} }
assert UpdateFinancialVerification( assert UpdateFinancialVerification(
@ -466,7 +468,7 @@ def test_existing_task_order_with_pdf(fv_data, e_fv_data, client, user_session):
# Use finver route to create initial TO #1, complete with PDF # Use finver route to create initial TO #1, complete with PDF
user = UserFactory.create() user = UserFactory.create()
request = RequestFactory.create(creator=user) request = RequestFactory.create(creator=user)
data = {**fv_data, **e_fv_data, "task_order-number": MANUAL_TO_NUMBER} data = {**fv_data, **e_fv_data, "legacy_task_order-number": MANUAL_TO_NUMBER}
UpdateFinancialVerification( UpdateFinancialVerification(
TrueValidator, TaskOrderNumberValidator(), user, request, data, is_extended=True TrueValidator, TaskOrderNumberValidator(), user, request, data, is_extended=True
).execute() ).execute()
@ -474,7 +476,7 @@ def test_existing_task_order_with_pdf(fv_data, e_fv_data, client, user_session):
# Save draft on a new finver form, but with same number as TO #1 # Save draft on a new finver form, but with same number as TO #1
user = UserFactory.create() user = UserFactory.create()
request = RequestFactory.create(creator=user) request = RequestFactory.create(creator=user)
data = {"task_order-number": MANUAL_TO_NUMBER} data = {"legacy_task_order-number": MANUAL_TO_NUMBER}
SaveFinancialVerificationDraft( SaveFinancialVerificationDraft(
TrueValidator, TrueValidator,
TaskOrderNumberValidator(), TaskOrderNumberValidator(),
@ -497,19 +499,19 @@ def test_existing_task_order_with_pdf(fv_data, e_fv_data, client, user_session):
def test_pdf_clearing(fv_data, e_fv_data, pdf_upload, pdf_upload2): def test_pdf_clearing(fv_data, e_fv_data, pdf_upload, pdf_upload2):
user = UserFactory.create() user = UserFactory.create()
request = RequestFactory.create(creator=user) request = RequestFactory.create(creator=user)
data = {**fv_data, **e_fv_data, "task_order-pdf": pdf_upload} data = {**fv_data, **e_fv_data, "legacy_task_order-pdf": pdf_upload}
SaveFinancialVerificationDraft( SaveFinancialVerificationDraft(
TrueValidator, TrueValidator, user, request, data, is_extended=True TrueValidator, TrueValidator, user, request, data, is_extended=True
).execute() ).execute()
data = {**data, "task_order-pdf": pdf_upload2} data = {**data, "legacy_task_order-pdf": pdf_upload2}
UpdateFinancialVerification( UpdateFinancialVerification(
TrueValidator, TrueValidator, user, request, data, is_extended=True TrueValidator, TrueValidator, user, request, data, is_extended=True
).execute() ).execute()
form = GetFinancialVerificationForm(user, request, is_extended=True).execute() form = GetFinancialVerificationForm(user, request, is_extended=True).execute()
assert form.task_order.pdf.data == pdf_upload2.filename assert form.legacy_task_order.pdf.data == pdf_upload2.filename
# TODO: This test manages an edge case for our current non-unique handling of # TODO: This test manages an edge case for our current non-unique handling of
@ -523,10 +525,12 @@ def test_always_derives_pdf_filename(fv_data, e_fv_data, pdf_upload):
user = UserFactory.create() user = UserFactory.create()
request_one = RequestFactory.create(creator=user) request_one = RequestFactory.create(creator=user)
attachment = Attachment.attach( attachment = Attachment.attach(
pdf_upload, resource="task_order", resource_id=request_one.id pdf_upload, resource="legacy_task_order", resource_id=request_one.id
)
legacy_task_order = LegacyTaskOrderFactory.create(pdf=attachment)
request_two = RequestFactory.create(
creator=user, legacy_task_order=legacy_task_order
) )
task_order = TaskOrderFactory.create(pdf=attachment)
request_two = RequestFactory.create(creator=user, task_order=task_order)
form_one = GetFinancialVerificationForm( form_one = GetFinancialVerificationForm(
user, request_one, is_extended=True user, request_one, is_extended=True
@ -535,5 +539,5 @@ def test_always_derives_pdf_filename(fv_data, e_fv_data, pdf_upload):
user, request_two, is_extended=True user, request_two, is_extended=True
).execute() ).execute()
assert form_one.task_order.pdf.data == attachment.filename assert form_one.legacy_task_order.pdf.data == attachment.filename
assert form_two.task_order.pdf.data == attachment.filename assert form_two.legacy_task_order.pdf.data == attachment.filename