diff --git a/atst/forms/task_order.py b/atst/forms/task_order.py index d6a8406e..ba7378c5 100644 --- a/atst/forms/task_order.py +++ b/atst/forms/task_order.py @@ -1,7 +1,4 @@ -from wtforms.fields import ( - BooleanField, - StringField, -) +from wtforms.fields import BooleanField, DecimalField, StringField from wtforms.fields.html5 import DateField from wtforms.validators import Required, Optional @@ -10,7 +7,11 @@ from atst.utils.localization import translate class TaskOrderForm(BaseForm): - number = StringField(validators=[Required()]) + number = StringField( + translate("forms.task_order.number_label"), + description=translate("forms.task_order.number_description"), + validators=[Required()], + ) class FundingForm(BaseForm): diff --git a/atst/routes/task_orders/new.py b/atst/routes/task_orders/new.py index 4ca8cdc0..864e6010 100644 --- a/atst/routes/task_orders/new.py +++ b/atst/routes/task_orders/new.py @@ -1,12 +1,4 @@ -from copy import deepcopy - -from flask import ( - g, - redirect, - render_template, - request as http_request, - url_for, -) +from flask import g, render_template, request as http_request from . import task_orders_bp from atst.domain.authz.decorator import user_can_access_decorator as user_can @@ -14,19 +6,12 @@ from atst.domain.task_orders import TaskOrders from atst.forms.task_order import TaskOrderForm from atst.models.permissions import Permissions from atst.utils.flash import formatted_flash as flash -from atst.utils.localization import translate - - -@task_orders_bp.route("/task_orders/new/get_started") -# TODO: see if this route still exists in new design -def get_started(): - return render_template("task_orders/new/get_started.html") # pragma: no cover @task_orders_bp.route("/portfolios//task_orders/new") @user_can(Permissions.CREATE_TASK_ORDER, message="view new task order form") def new(portfolio_id): - return render_template("task_orders/new", form=TaskOrderForm()) + return render_template("task_orders/new.html", form=TaskOrderForm()) @task_orders_bp.route("/portfolios//task_orders/new", methods=["POST"]) @@ -37,7 +22,11 @@ def create(portfolio_id): if form.validate(): TaskOrders.create(g.current_user, portfolio_id, **form.data) - # TODO: ask UX where do you go after save + flash("task_order_draft") + return render_template("task_orders/new.html", form=form) + else: + flash("form_errors") + return render_template("task_orders/new.html", form=form) @task_orders_bp.route("/portfolios//task_orders//edit") @@ -56,4 +45,8 @@ def update(portfolio_id, task_order_id=None): if form.validate(): TaskOrders.update(task_order_id, **form.data) - # TODO: ask UX where do you go after save + flash("task_order_draft") + return render_template("task_orders/new.html", form=form) + else: + flash("form_errors") + return render_template("task_orders/new.html", form=form) diff --git a/templates/navigation/global_sidenav.html b/templates/navigation/global_sidenav.html index e61524ee..b1b8e5b4 100644 --- a/templates/navigation/global_sidenav.html +++ b/templates/navigation/global_sidenav.html @@ -29,12 +29,6 @@
  • You have no portfolios yet
  • {% endif %} -
    - - Fund a new portfolio - {{ Icon("plus", classes="sidenav__link-icon") }} - - diff --git a/templates/portfolios/blank_slate.html b/templates/portfolios/blank_slate.html index 94c19015..62c59aa5 100644 --- a/templates/portfolios/blank_slate.html +++ b/templates/portfolios/blank_slate.html @@ -6,11 +6,10 @@ {% block content %} {{ EmptyState( - action_href=url_for("task_orders.get_started"), + action_href="#", action_label=("portfolios.index.empty.start_button" | translate), icon="cloud", message=("portfolios.index.empty.title" | translate), ) }} {% endblock %} - diff --git a/templates/portfolios/task_orders/index.html b/templates/portfolios/task_orders/index.html index e95a7a7f..a10f35ee 100644 --- a/templates/portfolios/task_orders/index.html +++ b/templates/portfolios/task_orders/index.html @@ -93,7 +93,7 @@ {% call StickyCTA(text="Funding") %} {% endcall %} @@ -125,7 +125,7 @@ {{ EmptyState( 'This portfolio doesn’t have any active or pending task orders.', action_label='Add a New Task Order', - action_href=url_for('task_orders.new', screen=1, portfolio_id=portfolio.id), + action_href=url_for('task_orders.new', portfolio_id=portfolio.id), icon='cloud', ) }} {% endif %} diff --git a/templates/task_orders/new.html b/templates/task_orders/new.html index e69de29b..41c6e5bc 100644 --- a/templates/task_orders/new.html +++ b/templates/task_orders/new.html @@ -0,0 +1,30 @@ +{% extends "base.html" %} + +{% from 'components/save_button.html' import SaveButton %} +{% from 'components/text_input.html' import TextInput %} + +{% block content %} +
    + {% include "fragments/flash.html" %} +
    + {% block portfolio_header %} + {% include "portfolios/header.html" %} + {% endblock %} + +
    + {{ form.csrf_token }} +
    + + Add Funding + {{ SaveButton(text=('common.save' | translate), element='input', form='new-task-order') }} +
    +
    + {{ "task_orders.new.form_help_text" | translate }} +
    + {{ TextInput(form.number) }} +
    +
    +
    +
    +
    +{% endblock %} diff --git a/templates/task_orders/new/app_info.html b/templates/task_orders/new/app_info.html index 04578c83..39f5fbb5 100644 --- a/templates/task_orders/new/app_info.html +++ b/templates/task_orders/new/app_info.html @@ -1,5 +1,3 @@ -{% extends 'task_orders/_new.html' %} - {% from "components/text_input.html" import TextInput %} {% from "components/options_input.html" import OptionsInput %} {% from "components/date_input.html" import DateInput %} diff --git a/templates/task_orders/new/funding.html b/templates/task_orders/new/funding.html index 3eecf718..6c6ab3fb 100644 --- a/templates/task_orders/new/funding.html +++ b/templates/task_orders/new/funding.html @@ -1,5 +1,3 @@ -{% extends 'task_orders/_new.html' %} - {% from "components/text_input.html" import TextInput %} {% from "components/options_input.html" import OptionsInput %} {% from "components/date_input.html" import DateInput %} diff --git a/templates/task_orders/new/oversight.html b/templates/task_orders/new/oversight.html index 626ecef0..4c7dc5ac 100644 --- a/templates/task_orders/new/oversight.html +++ b/templates/task_orders/new/oversight.html @@ -1,5 +1,3 @@ -{% extends 'task_orders/_new.html' %} - {% from "components/user_info.html" import UserInfo %} {% from "components/checkbox_input.html" import CheckboxInput %} {% from "components/text_input.html" import TextInput %} diff --git a/templates/task_orders/new/review.html b/templates/task_orders/new/review.html index 587adcb5..0819bf39 100644 --- a/templates/task_orders/new/review.html +++ b/templates/task_orders/new/review.html @@ -1,5 +1,3 @@ -{% extends 'task_orders/_new.html' %} - {% from "components/edit_link.html" import EditLink %} {% from "components/required_label.html" import RequiredLabel %} {% from "components/icon.html" import Icon %} diff --git a/tests/routes/task_orders/test_new.py b/tests/routes/task_orders/test_new.py index 57ffcee5..9760f26f 100644 --- a/tests/routes/task_orders/test_new.py +++ b/tests/routes/task_orders/test_new.py @@ -33,12 +33,20 @@ def user(): return UserFactory.create() -def test_task_orders_new(): - pass +def test_task_orders_new(client, user_session, portfolio): + user_session(portfolio.owner) + response = client.get(url_for("task_orders.new", portfolio_id=portfolio.id)) + assert response.status_code == 200 -def test_task_orders_create(): - pass +def test_task_orders_create(client, user_session, portfolio): + user_session(portfolio.owner) + response = client.post( + url_for("task_orders.create", portfolio_id=portfolio.id), + data={"number": "0123456789"}, + ) + assert response.status_code == 200 + assert translate("task_orders.form.draft_alert_message") in response.data.decode() def test_task_orders_edit(): diff --git a/translations.yaml b/translations.yaml index 9e5af217..230d9557 100644 --- a/translations.yaml +++ b/translations.yaml @@ -298,6 +298,8 @@ forms: not_sure: 'Not sure, unsure if planning to develop natively in the cloud' 'yes': 'Yes, planning to develop natively in the cloud' not_sure_help: Not sure? Talk to your technical lead about where and how they plan on developing your application. + number_description: Task order number (10 digit number from your system of record) + number_label: Add your task order oversight_am_cor_label: I am the Contracting Officer Representative (COR) for this task order oversight_dod_id_label: DoD ID oversight_email_label: Email @@ -619,6 +621,7 @@ task_orders: task_order_information: Task order information title: Verify task order information new: + form_help_text: Before you can begin work in the cloud, you'll need to complete the information below and upload your approved task order for reference by the CCPO. app_info: basic_info_title: Basic information details_description: 'Provide a few more details about the work you will be doing. The CCPO will use this section for reporting purposes, but it won’t be included in the final task order.'