diff --git a/alembic/versions/1c1394e496a7_change_request_foreign_key_to_task_order.py b/alembic/versions/1c1394e496a7_change_request_foreign_key_to_task_order.py new file mode 100644 index 00000000..725f43f7 --- /dev/null +++ b/alembic/versions/1c1394e496a7_change_request_foreign_key_to_task_order.py @@ -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 ### diff --git a/atst/domain/reports.py b/atst/domain/reports.py index cda67e0d..85858a23 100644 --- a/atst/domain/reports.py +++ b/atst/domain/reports.py @@ -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 diff --git a/atst/domain/requests/requests.py b/atst/domain/requests/requests.py index 2b5705a9..e4d2688f 100644 --- a/atst/domain/requests/requests.py +++ b/atst/domain/requests/requests.py @@ -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 diff --git a/atst/domain/task_orders.py b/atst/domain/task_orders.py index 70f64904..f4db9b88 100644 --- a/atst/domain/task_orders.py +++ b/atst/domain/task_orders.py @@ -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 diff --git a/atst/filters.py b/atst/filters.py index 32000105..c7830210 100644 --- a/atst/filters.py +++ b/atst/filters.py @@ -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) diff --git a/atst/forms/financial.py b/atst/forms/financial.py index 8fa92304..42d3e332 100644 --- a/atst/forms/financial.py +++ b/atst/forms/financial.py @@ -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): diff --git a/atst/models/request.py b/atst/models/request.py index e5316065..b66760fb 100644 --- a/atst/models/request.py +++ b/atst/models/request.py @@ -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 ) diff --git a/atst/models/workspace.py b/atst/models/workspace.py index 1a29a6da..4e42b47c 100644 --- a/atst/models/workspace.py +++ b/atst/models/workspace.py @@ -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): diff --git a/atst/routes/requests/approval.py b/atst/routes/requests/approval.py index 41a6d6eb..338fa1c5 100644 --- a/atst/routes/requests/approval.py +++ b/atst/routes/requests/approval.py @@ -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/", 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/", methods=["POST"]) diff --git a/atst/routes/requests/financial_verification.py b/atst/routes/requests/financial_verification.py index a2b70eec..d0797cfd 100644 --- a/atst/routes/requests/financial_verification.py +++ b/atst/routes/requests/financial_verification.py @@ -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)) diff --git a/atst/routes/requests/requests_form.py b/atst/routes/requests/requests_form.py index 5a77e56f..8d8f17a4 100644 --- a/atst/routes/requests/requests_form.py +++ b/atst/routes/requests/requests_form.py @@ -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", diff --git a/atst/routes/workspaces/index.py b/atst/routes/workspaces/index.py index a92ead98..5157ac97 100644 --- a/atst/routes/workspaces/index.py +++ b/atst/routes/workspaces/index.py @@ -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, diff --git a/js/components/forms/financial.js b/js/components/forms/financial.js index c3adeaad..cf1bd5a0 100644 --- a/js/components/forms/financial.js +++ b/js/components/forms/financial.js @@ -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 } }, diff --git a/script/remove_sample_data.py b/script/remove_sample_data.py index 50015796..8f1d5b7f 100644 --- a/script/remove_sample_data.py +++ b/script/remove_sample_data.py @@ -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()} ) diff --git a/script/seed_sample.py b/script/seed_sample.py index 9a137ad9..fb416843 100644 --- a/script/seed_sample.py +++ b/script/seed_sample.py @@ -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()} ) diff --git a/templates/requests/_review.html b/templates/requests/_review.html index f006dec2..5731a01c 100644 --- a/templates/requests/_review.html +++ b/templates/requests/_review.html @@ -154,7 +154,7 @@
- {% if jedi_request.task_order.pdf %} + {% if jedi_request.legacy_task_order.pdf %} Download the Task Order PDF @@ -164,29 +164,29 @@
- {{ 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("
CLIN 0001
-
Unclassified IaaS and PaaS Amount
", "task_order", "clin_0001", filter="dollars") }} + {{ DefinitionReviewField("
CLIN 0001
-
Unclassified IaaS and PaaS Amount
", "legacy_task_order", "clin_0001", filter="dollars") }} - {{ DefinitionReviewField("
CLIN 0003
-
Unclassified Cloud Support Package
", "task_order", "clin_0003", filter="dollars") }} + {{ DefinitionReviewField("
CLIN 0003
-
Unclassified Cloud Support Package
", "legacy_task_order", "clin_0003", filter="dollars") }} - {{ DefinitionReviewField("
CLIN 1001
-
Unclassified IaaS and PaaS Amount
OPTION PERIOD 1
", "task_order", "clin_1001", filter="dollars") }} + {{ DefinitionReviewField("
CLIN 1001
-
Unclassified IaaS and PaaS Amount
OPTION PERIOD 1
", "legacy_task_order", "clin_1001", filter="dollars") }} - {{ DefinitionReviewField("
CLIN 1003
-
Unclassified Cloud Support Package
OPTION PERIOD 1
", "task_order", "clin_1003", filter="dollars") }} + {{ DefinitionReviewField("
CLIN 1003
-
Unclassified Cloud Support Package
OPTION PERIOD 1
", "legacy_task_order", "clin_1003", filter="dollars") }} - {{ DefinitionReviewField("
CLIN 2001
-
Unclassified IaaS and PaaS Amount
OPTION PERIOD 2
", "task_order", "clin_2001", filter="dollars") }} + {{ DefinitionReviewField("
CLIN 2001
-
Unclassified IaaS and PaaS Amount
OPTION PERIOD 2
", "legacy_task_order", "clin_2001", filter="dollars") }} - {{ DefinitionReviewField("
CLIN 2003
-
Unclassified Cloud Support Package
OPTION PERIOD 2
", "task_order", "clin_2003", filter="dollars") }} + {{ DefinitionReviewField("
CLIN 2003
-
Unclassified Cloud Support Package
OPTION PERIOD 2
", "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") }} diff --git a/templates/requests/financial_verification.html b/templates/requests/financial_verification.html index 6fa45b8c..747b8852 100644 --- a/templates/requests/financial_verification.html +++ b/templates/requests/financial_verification.html @@ -71,55 +71,55 @@ {% if extended %}
- {{ OptionsInput(f.task_order.funding_type) }} + {{ OptionsInput(f.legacy_task_order.funding_type) }} - {{ 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' ) }}