Merge pull request #596 from dod-ccpo/validate-email-on-task-order-forms
Validate email on task order forms
This commit is contained in:
commit
f0f401daf1
@ -1,7 +1,7 @@
|
|||||||
from flask_wtf import FlaskForm
|
from flask_wtf import FlaskForm
|
||||||
from wtforms.fields import StringField
|
from wtforms.fields import StringField
|
||||||
from wtforms.fields.html5 import TelField
|
from wtforms.fields.html5 import TelField
|
||||||
from wtforms.validators import Length, Optional
|
from wtforms.validators import Email, Length, Optional
|
||||||
|
|
||||||
from atst.forms.validators import IsNumber, PhoneNumber
|
from atst.forms.validators import IsNumber, PhoneNumber
|
||||||
|
|
||||||
@ -12,7 +12,7 @@ from .fields import FormFieldWrapper
|
|||||||
class OfficerForm(FlaskForm):
|
class OfficerForm(FlaskForm):
|
||||||
first_name = StringField("First Name")
|
first_name = StringField("First Name")
|
||||||
last_name = StringField("Last Name")
|
last_name = StringField("Last Name")
|
||||||
email = StringField("Email")
|
email = StringField("Email", validators=[Optional(), Email()])
|
||||||
phone_number = TelField("Phone Number", validators=[PhoneNumber()])
|
phone_number = TelField("Phone Number", validators=[PhoneNumber()])
|
||||||
dod_id = StringField("DoD ID", validators=[Optional(), Length(min=10), IsNumber()])
|
dod_id = StringField("DoD ID", validators=[Optional(), Length(min=10), IsNumber()])
|
||||||
|
|
||||||
|
@ -10,7 +10,7 @@ from wtforms.fields import (
|
|||||||
)
|
)
|
||||||
from wtforms.fields.html5 import DateField, TelField
|
from wtforms.fields.html5 import DateField, TelField
|
||||||
from wtforms.widgets import ListWidget, CheckboxInput
|
from wtforms.widgets import ListWidget, CheckboxInput
|
||||||
from wtforms.validators import Length, Required, Optional
|
from wtforms.validators import Email, Length, Required, Optional
|
||||||
from flask_wtf.file import FileAllowed
|
from flask_wtf.file import FileAllowed
|
||||||
|
|
||||||
from atst.forms.validators import IsNumber, PhoneNumber, RequiredIf
|
from atst.forms.validators import IsNumber, PhoneNumber, RequiredIf
|
||||||
@ -132,7 +132,10 @@ class OversightForm(CacheableForm):
|
|||||||
translate("forms.task_order.oversight_first_name_label")
|
translate("forms.task_order.oversight_first_name_label")
|
||||||
)
|
)
|
||||||
ko_last_name = StringField(translate("forms.task_order.oversight_last_name_label"))
|
ko_last_name = StringField(translate("forms.task_order.oversight_last_name_label"))
|
||||||
ko_email = StringField(translate("forms.task_order.oversight_email_label"))
|
ko_email = StringField(
|
||||||
|
translate("forms.task_order.oversight_email_label"),
|
||||||
|
validators=[Optional(), Email()],
|
||||||
|
)
|
||||||
ko_phone_number = TelField(
|
ko_phone_number = TelField(
|
||||||
translate("forms.task_order.oversight_phone_label"),
|
translate("forms.task_order.oversight_phone_label"),
|
||||||
validators=[Optional(), PhoneNumber()],
|
validators=[Optional(), PhoneNumber()],
|
||||||
@ -151,7 +154,10 @@ class OversightForm(CacheableForm):
|
|||||||
translate("forms.task_order.oversight_first_name_label")
|
translate("forms.task_order.oversight_first_name_label")
|
||||||
)
|
)
|
||||||
cor_last_name = StringField(translate("forms.task_order.oversight_last_name_label"))
|
cor_last_name = StringField(translate("forms.task_order.oversight_last_name_label"))
|
||||||
cor_email = StringField(translate("forms.task_order.oversight_email_label"))
|
cor_email = StringField(
|
||||||
|
translate("forms.task_order.oversight_email_label"),
|
||||||
|
validators=[Optional(), Email()],
|
||||||
|
)
|
||||||
cor_phone_number = TelField(
|
cor_phone_number = TelField(
|
||||||
translate("forms.task_order.oversight_phone_label"),
|
translate("forms.task_order.oversight_phone_label"),
|
||||||
validators=[
|
validators=[
|
||||||
@ -176,7 +182,10 @@ class OversightForm(CacheableForm):
|
|||||||
translate("forms.task_order.oversight_first_name_label")
|
translate("forms.task_order.oversight_first_name_label")
|
||||||
)
|
)
|
||||||
so_last_name = StringField(translate("forms.task_order.oversight_last_name_label"))
|
so_last_name = StringField(translate("forms.task_order.oversight_last_name_label"))
|
||||||
so_email = StringField(translate("forms.task_order.oversight_email_label"))
|
so_email = StringField(
|
||||||
|
translate("forms.task_order.oversight_email_label"),
|
||||||
|
validators=[Optional(), Email()],
|
||||||
|
)
|
||||||
so_phone_number = TelField(
|
so_phone_number = TelField(
|
||||||
translate("forms.task_order.oversight_phone_label"),
|
translate("forms.task_order.oversight_phone_label"),
|
||||||
validators=[Optional(), PhoneNumber()],
|
validators=[Optional(), PhoneNumber()],
|
||||||
|
@ -13,7 +13,7 @@
|
|||||||
|
|
||||||
<div class='form-row'>
|
<div class='form-row'>
|
||||||
<div class='form-col form-col--half'>
|
<div class='form-col form-col--half'>
|
||||||
{{ TextInput(email, placeholder='name@mail.mil') }}
|
{{ TextInput(email, placeholder='name@mail.mil', validation='email') }}
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class='form-col form-col--half'>
|
<div class='form-col form-col--half'>
|
||||||
|
@ -28,7 +28,7 @@
|
|||||||
|
|
||||||
<div class='form-row'>
|
<div class='form-row'>
|
||||||
<div class='form-col form-col--half'>
|
<div class='form-col form-col--half'>
|
||||||
{{ TextInput(form.email, placeholder='name@mail.mil') }}
|
{{ TextInput(form.email, placeholder='name@mail.mil', validation='email') }}
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class='form-col form-col--half'>
|
<div class='form-col form-col--half'>
|
||||||
|
@ -54,3 +54,10 @@ class TestEditTaskOrderOfficersForm:
|
|||||||
form.populate_obj(task_order)
|
form.populate_obj(task_order)
|
||||||
assert task_order.so_first_name == data["security_officer-first_name"]
|
assert task_order.so_first_name == data["security_officer-first_name"]
|
||||||
assert task_order.so_last_name == data["security_officer-last_name"]
|
assert task_order.so_last_name == data["security_officer-last_name"]
|
||||||
|
|
||||||
|
def test_email_validation(self):
|
||||||
|
data = {"contracting_officer-email": "not_really_an_email_address"}
|
||||||
|
formdata = ImmutableMultiDict(data)
|
||||||
|
form = EditTaskOrderOfficersForm(formdata)
|
||||||
|
assert not form.validate()
|
||||||
|
assert form.contracting_officer.email.errors == ["Invalid email address."]
|
||||||
|
@ -122,6 +122,26 @@ def test_task_order_form_shows_errors(client, user_session):
|
|||||||
assert "Not a valid decimal" in body
|
assert "Not a valid decimal" in body
|
||||||
|
|
||||||
|
|
||||||
|
def test_task_order_validates_email_address(client, user_session):
|
||||||
|
to = task_order()
|
||||||
|
creator = to.creator
|
||||||
|
user_session(creator)
|
||||||
|
|
||||||
|
task_order_data = TaskOrderFactory.dictionary()
|
||||||
|
oversight_data = slice_data_for_section(task_order_data, "oversight")
|
||||||
|
oversight_data.update({"ko_email": "not an email"})
|
||||||
|
|
||||||
|
response = client.post(
|
||||||
|
url_for("task_orders.update", screen=3, task_order_id=to.id),
|
||||||
|
data=oversight_data,
|
||||||
|
follow_redirects=False,
|
||||||
|
)
|
||||||
|
|
||||||
|
body = response.data.decode()
|
||||||
|
assert "There were some errors" in body
|
||||||
|
assert "Invalid email" in body
|
||||||
|
|
||||||
|
|
||||||
@pytest.fixture
|
@pytest.fixture
|
||||||
def task_order():
|
def task_order():
|
||||||
user = UserFactory.create()
|
user = UserFactory.create()
|
||||||
|
Loading…
x
Reference in New Issue
Block a user