Add validator to TO number input and add cancel button to form

This commit is contained in:
leigh-mil 2019-06-03 13:24:37 -04:00 committed by Montana
parent d7d239d406
commit 0a2d241dc4
5 changed files with 132 additions and 95 deletions

View File

@ -1,4 +1,4 @@
from flask import g, render_template, request as http_request
from flask import g, redirect, render_template, request as http_request, url_for
from . import task_orders_bp
from atst.domain.authz.decorator import user_can_access_decorator as user_can
@ -11,7 +11,14 @@ from atst.utils.flash import formatted_flash as flash
@task_orders_bp.route("/portfolios/<portfolio_id>/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.html", form=TaskOrderForm())
cancel_url = (
http_request.referrer
if http_request.referrer
else url_for("task_orders.portfolio_funding", portfolio_id=portfolio_id)
)
return render_template(
"task_orders/new.html", form=TaskOrderForm(), cancel_url=cancel_url
)
@task_orders_bp.route("/portfolios/<portfolio_id>/task_orders/new", methods=["POST"])
@ -19,22 +26,32 @@ def new(portfolio_id):
def create(portfolio_id):
form_data = http_request.form
form = TaskOrderForm(form_data)
# todo: add in better error handling for dupe TO numbers
if form.validate():
TaskOrders.create(g.current_user, portfolio_id, **form.data)
task_order = TaskOrders.create(g.current_user, portfolio_id, **form.data)
flash("task_order_draft")
return render_template("task_orders/new.html", form=form)
return redirect(
url_for(
"task_orders.edit",
portfolio_id=portfolio_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, taks_order_id):
return render_template("task_orders/edit", form=TaskOrderForm())
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"]
)
@ -49,4 +66,4 @@ def update(portfolio_id, task_order_id=None):
return render_template("task_orders/new.html", form=form)
else:
flash("form_errors")
return render_template("task_orders/new.html", form=form)
return render_template("task_orders/edit.html", form=form)

View File

@ -9,36 +9,6 @@ export default {
unmask: [],
validationError: 'Please enter a response',
},
requiredField: {
mask: false,
match: /.+/,
unmask: [],
validationError: 'This field is required',
},
integer: {
mask: createNumberMask({ prefix: '', allowDecimal: false }),
match: /^[1-9]\d*$/,
unmask: [','],
validationError: 'Please enter a number',
},
dollars: {
mask: createNumberMask({ prefix: '$', allowDecimal: true }),
match: /^-?\d+\.?\d*$/,
unmask: ['$', ','],
validationError: 'Please enter a dollar amount',
},
gigabytes: {
mask: createNumberMask({ prefix: '', suffix: ' GB', allowDecimal: false }),
match: /^[1-9]\d*$/,
unmask: [',', ' GB'],
validationError: 'Please enter an amount of data in gigabytes',
},
email: {
mask: emailMask,
match: /^.+@[^.].*\.[a-z]{2,10}$/,
unmask: [],
validationError: 'Please enter a valid e-mail address',
},
date: {
mask: [/\d/, /\d/, '/', /\d/, /\d/, '/', /\d/, /\d/, /\d/, /\d/],
match: /(0[1-9]|1[012])[- \/.](0[1-9]|[12][0-9]|3[01])[- \/.](19|20)\d\d/,
@ -47,6 +17,65 @@ export default {
keepCharPositions: true,
validationError: 'Please enter a valid date in the form MM/DD/YYYY',
},
dodId: {
mask: createNumberMask({
prefix: '',
allowDecimal: false,
allowLeadingZeroes: true,
includeThousandsSeparator: false,
}),
match: /^\d{10}$/,
unmask: [],
validationError: 'Please enter a 10-digit DoD ID number',
},
dollars: {
mask: createNumberMask({ prefix: '$', allowDecimal: true }),
match: /^-?\d+\.?\d*$/,
unmask: ['$', ','],
validationError: 'Please enter a dollar amount',
},
email: {
mask: emailMask,
match: /^.+@[^.].*\.[a-z]{2,10}$/,
unmask: [],
validationError: 'Please enter a valid e-mail address',
},
integer: {
mask: createNumberMask({ prefix: '', allowDecimal: false }),
match: /^[1-9]\d*$/,
unmask: [','],
validationError: 'Please enter a number',
},
phoneExt: {
mask: createNumberMask({
prefix: '',
allowDecimal: false,
integerLimit: 10,
allowLeadingZeroes: true,
includeThousandsSeparator: false,
}),
match: /^\d{0,10}$/,
unmask: [],
validationError: 'Optional: Please enter up to 10 digits',
},
portfolioName: {
mask: false,
match: /^.{4,100}$/,
unmask: [],
validationError: 'Portfolio names can be between 4-100 characters',
},
requiredField: {
mask: false,
match: /.+/,
unmask: [],
validationError: 'This field is required',
},
taskOrderNumber: {
mask: false,
match: /^.{10}$/,
unmask: [],
validationError: 'TO number must be 10 digits',
},
usPhone: {
mask: [
'(',
@ -68,59 +97,4 @@ export default {
unmask: ['(', ')', '-', ' '],
validationError: 'Please enter a 10-digit phone number',
},
phoneExt: {
mask: createNumberMask({
prefix: '',
allowDecimal: false,
integerLimit: 10,
allowLeadingZeroes: true,
includeThousandsSeparator: false,
}),
match: /^\d{0,10}$/,
unmask: [],
validationError: 'Optional: Please enter up to 10 digits',
},
dodId: {
mask: createNumberMask({
prefix: '',
allowDecimal: false,
allowLeadingZeroes: true,
includeThousandsSeparator: false,
}),
match: /^\d{10}$/,
unmask: [],
validationError: 'Please enter a 10-digit DoD ID number',
},
peNumber: {
mask: false,
match: /(0\d)(0\d)(\d{3})([a-z,A-Z]{1,3})/,
unmask: ['_'],
validationError:
'Please enter a valid PE number. Note that it should be 7 digits followed by 1-3 letters, and should have a zero as the first and third digits.',
},
treasuryCode: {
mask: createNumberMask({
prefix: '',
allowDecimal: false,
allowLeadingZeroes: true,
includeThousandsSeparator: false,
}),
match: /^0*([1-9]{4}|[1-9]{6})$/,
unmask: [],
validationError:
'Please enter a valid Program Treasury Code. Note that it should be a four digit or six digit number, optionally prefixed by one or more zeros.',
},
baCode: {
mask: false,
match: /[0-9]{2}\w?$/,
unmask: [],
validationError:
'Please enter a valid BA Code. Note that it should be two digits, followed by an optional letter.',
},
portfolioName: {
mask: false,
match: /^.{4,100}$/,
unmask: [],
validationError: 'Portfolio names can be between 4-100 characters',
},
}

View File

@ -0,0 +1,30 @@
{% 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>
{{ 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 %}

View File

@ -16,12 +16,18 @@
<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) }}
{{ TextInput(form.number, validation='taskOrderNumber') }}
</div>
</form>
</base-form>

View File

@ -45,8 +45,18 @@ def test_task_orders_create(client, user_session, portfolio):
url_for("task_orders.create", portfolio_id=portfolio.id),
data={"number": "0123456789"},
)
assert response.status_code == 302
def test_task_orders_create_invalid_data(client, user_session, portfolio):
user_session(portfolio.owner)
num_task_orders = len(portfolio.task_orders)
response = client.post(
url_for("task_orders.create", portfolio_id=portfolio.id), data={"number": ""}
)
assert response.status_code == 200
assert translate("task_orders.form.draft_alert_message") in response.data.decode()
assert num_task_orders == len(portfolio.task_orders)
assert "There were some errors" in response.data.decode()
def test_task_orders_edit():