change name of request relationship to legacy task order

This commit is contained in:
dandds 2018-12-12 16:42:40 -05:00
parent 2f515d7b47
commit e509c34cdd
27 changed files with 215 additions and 163 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

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

View File

@ -187,10 +187,12 @@ class Requests(object):
return Requests.status_count(RequestStatus.APPROVED)
@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)
if task_order:
request.task_order = task_order
if legacy_task_order:
request.legacy_task_order = legacy_task_order
request = Requests._update(request, {"financial_verification": financial_data})
return request

View File

@ -15,16 +15,16 @@ class TaskOrders(object):
@classmethod
def get(cls, order_number):
try:
task_order = (
legacy_task_order = (
db.session.query(LegacyTaskOrder).filter_by(number=order_number).one()
)
except NoResultFound:
if TaskOrders._client():
task_order = TaskOrders.get_from_eda(order_number)
legacy_task_order = TaskOrders.get_from_eda(order_number)
else:
raise NotFoundError("task_order")
raise NotFoundError("legacy_task_order")
return task_order
return legacy_task_order
@classmethod
def get_from_eda(cls, order_number):
@ -36,25 +36,27 @@ class TaskOrders(object):
)
else:
raise NotFoundError("task_order")
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]}
task_order = LegacyTaskOrder(source=source, **to_data)
legacy_task_order = LegacyTaskOrder(source=source, **to_data)
db.session.add(task_order)
db.session.add(legacy_task_order)
db.session.commit()
return task_order
return legacy_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])
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

@ -46,10 +46,10 @@ def mixedContentToJson(value):
"""
if (
isinstance(value, dict)
and "task_order" in value
and hasattr(value["task_order"]["pdf"], "filename")
and "legacy_task_order" in value
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)

View File

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

View File

@ -39,8 +39,8 @@ class Request(Base, mixins.TimestampsMixin, mixins.AuditableMixin):
user_id = Column(ForeignKey("users.id"), nullable=False)
creator = relationship("User", backref="owned_requests")
task_order_id = Column(ForeignKey("legacy_task_orders.id"))
task_order = relationship("LegacyTaskOrder")
legacy_task_order_id = Column(ForeignKey("legacy_task_orders.id"))
legacy_task_order = relationship("LegacyTaskOrder")
revisions = relationship(
"RequestRevision", back_populates="request", order_by="RequestRevision.sequence"
@ -141,8 +141,8 @@ class Request(Base, mixins.TimestampsMixin, mixins.AuditableMixin):
@property
def is_financially_verified(self):
if self.task_order:
return self.task_order.verified
if self.legacy_task_order:
return self.legacy_task_order.verified
return False
@property
@ -209,7 +209,7 @@ class Request(Base, mixins.TimestampsMixin, mixins.AuditableMixin):
self.is_pending_ccpo_approval
or self.is_pending_financial_verification_changes
or self.is_approved
) and self.task_order
) and self.legacy_task_order
@property
def displayname(self):
@ -233,8 +233,8 @@ class Request(Base, mixins.TimestampsMixin, mixins.AuditableMixin):
@property
def has_manual_task_order(self):
return (
self.task_order.source == TaskOrderSource.MANUAL
if self.task_order is not None
self.legacy_task_order.source == TaskOrderSource.MANUAL
if self.legacy_task_order is not None
else None
)

View File

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

View File

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

View File

@ -23,7 +23,7 @@ def fv_extended(_http_request):
class FinancialVerification(object):
def __init__(self, request):
self.request = request.latest_revision
self.task_order = request.task_order
self.legacy_task_order = request.legacy_task_order
class FinancialVerificationBase(object):
@ -33,14 +33,16 @@ class FinancialVerificationBase(object):
form = FinancialVerificationForm(obj=fv, formdata=_formdata)
if not form.has_pdf_upload:
if isinstance(form.task_order.pdf.data, Attachment):
form.task_order.pdf.data = form.task_order.pdf.data.filename
if isinstance(form.legacy_task_order.pdf.data, Attachment):
form.legacy_task_order.pdf.data = (
form.legacy_task_order.pdf.data.filename
)
else:
try:
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:
pass
@ -50,38 +52,40 @@ class FinancialVerificationBase(object):
attachment = None
if is_extended:
attachment = None
if isinstance(form.task_order.pdf.data, FileStorage):
Attachment.delete_for_resource("task_order", self.request.id)
if isinstance(form.legacy_task_order.pdf.data, FileStorage):
Attachment.delete_for_resource("legacy_task_order", self.request.id)
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:
attachment = Attachment.get_for_resource(
"task_order", self.request.id
"legacy_task_order", self.request.id
)
except NotFoundError:
pass
if attachment:
form.task_order.pdf.data = attachment.filename
form.legacy_task_order.pdf.data = attachment.filename
return attachment
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:
return None
task_order_data = form.task_order.data
task_order_data = form.legacy_task_order.data
if attachment:
task_order_data["pdf"] = attachment
try:
task_order = TaskOrders.get(task_order_number)
task_order = TaskOrders.update(task_order, task_order_data)
return task_order
legacy_task_order = TaskOrders.get(task_order_number)
legacy_task_order = TaskOrders.update(legacy_task_order, task_order_data)
return legacy_task_order
except NotFoundError:
pass
@ -142,14 +146,16 @@ class UpdateFinancialVerification(FinancialVerificationBase):
should_submit = False
if not self.is_extended and not self.task_order_validator.validate(
form.task_order.number
form.legacy_task_order.number
):
should_submit = False
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(
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:
return Requests.submit_financial_verification(updated_request)
@ -177,9 +183,11 @@ class SaveFinancialVerificationDraft(FinancialVerificationBase):
def execute(self):
form = self._get_form(self.request, self.is_extended, self.fv_data)
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(
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
@ -237,7 +245,7 @@ def update_financial_verification(request_id):
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)
flash("new_workspace")
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
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(
"requests/details.html",

View File

@ -58,7 +58,7 @@ def workspace_reports(workspace_id):
prev_month = current_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:
remaining_difference = expiration_date - today
remaining_days = remaining_difference.days
@ -71,7 +71,7 @@ def workspace_reports(workspace_id):
workspace_totals=Reports.workspace_totals(workspace),
monthly_totals=Reports.monthly_totals(workspace),
jedi_request=workspace.request,
task_order=workspace.request.task_order,
legacy_task_order=workspace.request.legacy_task_order,
current_month=current_month,
prev_month=prev_month,
two_months_ago=two_months_ago,

View File

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

View File

@ -57,7 +57,7 @@ def create_demo_workspace(name, data):
return
request = RequestFactory.build(creator=workspace_owner)
request.task_order = LegacyTaskOrderFactory.build()
request.legacy_task_order = LegacyTaskOrderFactory.build()
request = Requests.update(
request.id, {"financial_verification": RequestFactory.mock_financial_data()}
)

View File

@ -102,7 +102,7 @@ def seed_db():
requests.append(request)
request = requests[0]
request.task_order = LegacyTaskOrderFactory.build()
request.legacy_task_order = LegacyTaskOrderFactory.build()
request = Requests.update(
request.id, {"financial_verification": RequestFactory.mock_financial_data()}
)

View File

@ -154,7 +154,7 @@
</h2>
<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>
Download the Task Order PDF
</a>
@ -164,29 +164,29 @@
</div>
<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" %}
{{ DefinitionReviewField("If other, please specify", "task_order", "funding_type_other") }}
{% if data["legacy_task_order"] and data["legacy_task_order"]["funding_type"].value == "OTHER" %}
{{ DefinitionReviewField("If other, please specify", "legacy_task_order", "funding_type_other") }}
{% 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") }}

View File

@ -71,55 +71,55 @@
{% if extended %}
<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>
{{ TextInput(f.task_order.funding_type_other) }}
{{ TextInput(f.legacy_task_order.funding_type_other) }}
</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(
f.task_order.clin_0001,
f.legacy_task_order.clin_0001,
validation='dollars'
) }}
{{ TextInput(
f.task_order.clin_0003,
f.legacy_task_order.clin_0003,
validation='dollars'
) }}
{{ TextInput(
f.task_order.clin_1001,
f.legacy_task_order.clin_1001,
validation='dollars'
) }}
{{ TextInput(
f.task_order.clin_1003,
f.legacy_task_order.clin_1003,
validation='dollars'
) }}
{{ TextInput(
f.task_order.clin_2001,
f.legacy_task_order.clin_2001,
validation='dollars'
) }}
{{ TextInput(
f.task_order.clin_2003,
f.legacy_task_order.clin_2003,
validation='dollars'
) }}
<template v-if="showTaskOrderUpload">
<div class="usa-input {% if f.task_order.pdf.errors %} usa-input--error {% endif %}">
{{ f.task_order.pdf.label }}
{{ f.task_order.pdf }}
{% for error in f.task_order.pdf.errors %}
<div class="usa-input {% if f.legacy_task_order.pdf.errors %} usa-input--error {% endif %}">
{{ f.legacy_task_order.pdf.label }}
{{ f.legacy_task_order.pdf }}
{% for error in f.legacy_task_order.pdf.errors %}
<span class="usa-input__message">{{error}}</span>
{% endfor %}
</div>
</template>
<template v-else>
<p>Uploaded {{ f.task_order.pdf.data }}.</p>
<p>Uploaded {{ f.legacy_task_order.pdf.data }}.</p>
<div>
<button v-on:click="forceShowTaskOrderUpload($event)">Change</button>
</div>
@ -128,7 +128,7 @@
{% endif %}
{{ TextInput(
f.task_order.number,
f.legacy_task_order.number,
placeholder="e.g.: 1234567899C0001",
tooltip="A Contracting Officer will likely be the best source for this number.",
validation="requiredField"

View File

@ -17,7 +17,7 @@
<a class='icon-link icon-link--large' href="/workspaces/{{ workspace.id }}/projects">{{ workspace.name }}</a><br>
</td>
<td>
#{{ workspace.task_order.number }}
#{{ workspace.legacy_task_order.number }}
</td>
<td>
<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>
<dl class='to-summary__to-number'>
<dt class='usa-sr-only'>Task Order Number</dt>
<dd>{{ task_order.number }}</dd>
<dd>{{ legacy_task_order.number }}</dd>
</dl>
</div>

View File

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

View File

@ -6,12 +6,12 @@ CLIN_NUMS = ["0001", "0003", "1001", "1003", "2001", "2003"]
def test_workspace_totals():
task_order = LegacyTaskOrderFactory.create()
legacy_task_order = LegacyTaskOrderFactory.create()
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)
report = Reports.workspace_totals(workspace)
total = 200 * len(CLIN_NUMS)

View File

@ -122,8 +122,8 @@ class RequestFactory(Base):
@classmethod
def _adjust_kwargs(cls, **kwargs):
if kwargs.pop("with_task_order", False) and "task_order" not in kwargs:
kwargs["task_order"] = LegacyTaskOrderFactory.build()
if kwargs.pop("with_task_order", False) and "legacy_task_order" not in kwargs:
kwargs["legacy_task_order"] = LegacyTaskOrderFactory.build()
return kwargs
@classmethod

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():
form_data = ImmutableMultiDict({"task_order-funding_type": "PROC"})
form_data = ImmutableMultiDict({"legacy_task_order-funding_type": "PROC"})
form = FinancialVerificationForm(form_data)
form.validate()
assert "funding_type_other" not in form.errors
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.validate()
assert "funding_type_other" in form.errors["task_order"]
assert "funding_type_other" in form.errors["legacy_task_order"]
@pytest.mark.parametrize(
@ -85,8 +85,8 @@ def test_ba_code_validation(input_, expected):
def test_can_submit_zero_for_clin():
form_first = FinancialVerificationForm()
form_first.validate()
assert "clin_0001" in form_first.errors["task_order"]
form_data = ImmutableMultiDict([("task_order-clin_0001", "0")])
assert "clin_0001" in form_first.errors["legacy_task_order"]
form_data = ImmutableMultiDict([("legacy_task_order-clin_0001", "0")])
form_second = FinancialVerificationForm(form_data)
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

@ -9,7 +9,7 @@ def test_as_dictionary():
def test_budget():
task_order = LegacyTaskOrderFactory.create(
legacy_task_order = LegacyTaskOrderFactory.create(
clin_0001=500,
clin_0003=200,
clin_1001=None,
@ -17,4 +17,4 @@ def test_budget():
clin_2001=None,
clin_2003=None,
)
assert task_order.budget == 700
assert legacy_task_order.budget == 700

View File

@ -10,9 +10,11 @@ def test_can_show_financial_data(client, user_session):
user = UserFactory.create()
user_session(user)
task_order = LegacyTaskOrderFactory.create()
legacy_task_order = LegacyTaskOrderFactory.create()
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(
url_for("requests.view_request_details", request_id=request.id)

View File

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

View File

@ -26,7 +26,7 @@ from atst.domain.requests.query import RequestsQuery
def fv_data():
return {
"request-pe_id": "123",
"task_order-number": MockEDAClient.MOCK_CONTRACT_NUMBER,
"legacy_task_order-number": MockEDAClient.MOCK_CONTRACT_NUMBER,
"request-fname_co": "Contracting",
"request-lname_co": "Officer",
"request-email_co": "jane@mail.mil",
@ -44,16 +44,18 @@ def fv_data():
@pytest.fixture
def e_fv_data(pdf_upload):
return {
"task_order-funding_type": "RDTE",
"task_order-funding_type_other": "other",
"task_order-expiration_date": "1/1/{}".format(datetime.date.today().year + 1),
"task_order-clin_0001": "50000",
"task_order-clin_0003": "13000",
"task_order-clin_1001": "30000",
"task_order-clin_1003": "7000",
"task_order-clin_2001": "30000",
"task_order-clin_2003": "7000",
"task_order-pdf": pdf_upload,
"legacy_task_order-funding_type": "RDTE",
"legacy_task_order-funding_type_other": "other",
"legacy_task_order-expiration_date": "1/1/{}".format(
datetime.date.today().year + 1
),
"legacy_task_order-clin_0001": "50000",
"legacy_task_order-clin_0003": "13000",
"legacy_task_order-clin_1001": "30000",
"legacy_task_order-clin_1003": "7000",
"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):
request = RequestFactory.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(
TrueValidator,
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):
request = RequestFactory.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(
TrueValidator, TaskOrderNumberValidator(), user, request, data, is_extended=True
)
@ -197,7 +199,7 @@ def test_save_draft_allows_invalid_data():
request = RequestFactory.create()
user = UserFactory.create()
data = {
"task_order-number": MANUAL_TO_NUMBER,
"legacy_task_order-number": MANUAL_TO_NUMBER,
"request-pe_id": "123",
"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):
request = RequestFactory.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(
TrueValidator, TrueValidator, user, request, data, is_extended=True
).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):
request = RequestFactory.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(
TrueValidator, TrueValidator, user, request, data, 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):
request = RequestFactory.create()
user = UserFactory.create()
data = {
"task_order-clin_0001": "1",
"task_order-number": fv_data["task_order-number"],
"legacy_task_order-clin_0001": "1",
"legacy_task_order-number": fv_data["legacy_task_order-number"],
}
SaveFinancialVerificationDraft(
TrueValidator, TrueValidator, user, request, data, 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):
request = RequestFactory.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(
TrueValidator, TrueValidator, user, request, data, is_extended=True
).execute()
@ -276,14 +278,14 @@ def test_can_save_draft_with_funding_type(fv_data, e_fv_data):
request = RequestFactory.create()
user = UserFactory.create()
data = {
"task_order-number": fv_data["task_order-number"],
"task_order-funding_type": e_fv_data["task_order-funding_type"],
"legacy_task_order-number": fv_data["legacy_task_order-number"],
"legacy_task_order-funding_type": e_fv_data["legacy_task_order-funding_type"],
}
updated_request = SaveFinancialVerificationDraft(
TrueValidator, TrueValidator, user, request, data, is_extended=False
).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):
@ -331,7 +333,7 @@ def test_manual_task_order_triggers_extended_form(
user = UserFactory.create()
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(
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 = {
**fv_data,
**e_fv_data,
"task_order-number": MANUAL_TO_NUMBER,
"legacy_task_order-number": MANUAL_TO_NUMBER,
"request-pe_id": "0101228N",
}
user_session(user)
@ -374,7 +376,7 @@ def test_eda_task_order_does_trigger_approval(client, user_session, fv_data, e_f
data = {
**fv_data,
**e_fv_data,
"task_order-number": MockEDAClient.MOCK_CONTRACT_NUMBER,
"legacy_task_order-number": MockEDAClient.MOCK_CONTRACT_NUMBER,
"request-pe_id": "0101228N",
}
user_session(user)
@ -396,7 +398,7 @@ def test_attachment_on_non_extended_form(client, user_session, fv_data, e_fv_dat
data = {
**fv_data,
**e_fv_data,
"task_order-number": MockEDAClient.MOCK_CONTRACT_NUMBER,
"legacy_task_order-number": MockEDAClient.MOCK_CONTRACT_NUMBER,
"request-pe_id": "0101228N",
}
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)
data = {
**fv_data,
"task_order-number": MANUAL_TO_NUMBER,
"legacy_task_order-number": MANUAL_TO_NUMBER,
"request-pe_id": "0101228N",
}
@ -432,7 +434,7 @@ def test_task_order_number_persists_in_form(fv_data, e_fv_data):
pass
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):
@ -440,7 +442,7 @@ def test_can_submit_once_to_details_are_entered(fv_data, e_fv_data):
request = RequestFactory.create(creator=user)
data = {
**fv_data,
"task_order-number": MANUAL_TO_NUMBER,
"legacy_task_order-number": MANUAL_TO_NUMBER,
"request-pe_id": "0101228N",
}
@ -454,7 +456,7 @@ def test_can_submit_once_to_details_are_entered(fv_data, e_fv_data):
data = {
**fv_data,
**e_fv_data,
"task_order-number": MANUAL_TO_NUMBER,
"legacy_task_order-number": MANUAL_TO_NUMBER,
"request-pe_id": "0101228N",
}
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
user = UserFactory.create()
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(
TrueValidator, TaskOrderNumberValidator(), user, request, data, is_extended=True
).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
user = UserFactory.create()
request = RequestFactory.create(creator=user)
data = {"task_order-number": MANUAL_TO_NUMBER}
data = {"legacy_task_order-number": MANUAL_TO_NUMBER}
SaveFinancialVerificationDraft(
TrueValidator,
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):
user = UserFactory.create()
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(
TrueValidator, TrueValidator, user, request, data, is_extended=True
).execute()
data = {**data, "task_order-pdf": pdf_upload2}
data = {**data, "legacy_task_order-pdf": pdf_upload2}
UpdateFinancialVerification(
TrueValidator, TrueValidator, user, request, data, 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
@ -523,10 +525,12 @@ def test_always_derives_pdf_filename(fv_data, e_fv_data, pdf_upload):
user = UserFactory.create()
request_one = RequestFactory.create(creator=user)
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 = LegacyTaskOrderFactory.create(pdf=attachment)
request_two = RequestFactory.create(creator=user, task_order=task_order)
form_one = GetFinancialVerificationForm(
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
).execute()
assert form_one.task_order.pdf.data == attachment.filename
assert form_two.task_order.pdf.data == attachment.filename
assert form_one.legacy_task_order.pdf.data == attachment.filename
assert form_two.legacy_task_order.pdf.data == attachment.filename