Combine similar routes and templates, delete unused TO form templates
This commit is contained in:
parent
0a2d241dc4
commit
b97ae02a93
@ -9,27 +9,44 @@ from atst.utils.flash import formatted_flash as flash
|
|||||||
|
|
||||||
|
|
||||||
@task_orders_bp.route("/portfolios/<portfolio_id>/task_orders/new")
|
@task_orders_bp.route("/portfolios/<portfolio_id>/task_orders/new")
|
||||||
|
@task_orders_bp.route("/portfolios/<portfolio_id>/task_orders/<task_order_id>/edit")
|
||||||
@user_can(Permissions.CREATE_TASK_ORDER, message="view new task order form")
|
@user_can(Permissions.CREATE_TASK_ORDER, message="view new task order form")
|
||||||
def new(portfolio_id):
|
def edit(portfolio_id, task_order_id=None):
|
||||||
|
form = None
|
||||||
|
|
||||||
|
if task_order_id:
|
||||||
|
task_order = TaskOrders.get(task_order_id)
|
||||||
|
form = TaskOrderForm(number=task_order.number)
|
||||||
|
else:
|
||||||
|
form = TaskOrderForm()
|
||||||
|
|
||||||
cancel_url = (
|
cancel_url = (
|
||||||
http_request.referrer
|
http_request.referrer
|
||||||
if http_request.referrer
|
if http_request.referrer
|
||||||
else url_for("task_orders.portfolio_funding", portfolio_id=portfolio_id)
|
else url_for("task_orders.portfolio_funding", portfolio_id=portfolio_id)
|
||||||
)
|
)
|
||||||
return render_template(
|
|
||||||
"task_orders/new.html", form=TaskOrderForm(), cancel_url=cancel_url
|
return render_template("task_orders/edit.html", form=form, cancel_url=cancel_url)
|
||||||
)
|
|
||||||
|
|
||||||
|
|
||||||
@task_orders_bp.route("/portfolios/<portfolio_id>/task_orders/new", methods=["POST"])
|
@task_orders_bp.route("/portfolios/<portfolio_id>/task_orders/new", methods=["POST"])
|
||||||
|
@task_orders_bp.route(
|
||||||
|
"/portfolios/<portfolio_id>/task_orders/<task_order_id>", methods=["POST"]
|
||||||
|
)
|
||||||
@user_can(Permissions.CREATE_TASK_ORDER, message="create new task order")
|
@user_can(Permissions.CREATE_TASK_ORDER, message="create new task order")
|
||||||
def create(portfolio_id):
|
def update(portfolio_id, task_order_id=None):
|
||||||
form_data = http_request.form
|
form_data = http_request.form
|
||||||
form = TaskOrderForm(form_data)
|
form = TaskOrderForm(form_data)
|
||||||
# todo: add in better error handling for dupe TO numbers
|
|
||||||
if form.validate():
|
if form.validate():
|
||||||
|
task_order = None
|
||||||
|
if task_order_id:
|
||||||
|
task_order = TaskOrders.update(task_order_id, **form.data)
|
||||||
|
else:
|
||||||
task_order = TaskOrders.create(g.current_user, portfolio_id, **form.data)
|
task_order = TaskOrders.create(g.current_user, portfolio_id, **form.data)
|
||||||
|
|
||||||
flash("task_order_draft")
|
flash("task_order_draft")
|
||||||
|
|
||||||
return redirect(
|
return redirect(
|
||||||
url_for(
|
url_for(
|
||||||
"task_orders.edit",
|
"task_orders.edit",
|
||||||
@ -37,33 +54,6 @@ def create(portfolio_id):
|
|||||||
task_order_id=task_order.id,
|
task_order_id=task_order.id,
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
else:
|
|
||||||
flash("form_errors")
|
|
||||||
return render_template("task_orders/new.html", form=form)
|
|
||||||
|
|
||||||
|
|
||||||
# Combine with new route?
|
|
||||||
@task_orders_bp.route("/portfolios/<portfolio_id>/task_orders/<task_order_id>/edit")
|
|
||||||
@user_can(Permissions.CREATE_TASK_ORDER, message="update task order")
|
|
||||||
def edit(portfolio_id, task_order_id):
|
|
||||||
task_order = TaskOrders.get(task_order_id)
|
|
||||||
form = TaskOrderForm(number=task_order.number)
|
|
||||||
return render_template("task_orders/edit.html", form=form)
|
|
||||||
|
|
||||||
|
|
||||||
# Combine with create route?
|
|
||||||
@task_orders_bp.route(
|
|
||||||
"/portfolios/<portfolio_id>/task_orders/<task_order_id>", methods=["POST"]
|
|
||||||
)
|
|
||||||
@user_can(Permissions.CREATE_TASK_ORDER, message="update task order")
|
|
||||||
def update(portfolio_id, task_order_id=None):
|
|
||||||
form_data = http_request.form
|
|
||||||
form = TaskOrderForm(form_data)
|
|
||||||
|
|
||||||
if form.validate():
|
|
||||||
TaskOrders.update(task_order_id, **form.data)
|
|
||||||
flash("task_order_draft")
|
|
||||||
return render_template("task_orders/new.html", form=form)
|
|
||||||
else:
|
else:
|
||||||
flash("form_errors")
|
flash("form_errors")
|
||||||
return render_template("task_orders/edit.html", form=form)
|
return render_template("task_orders/edit.html", form=form)
|
||||||
|
@ -93,7 +93,7 @@
|
|||||||
|
|
||||||
{% call StickyCTA(text="Funding") %}
|
{% call StickyCTA(text="Funding") %}
|
||||||
<div class='portfolio-funding__header row'>
|
<div class='portfolio-funding__header row'>
|
||||||
<a href="{{ url_for("task_orders.new", portfolio_id=portfolio.id) }}" class="usa-button">Start a new task order</a>
|
<a href="{{ url_for("task_orders.edit", portfolio_id=portfolio.id) }}" class="usa-button">Start a new task order</a>
|
||||||
</div>
|
</div>
|
||||||
{% endcall %}
|
{% endcall %}
|
||||||
|
|
||||||
@ -125,7 +125,7 @@
|
|||||||
{{ EmptyState(
|
{{ EmptyState(
|
||||||
'This portfolio doesn’t have any active or pending task orders.',
|
'This portfolio doesn’t have any active or pending task orders.',
|
||||||
action_label='Add a New Task Order',
|
action_label='Add a New Task Order',
|
||||||
action_href=url_for('task_orders.new', portfolio_id=portfolio.id),
|
action_href=url_for('task_orders.edit', portfolio_id=portfolio.id),
|
||||||
icon='cloud',
|
icon='cloud',
|
||||||
) }}
|
) }}
|
||||||
{% endif %}
|
{% endif %}
|
||||||
|
@ -1,47 +0,0 @@
|
|||||||
{% extends "base.html" %}
|
|
||||||
|
|
||||||
{% block content %}
|
|
||||||
|
|
||||||
<div class="col task-order-form">
|
|
||||||
|
|
||||||
{% include 'task_orders/new/menu.html' %}
|
|
||||||
|
|
||||||
{% include "fragments/flash.html" %}
|
|
||||||
|
|
||||||
{% block form_action %}
|
|
||||||
<form method='POST' action="{{ action_url }}" autocomplete="off" enctype="multipart/form-data">
|
|
||||||
{% endblock %}
|
|
||||||
|
|
||||||
<div class="panel">
|
|
||||||
|
|
||||||
<div class="panel__heading">
|
|
||||||
<h1 class="task-order-form__heading subheading">
|
|
||||||
<div class="h2">Task Order Builder</div>
|
|
||||||
{% block heading %}{% endblock %}
|
|
||||||
</h1>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="panel__content">
|
|
||||||
|
|
||||||
{{ form.csrf_token }}
|
|
||||||
{% block form %}
|
|
||||||
form goes here
|
|
||||||
{% endblock %}
|
|
||||||
|
|
||||||
</div>
|
|
||||||
|
|
||||||
</div>
|
|
||||||
|
|
||||||
{% block next %}
|
|
||||||
|
|
||||||
<div class='action-group'>
|
|
||||||
<input type='submit' class='usa-button usa-button-primary' value='{{ "Save" if ko_edit else "Save & Continue" }}' />
|
|
||||||
</div>
|
|
||||||
|
|
||||||
{% endblock %}
|
|
||||||
|
|
||||||
</form>
|
|
||||||
|
|
||||||
</div>
|
|
||||||
|
|
||||||
{% endblock %}
|
|
@ -11,11 +11,17 @@
|
|||||||
{% include "portfolios/header.html" %}
|
{% include "portfolios/header.html" %}
|
||||||
{% endblock %}
|
{% endblock %}
|
||||||
<base-form inline-template>
|
<base-form inline-template>
|
||||||
<form id="new-task-order" action='{{ url_for("task_orders.create", portfolio_id=portfolio.id) }}' method="POST" autocomplete="off">
|
<form id="new-task-order" action='{{ url_for("task_orders.update", portfolio_id=portfolio.id) }}' method="POST" autocomplete="off">
|
||||||
{{ form.csrf_token }}
|
{{ form.csrf_token }}
|
||||||
<div class="panel__content">
|
<div class="panel__content">
|
||||||
<!-- TODO: implement save bar with component -->
|
<!-- TODO: implement save bar with component -->
|
||||||
<span class="h3">Add Funding</span>
|
<span class="h3">Add Funding</span>
|
||||||
|
<a
|
||||||
|
href="{{ cancel_url }}"
|
||||||
|
class="action-group__action icon-link">
|
||||||
|
<span class="icon icon--x"></span>
|
||||||
|
{{ "common.cancel" | translate }}
|
||||||
|
</a>
|
||||||
{{ SaveButton(text=('common.save' | translate), element='input', form='new-task-order') }}
|
{{ SaveButton(text=('common.save' | translate), element='input', form='new-task-order') }}
|
||||||
</div>
|
</div>
|
||||||
<div class="panel__content">
|
<div class="panel__content">
|
||||||
|
@ -1,36 +0,0 @@
|
|||||||
{% extends "base.html" %}
|
|
||||||
|
|
||||||
{% from 'components/save_button.html' import SaveButton %}
|
|
||||||
{% from 'components/text_input.html' import TextInput %}
|
|
||||||
|
|
||||||
{% block content %}
|
|
||||||
<div class="col task-order-form">
|
|
||||||
{% include "fragments/flash.html" %}
|
|
||||||
<div class="panel">
|
|
||||||
{% block portfolio_header %}
|
|
||||||
{% include "portfolios/header.html" %}
|
|
||||||
{% endblock %}
|
|
||||||
<base-form inline-template>
|
|
||||||
<form id="new-task-order" action='{{ url_for("task_orders.create", portfolio_id=portfolio.id) }}' method="POST" autocomplete="off">
|
|
||||||
{{ form.csrf_token }}
|
|
||||||
<div class="panel__content">
|
|
||||||
<!-- TODO: implement save bar with component -->
|
|
||||||
<span class="h3">Add Funding</span>
|
|
||||||
<a
|
|
||||||
href="{{ cancel_url }}"
|
|
||||||
class="action-group__action icon-link">
|
|
||||||
<span class="icon icon--x"></span>
|
|
||||||
{{ "common.cancel" | translate }}
|
|
||||||
</a>
|
|
||||||
{{ SaveButton(text=('common.save' | translate), element='input', form='new-task-order') }}
|
|
||||||
</div>
|
|
||||||
<div class="panel__content">
|
|
||||||
{{ "task_orders.new.form_help_text" | translate }}
|
|
||||||
<hr>
|
|
||||||
{{ TextInput(form.number, validation='taskOrderNumber') }}
|
|
||||||
</div>
|
|
||||||
</form>
|
|
||||||
</base-form>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
{% endblock %}
|
|
@ -1,19 +0,0 @@
|
|||||||
<div class='form-row'>
|
|
||||||
<div class='form-col form-col--half'>
|
|
||||||
{{ TextInput(first_name) }}
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class='form-col form-col--half'>
|
|
||||||
{{ TextInput(last_name) }}
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class='form-row'>
|
|
||||||
<div class='form-col form-col--half'>
|
|
||||||
{{ TextInput(email, placeholder='name@mail.mil') }}
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class='form-col form-col--half'>
|
|
||||||
{{ TextInput(dod_id, placeholder='1234567890') }}
|
|
||||||
</div>
|
|
||||||
</div>
|
|
@ -1,56 +0,0 @@
|
|||||||
{% from "components/text_input.html" import TextInput %}
|
|
||||||
{% from "components/options_input.html" import OptionsInput %}
|
|
||||||
{% from "components/date_input.html" import DateInput %}
|
|
||||||
{% from "components/multi_checkbox_input.html" import MultiCheckboxInput %}
|
|
||||||
{% from "components/review_field.html" import ReviewField %}
|
|
||||||
|
|
||||||
{% block heading %}
|
|
||||||
{{ "task_orders.new.app_info.section_title"| translate }}
|
|
||||||
{% endblock %}
|
|
||||||
|
|
||||||
{% block form %}
|
|
||||||
|
|
||||||
|
|
||||||
<!-- App Info Section -->
|
|
||||||
<p>{{ "forms.task_order.basic_intro" | translate }}</p>
|
|
||||||
<h3 class="task-order-form__heading subheading">{{ "task_orders.new.app_info.basic_info_title"| translate }}</h3>
|
|
||||||
|
|
||||||
{% if portfolio %}
|
|
||||||
{{ ReviewField(heading="forms.portfolio.name_label" | translate, field=portfolio.name) }}
|
|
||||||
{% else %}
|
|
||||||
{{ TextInput(form.portfolio_name, placeholder="The name of your office or organization", validation="portfolioName") }}
|
|
||||||
{% endif %}
|
|
||||||
|
|
||||||
{{ TextInput(form.scope, paragraph=True) }}
|
|
||||||
|
|
||||||
<div class="subheading--black">
|
|
||||||
{% if portfolio %}
|
|
||||||
{{ ReviewField(heading="forms.task_order.defense_component_label" | translate, field=portfolio.defense_component) }}
|
|
||||||
{% else %}
|
|
||||||
{{ OptionsInput(form.defense_component) }}
|
|
||||||
{% endif %}
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<hr>
|
|
||||||
|
|
||||||
<h3 id="reporting" class="subheading">{{ "task_orders.new.app_info.project_title" | translate }}</h3>
|
|
||||||
<p>{{ "task_orders.new.app_info.details_description" | translate }}</p>
|
|
||||||
{{ OptionsInput(form.app_migration) }}
|
|
||||||
<p>{{ "forms.task_order.app_migration.not_sure_help" | translate }}</p>
|
|
||||||
{{ OptionsInput(form.native_apps) }}
|
|
||||||
<p>{{ "forms.task_order.native_apps.not_sure_help" | translate }}</p>
|
|
||||||
{{ MultiCheckboxInput(form.complexity, form.complexity_other) }}
|
|
||||||
|
|
||||||
<hr>
|
|
||||||
|
|
||||||
<h3 class="subheading">{{ "task_orders.new.app_info.team_title" | translate }}</h3>
|
|
||||||
<p>{{ "task_orders.new.app_info.subtitle" | translate }}</p>
|
|
||||||
{{ MultiCheckboxInput(form.dev_team, form.dev_team_other) }}
|
|
||||||
{{ OptionsInput(form.team_experience) }}
|
|
||||||
|
|
||||||
<hr>
|
|
||||||
|
|
||||||
<h3 class="subheading">{{ "task_orders.new.app_info.market_research_title" | translate }}</h3>
|
|
||||||
<p>{{ "task_orders.new.app_info.market_research_paragraph" | translate | safe }}</p>
|
|
||||||
|
|
||||||
{% endblock %}
|
|
@ -1,66 +0,0 @@
|
|||||||
{% from "components/text_input.html" import TextInput %}
|
|
||||||
{% from "components/options_input.html" import OptionsInput %}
|
|
||||||
{% from "components/date_input.html" import DateInput %}
|
|
||||||
{% from "components/upload_input.html" import UploadInput %}
|
|
||||||
|
|
||||||
{% from "components/icon.html" import Icon %}
|
|
||||||
|
|
||||||
{% block heading %}
|
|
||||||
{{ "task_orders.new.funding.section_title" | translate }}
|
|
||||||
{% endblock %}
|
|
||||||
|
|
||||||
{% block form %}
|
|
||||||
|
|
||||||
<funding
|
|
||||||
inline-template
|
|
||||||
v-bind:initial-data='{{ form.data|tojson }}'
|
|
||||||
v-bind:upload-errors='{{ form.csp_estimate.errors | list }}'
|
|
||||||
>
|
|
||||||
<div>
|
|
||||||
|
|
||||||
<p>{{ "task_orders.new.funding.subtitle" | translate }}</p>
|
|
||||||
<!-- Get Funding Section -->
|
|
||||||
<h3 class="subheading">{{ "task_orders.new.funding.performance_period_title" | translate }}</h3>
|
|
||||||
<p>{{ "task_orders.new.funding.performance_period_description" | translate }}</p>
|
|
||||||
<p>{{ "task_orders.new.funding.performance_period_paragraph" | translate }}</p>
|
|
||||||
{{ OptionsInput(form.performance_length) }}
|
|
||||||
|
|
||||||
<hr>
|
|
||||||
|
|
||||||
<h3 class="subheading">{{ "task_orders.new.funding.estimate_usage_title" | translate }}</h3>
|
|
||||||
<p>{{ "task_orders.new.funding.estimate_usage_description" | translate }}</p>
|
|
||||||
<p><a class="icon-link" target="_blank" href="{{ url_for('atst.jedi_csp_calculator') }}">
|
|
||||||
{{ Icon("link")}} Go to Cloud Service Provider’s estimate calculator
|
|
||||||
</a></p>
|
|
||||||
<p>{{ "task_orders.new.funding.estimate_usage_paragraph" | translate }}</p>
|
|
||||||
{{ UploadInput(form.csp_estimate, show_label=True) }}
|
|
||||||
|
|
||||||
<hr>
|
|
||||||
|
|
||||||
<h3 class="subheading">{{ "task_orders.new.funding.cloud_calculations_title" | translate }}</h3>
|
|
||||||
<p>{{ "task_orders.new.funding.cloud_calculations_paragraph" | translate }}</p>
|
|
||||||
|
|
||||||
<h4 class="task-order-form__heading subheading">{{ "task_orders.new.funding.cloud_offerings_title" | translate }}</h4>
|
|
||||||
<p>{{ "task_orders.new.funding.cloud_offerings_paragraph" | translate }}</p>
|
|
||||||
{{ TextInput(form.clin_01, validation='dollars', placeholder="$0.00") }}
|
|
||||||
{{ TextInput(form.clin_02, validation='dollars', placeholder="$0.00", disabled=(not config.CLASSIFIED)) }}
|
|
||||||
|
|
||||||
<h4 class="task-order-form__heading subheading">{{ "task_orders.new.funding.support_assistance_title" | translate }}</h4>
|
|
||||||
<p>{{ "task_orders.new.funding.support_assistance_paragraph" | translate }}</p>
|
|
||||||
{{ TextInput(form.clin_03, validation='dollars', tooltip='The cloud support and assistance packages cannot be used as a primary development resource.', placeholder="$0.00") }}
|
|
||||||
{{ TextInput(form.clin_04, validation='dollars', tooltip='The cloud support and assistance packages cannot be used as a primary development resource.', placeholder="$0.00", disabled=(not config.CLASSIFIED)) }}
|
|
||||||
</div>
|
|
||||||
</funding>
|
|
||||||
|
|
||||||
{% endblock %}
|
|
||||||
|
|
||||||
{% block next %}
|
|
||||||
<div class="row">
|
|
||||||
<div class="col col--grow">
|
|
||||||
<p><strong><span class="task-order-form__heading subheading">{{ "task_orders.new.funding.total" | translate }}</span><br><span id="to-target"></span></strong></p>
|
|
||||||
</div>
|
|
||||||
<div class="col col--grow">
|
|
||||||
{{ super() }}
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
{% endblock %}
|
|
@ -1,78 +0,0 @@
|
|||||||
{% from "components/icon.html" import Icon %}
|
|
||||||
|
|
||||||
|
|
||||||
{% extends "base.html" %}
|
|
||||||
|
|
||||||
{% macro Help(icon_name="", name="", description="", link_text="") %}
|
|
||||||
<div class="panel__content col">
|
|
||||||
{{ Icon(icon_name, classes="task-order-help__icon") }}
|
|
||||||
<h3>{{ name }}</h3>
|
|
||||||
<p>{{ description }}</p>
|
|
||||||
<a class="icon-link">{{ link_text }}</a>
|
|
||||||
</div>
|
|
||||||
{% endmacro %}
|
|
||||||
|
|
||||||
{% block content %}
|
|
||||||
|
|
||||||
<div class="col col--grow task-order-get-started">
|
|
||||||
<div class="panel task-order-get-started__panel">
|
|
||||||
<h1 class="panel__content">{{ "task_orders.new.get_started.title" | translate }}</h1>
|
|
||||||
<div class="panel__content">
|
|
||||||
<p class="centered">
|
|
||||||
{{ "task_orders.new.get_started.intro" | translate }}
|
|
||||||
</p>
|
|
||||||
<p class="centered">
|
|
||||||
{{ "task_orders.new.get_started.intro2" | translate }}
|
|
||||||
</p>
|
|
||||||
</div>
|
|
||||||
<span class="task-order-get-started__list panel__content">
|
|
||||||
<ul>
|
|
||||||
<li>Statement of work</li>
|
|
||||||
<li>Market research</li>
|
|
||||||
<li>Security documentation</li>
|
|
||||||
<li>Various approvals</li>
|
|
||||||
</ul>
|
|
||||||
</span>
|
|
||||||
<div class="panel__content">
|
|
||||||
<p class="centered">
|
|
||||||
{{ "task_orders.new.get_started.intro3" | translate }}
|
|
||||||
</p>
|
|
||||||
<p class="centered">
|
|
||||||
{{ "task_orders.new.get_started.intro4" | translate }}
|
|
||||||
</p>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="panel task-order-needs">
|
|
||||||
<h1 class="panel__content">{{ "task_orders.new.get_started.team_header" | translate }}</h1>
|
|
||||||
<div class="panel__content task-order-needs__list">
|
|
||||||
{{ Help(
|
|
||||||
name="Development Lead",
|
|
||||||
icon_name="computer",
|
|
||||||
description="Your development lead will decide and estimate what types of cloud offerings your group needs.",
|
|
||||||
link_text="Share cloud estimate link") }}
|
|
||||||
{{ Help(
|
|
||||||
name="Security Lead",
|
|
||||||
icon_name="shield",
|
|
||||||
description="Your security lead will review and approve your security classification needs. They will also review and complete a standardized DD-254.",
|
|
||||||
link_text="You'll need their DoD ID number") }}
|
|
||||||
{{ Help(
|
|
||||||
name="Contracting Officer",
|
|
||||||
icon_name="dollar-sign",
|
|
||||||
description="Your contracting officer will review your funding needs and ultimately approve your task order.",
|
|
||||||
link_text="You'll need their DoD ID number") }}
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="task-order-get-started__actions">
|
|
||||||
<div class="task-order-get-started__button-row">
|
|
||||||
<a href="{{ request.referrer or url_for("atst.home") }}" class="icon-link">
|
|
||||||
{{ Icon("caret_left") }}
|
|
||||||
<span>Cancel</span>
|
|
||||||
</a>
|
|
||||||
<a href="{{ url_for("task_orders.new", screen=1) }}" class="usa-button usa-button-big">{{ "task_orders.new.get_started.button" | translate }}</a>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
{% endblock %}
|
|
@ -1,22 +0,0 @@
|
|||||||
<div class="progress-menu progress-menu--four">
|
|
||||||
<ul>
|
|
||||||
{% for s in screens %}
|
|
||||||
<li class="progress-menu__item progress-menu__item--{{ s.completion }}">
|
|
||||||
<a
|
|
||||||
{% set class='' %}
|
|
||||||
{% if task_order_id %}
|
|
||||||
href="{{ url_for('task_orders.new', screen=loop.index, task_order_id=task_order_id) }}"
|
|
||||||
{% else %}
|
|
||||||
{% set class="disabled"%}
|
|
||||||
{% endif %}
|
|
||||||
{% if g.matchesPath(url_for('task_orders.new', screen=loop.index)) %}
|
|
||||||
{% set class="active" %}
|
|
||||||
{% endif %}
|
|
||||||
class={{class}}
|
|
||||||
>
|
|
||||||
{{ s['title'] }}
|
|
||||||
</a>
|
|
||||||
</li>
|
|
||||||
{% endfor %}
|
|
||||||
</ul>
|
|
||||||
</div>
|
|
@ -1,57 +0,0 @@
|
|||||||
{% from "components/user_info.html" import UserInfo %}
|
|
||||||
{% from "components/checkbox_input.html" import CheckboxInput %}
|
|
||||||
{% from "components/text_input.html" import TextInput %}
|
|
||||||
|
|
||||||
{% block heading %}
|
|
||||||
{{ "task_orders.new.oversight.section_title" | translate }}
|
|
||||||
{% endblock %}
|
|
||||||
|
|
||||||
{% block form %}
|
|
||||||
|
|
||||||
<!-- Oversight Section -->
|
|
||||||
<h3 class="subheading">{{ "task_orders.new.oversight.ko_info_title" | translate }}</h3>
|
|
||||||
<p>{{ "task_orders.new.oversight.ko_info_paragraph" | translate }}</p>
|
|
||||||
<oversight inline-template v-bind:initial-data='{{ form.data|tojson }}'>
|
|
||||||
<div class='usa-input'>
|
|
||||||
{{ UserInfo(form.ko_first_name, form.ko_last_name, form.ko_email, form.ko_phone_number) }}
|
|
||||||
{{ CheckboxInput(form.ko_invite) }}
|
|
||||||
<keep-alive>
|
|
||||||
<dodid v-bind:initial-invite="ko_invite" inline-template v-if="ko_invite">
|
|
||||||
{{ TextInput(form.ko_dod_id, placeholder="1234567890", tooltip="task_orders.new.oversight.dod_id_tooltip" | translate, tooltip_title='Why', validation='dodId', classes="task-order__invite-officer")}}
|
|
||||||
</dodid>
|
|
||||||
</keep-alive>
|
|
||||||
|
|
||||||
<hr />
|
|
||||||
|
|
||||||
<h3 class="subheading">{{ "task_orders.new.oversight.cor_info_title" | translate }}</h3>
|
|
||||||
<p>{{ "task_orders.new.oversight.cor_info_paragraph" | translate }}</p>
|
|
||||||
{{ CheckboxInput(form.am_cor, classes="normal") }}
|
|
||||||
|
|
||||||
<keep-alive>
|
|
||||||
<cordata v-bind:initial-cor-invite="cor_invite" inline-template v-if="!am_cor">
|
|
||||||
<div>
|
|
||||||
{{ UserInfo(form.cor_first_name, form.cor_last_name, form.cor_email, form.cor_phone_number) }}
|
|
||||||
{{ CheckboxInput(form.cor_invite) }}
|
|
||||||
<template v-if="cor_invite">
|
|
||||||
{{ TextInput(form.cor_dod_id, placeholder="1234567890", tooltip="task_orders.new.oversight.dod_id_tooltip" | translate, tooltip_title='Why', validation='dodId', classes="task-order__invite-officer")}}
|
|
||||||
</template>
|
|
||||||
</div>
|
|
||||||
</cordata>
|
|
||||||
</keep-alive>
|
|
||||||
|
|
||||||
<hr />
|
|
||||||
|
|
||||||
<h3 class="subheading">{{ "task_orders.new.oversight.so_info_title" | translate }}</h3>
|
|
||||||
<p>{{ "task_orders.new.oversight.so_info_paragraph" | translate }}</p>
|
|
||||||
{{ UserInfo(form.so_first_name, form.so_last_name, form.so_email, form.so_phone_number) }}
|
|
||||||
{{ CheckboxInput(form.so_invite) }}
|
|
||||||
<keep-alive>
|
|
||||||
<dodid v-bind:initial-invite="so_invite" inline-template v-if="so_invite">
|
|
||||||
{{ TextInput(form.so_dod_id, placeholder="1234567890", tooltip="task_orders.new.oversight.dod_id_tooltip" | translate, tooltip_title='Why', validation='dodId', classes="task-order__invite-officer")}}
|
|
||||||
</dodid>
|
|
||||||
</keep-alive>
|
|
||||||
</div>
|
|
||||||
</oversight>
|
|
||||||
|
|
||||||
|
|
||||||
{% endblock %}
|
|
@ -1,104 +0,0 @@
|
|||||||
{% from "components/edit_link.html" import EditLink %}
|
|
||||||
{% from "components/required_label.html" import RequiredLabel %}
|
|
||||||
{% from "components/icon.html" import Icon %}
|
|
||||||
{% from "components/review_field.html" import ReviewField %}
|
|
||||||
|
|
||||||
{% block heading %}
|
|
||||||
{{ "task_orders.new.review.section_title"| translate }}
|
|
||||||
{% endblock %}
|
|
||||||
|
|
||||||
{% block form %}
|
|
||||||
|
|
||||||
<h3 class="subheading">{{ "task_orders.new.review.app_info"| translate }} {{ EditLink(url_for("task_orders.new", screen=1, task_order_id=task_order.id)) }}
|
|
||||||
</h3>
|
|
||||||
{% include "fragments/task_order_review/app_info.html" %}
|
|
||||||
<hr>
|
|
||||||
|
|
||||||
<h3 class="subheading">{{ "task_orders.new.review.reporting"| translate }} {{ EditLink(url_for("task_orders.new", screen=1, task_order_id=task_order.id, _anchor="reporting")) }}</h3>
|
|
||||||
|
|
||||||
<div class="row">
|
|
||||||
{{
|
|
||||||
ReviewField(
|
|
||||||
("forms.task_order.app_migration.label" | translate),
|
|
||||||
(
|
|
||||||
("forms.task_order.app_migration.{}".format(task_order.app_migration) | translate) if task_order.app_migration
|
|
||||||
),
|
|
||||||
filter='safe'
|
|
||||||
)
|
|
||||||
}}
|
|
||||||
|
|
||||||
{{
|
|
||||||
ReviewField(
|
|
||||||
("forms.task_order.native_apps.label" | translate),
|
|
||||||
(
|
|
||||||
("forms.task_order.native_apps.{}".format(task_order.native_apps) | translate) if task_order.native_apps
|
|
||||||
)
|
|
||||||
)
|
|
||||||
}}
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<h4 class='task-order-form__heading'>{{ "task_orders.new.review.complexity"| translate }}</h4>
|
|
||||||
{% if task_order.complexity %}
|
|
||||||
<ul class="checklist">
|
|
||||||
{% for item in task_order.complexity %}
|
|
||||||
<li>
|
|
||||||
{{ Icon('ok', classes='icon--gray icon--medium') }}{{ "forms.task_order.complexity.{}".format(item) | translate }}{% if item == 'other' %}: {{ task_order.complexity_other }}{% endif %}
|
|
||||||
</li>
|
|
||||||
{% endfor %}
|
|
||||||
</ul>
|
|
||||||
{% else %}
|
|
||||||
<p>{{ RequiredLabel() }}</p>
|
|
||||||
{% endif %}
|
|
||||||
|
|
||||||
<div class="row">
|
|
||||||
<div class="col col--grow">
|
|
||||||
<h4 class='task-order-form__heading'>{{ "task_orders.new.review.team"| translate }}</h4>
|
|
||||||
{% if task_order.dev_team %}
|
|
||||||
<ul class="checklist">
|
|
||||||
{% for item in task_order.dev_team %}
|
|
||||||
<li>
|
|
||||||
{% if item == 'other' %}
|
|
||||||
{{ Icon('ok', classes='icon--gray icon--medium') }}Other: {{ task_order.dev_team_other }}
|
|
||||||
{% else %}
|
|
||||||
{{ Icon('ok', classes='icon--gray icon--medium') }}{{ "forms.task_order.dev_team.{}".format(item) | translate }}
|
|
||||||
{% endif %}
|
|
||||||
</li>
|
|
||||||
{% endfor %}
|
|
||||||
</ul>
|
|
||||||
{% else %}
|
|
||||||
<p>{{ RequiredLabel() }}</p>
|
|
||||||
{% endif %}
|
|
||||||
</div>
|
|
||||||
|
|
||||||
{{
|
|
||||||
ReviewField(
|
|
||||||
("forms.task_order.team_experience.label" |translate),
|
|
||||||
(
|
|
||||||
("forms.task_order.team_experience.{}".format(task_order.team_experience) | translate) if task_order.team_experience
|
|
||||||
)
|
|
||||||
)
|
|
||||||
}}
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<hr>
|
|
||||||
|
|
||||||
<h3 class="subheading">{{ "task_orders.new.review.funding"| translate }} {{ EditLink(url_for("task_orders.new", screen=2, task_order_id=task_order.id)) }}</h3>
|
|
||||||
{% include "fragments/task_order_review/funding.html" %}
|
|
||||||
<hr>
|
|
||||||
|
|
||||||
<h3 class="subheading">{{ "task_orders.new.review.oversight"| translate }} {{ EditLink(url_for("task_orders.new", screen=3, task_order_id=task_order.id)) }}</h3>
|
|
||||||
{% include "fragments/task_order_review/oversight.html" %}
|
|
||||||
{% endblock %}
|
|
||||||
|
|
||||||
{% block next %}
|
|
||||||
<div class='action-group'>
|
|
||||||
<input type='submit' class='usa-button usa-button-primary' value='Done'
|
|
||||||
{% if not complete %}disabled{% endif %}/>
|
|
||||||
</div>
|
|
||||||
{% endblock %}
|
|
||||||
|
|
||||||
{% block form_action %}
|
|
||||||
{% if task_order_id %}
|
|
||||||
<form method='POST' action="{{ url_for('task_orders.invite', task_order_id=task_order_id) }}" autocomplete="off">
|
|
||||||
{% endif %}
|
|
||||||
{% endblock %}
|
|
@ -35,14 +35,14 @@ def user():
|
|||||||
|
|
||||||
def test_task_orders_new(client, user_session, portfolio):
|
def test_task_orders_new(client, user_session, portfolio):
|
||||||
user_session(portfolio.owner)
|
user_session(portfolio.owner)
|
||||||
response = client.get(url_for("task_orders.new", portfolio_id=portfolio.id))
|
response = client.get(url_for("task_orders.edit", portfolio_id=portfolio.id))
|
||||||
assert response.status_code == 200
|
assert response.status_code == 200
|
||||||
|
|
||||||
|
|
||||||
def test_task_orders_create(client, user_session, portfolio):
|
def test_task_orders_create(client, user_session, portfolio):
|
||||||
user_session(portfolio.owner)
|
user_session(portfolio.owner)
|
||||||
response = client.post(
|
response = client.post(
|
||||||
url_for("task_orders.create", portfolio_id=portfolio.id),
|
url_for("task_orders.update", portfolio_id=portfolio.id),
|
||||||
data={"number": "0123456789"},
|
data={"number": "0123456789"},
|
||||||
)
|
)
|
||||||
assert response.status_code == 302
|
assert response.status_code == 302
|
||||||
@ -52,7 +52,7 @@ def test_task_orders_create_invalid_data(client, user_session, portfolio):
|
|||||||
user_session(portfolio.owner)
|
user_session(portfolio.owner)
|
||||||
num_task_orders = len(portfolio.task_orders)
|
num_task_orders = len(portfolio.task_orders)
|
||||||
response = client.post(
|
response = client.post(
|
||||||
url_for("task_orders.create", portfolio_id=portfolio.id), data={"number": ""}
|
url_for("task_orders.update", portfolio_id=portfolio.id), data={"number": ""}
|
||||||
)
|
)
|
||||||
assert response.status_code == 200
|
assert response.status_code == 200
|
||||||
assert num_task_orders == len(portfolio.task_orders)
|
assert num_task_orders == len(portfolio.task_orders)
|
||||||
@ -78,7 +78,9 @@ def test_task_order_form_shows_errors(client, user_session, task_order):
|
|||||||
funding_data.update({"clin_01": "one milllllion dollars"})
|
funding_data.update({"clin_01": "one milllllion dollars"})
|
||||||
|
|
||||||
response = client.post(
|
response = client.post(
|
||||||
url_for("task_orders.update", screen=2, task_order_id=task_order.id),
|
url_for(
|
||||||
|
"task_orders.update", portfolio_id=portfolio.id, task_order_id=task_order.id
|
||||||
|
),
|
||||||
data=funding_data,
|
data=funding_data,
|
||||||
follow_redirects=False,
|
follow_redirects=False,
|
||||||
)
|
)
|
||||||
|
@ -477,7 +477,7 @@ def test_task_orders_download_task_order_pdf_access(get_url_assert_status, monke
|
|||||||
get_url_assert_status(rando, url, 404)
|
get_url_assert_status(rando, url, 404)
|
||||||
|
|
||||||
|
|
||||||
# task_orders.new
|
# task_orders.edit
|
||||||
@pytest.mark.skip(reason="Update after new TO form implemented")
|
@pytest.mark.skip(reason="Update after new TO form implemented")
|
||||||
def test_task_orders_new_access(get_url_assert_status):
|
def test_task_orders_new_access(get_url_assert_status):
|
||||||
ccpo = user_with(PermissionSets.EDIT_PORTFOLIO_FUNDING)
|
ccpo = user_with(PermissionSets.EDIT_PORTFOLIO_FUNDING)
|
||||||
@ -485,7 +485,7 @@ def test_task_orders_new_access(get_url_assert_status):
|
|||||||
rando = user_with()
|
rando = user_with()
|
||||||
portfolio = PortfolioFactory.create(owner=owner)
|
portfolio = PortfolioFactory.create(owner=owner)
|
||||||
|
|
||||||
url = url_for("task_orders.new", portfolio_id=portfolio.id)
|
url = url_for("task_orders.edit", portfolio_id=portfolio.id)
|
||||||
get_url_assert_status(owner, url, 200)
|
get_url_assert_status(owner, url, 200)
|
||||||
get_url_assert_status(ccpo, url, 200)
|
get_url_assert_status(ccpo, url, 200)
|
||||||
get_url_assert_status(rando, url, 404)
|
get_url_assert_status(rando, url, 404)
|
||||||
@ -535,21 +535,23 @@ def test_task_orders_update_access(post_url_assert_status):
|
|||||||
ccpo = user_with(PermissionSets.EDIT_PORTFOLIO_FUNDING)
|
ccpo = user_with(PermissionSets.EDIT_PORTFOLIO_FUNDING)
|
||||||
owner = user_with()
|
owner = user_with()
|
||||||
rando = user_with()
|
rando = user_with()
|
||||||
|
portfolio = PortfolioFactory.create(owner=owner)
|
||||||
|
|
||||||
url = url_for("task_orders.update", screen=1)
|
url = url_for("task_orders.update", portfolio_id=portfolio.id)
|
||||||
post_url_assert_status(owner, url, 200)
|
post_url_assert_status(owner, url, 200)
|
||||||
post_url_assert_status(ccpo, url, 200)
|
post_url_assert_status(ccpo, url, 200)
|
||||||
post_url_assert_status(rando, url, 200)
|
post_url_assert_status(rando, url, 200)
|
||||||
|
|
||||||
portfolio = PortfolioFactory.create(owner=owner)
|
|
||||||
task_order = TaskOrderFactory.create(portfolio=portfolio)
|
task_order = TaskOrderFactory.create(portfolio=portfolio)
|
||||||
|
|
||||||
url = url_for("task_orders.update", screen=2, task_order_id=task_order.id)
|
url = url_for(
|
||||||
|
"task_orders.update", portfolio_id=portfolio.id, task_order_id=task_order.id
|
||||||
|
)
|
||||||
post_url_assert_status(owner, url, 302)
|
post_url_assert_status(owner, url, 302)
|
||||||
post_url_assert_status(ccpo, url, 302)
|
post_url_assert_status(ccpo, url, 302)
|
||||||
post_url_assert_status(rando, url, 404)
|
post_url_assert_status(rando, url, 404)
|
||||||
|
|
||||||
url = url_for("task_orders.update", screen=1, portfolio_id=portfolio.id)
|
url = url_for("task_orders.update", portfolio_id=portfolio.id)
|
||||||
post_url_assert_status(owner, url, 302)
|
post_url_assert_status(owner, url, 302)
|
||||||
post_url_assert_status(ccpo, url, 302)
|
post_url_assert_status(ccpo, url, 302)
|
||||||
post_url_assert_status(rando, url, 404)
|
post_url_assert_status(rando, url, 404)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user