More validation fixes

This commit is contained in:
richard-dds 2018-10-23 14:42:05 -04:00
parent 4048f300f5
commit 6345a06e54
5 changed files with 61 additions and 33 deletions

View File

@ -17,12 +17,15 @@ class PENumberValidator(object):
re.X, re.X,
) )
def validate(self, request, pe_id): def validate(self, request, field):
if self._same_as_previous(request, pe_id): if field.errors:
return False
if self._same_as_previous(request, field.data):
return True return True
try: try:
PENumbers.get(pe_id) PENumbers.get(field.data)
except NotFoundError: except NotFoundError:
return False return False
@ -46,12 +49,27 @@ class PENumberValidator(object):
def _same_as_previous(self, request, pe_id): def _same_as_previous(self, request, pe_id):
return request.pe_number == pe_id return request.pe_number == pe_id
def _apply_error(self, field):
suggestion = self.pe_validator.suggest_pe_id(field.data)
error_str = (
"We couldn't find that PE number. {}"
"If you have double checked it you can submit anyway. "
"Your request will need to go through a manual review."
).format('Did you mean "{}"? '.format(suggestion) if suggestion else "")
field.errors += (error_str,)
field.errors = list(field.errors)
class TaskOrderNumberValidator(object): class TaskOrderNumberValidator(object):
def validate(self, task_order_number): def validate(self, field):
try: try:
TaskOrders.get(task_order_number) TaskOrders.get(field.data)
except NotFoundError: except NotFoundError:
self._apply_error(field)
return False return False
return True return True
def _apply_error(self, field):
field.errors += ("Task Order number not found",)
field.errors = list(field.errors)

View File

@ -33,8 +33,6 @@ def coerce_choice(val):
class DraftValidateMixin(object): class DraftValidateMixin(object):
def validate_draft(self): def validate_draft(self):
""" """
Another stupid workaround. Maybe there isn't a better way.
Make all fields optional before validation, and then return them to Make all fields optional before validation, and then return them to
their previous state. their previous state.
""" """
@ -50,6 +48,19 @@ class DraftValidateMixin(object):
class TaskOrderForm(ValidatedForm, DraftValidateMixin): class TaskOrderForm(ValidatedForm, DraftValidateMixin):
def do_validate_number(self):
for field in self:
if field.name != "task_order-number":
field.validators.insert(0, Optional())
valid = super().validate()
for field in self:
if field.name != "task_order-number":
field.validators.pop(0)
return valid
number = StringField( number = StringField(
"Task Order Number associated with this request", "Task Order Number associated with this request",
description="Include the original Task Order number (including the 000X at the end). Do not include any modification numbers. Note that there may be a lag between approving a task order and when it becomes available in our system.", description="Include the original Task Order number (including the 000X at the end). Do not include any modification numbers. Note that there may be a lag between approving a task order and when it becomes available in our system.",
@ -185,6 +196,9 @@ class FinancialVerificationForm(ValidatedForm):
request = FormField(RequestFinancialVerificationForm) request = FormField(RequestFinancialVerificationForm)
def validate(self, *args, **kwargs): 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": if self.task_order.funding_type.data == "OTHER":
self.task_order.funding_type_other.validators.append(InputRequired()) self.task_order.funding_type_other.validators.append(InputRequired())
@ -205,7 +219,9 @@ class FinancialVerificationForm(ValidatedForm):
Called do_validate_request to avoid being considered an inline Called do_validate_request to avoid being considered an inline
validator by wtforms. validator by wtforms.
""" """
return self.request.validate(self) request_valid = self.request.validate(self)
task_order_valid = self.task_order.do_validate_number()
return request_valid and task_order_valid
def validate_draft(self): def validate_draft(self):
return self.task_order.validate_draft() and self.request.validate_draft() return self.task_order.validate_draft() and self.request.validate_draft()

View File

@ -61,7 +61,7 @@ class FinancialVerificationBase(object):
return attachment return attachment
def _try_create_task_order(self, form, attachment): def _try_create_task_order(self, form, attachment, is_extended):
task_order_number = form.task_order.number.data task_order_number = form.task_order.number.data
if not task_order_number: if not task_order_number:
return None return None
@ -83,7 +83,10 @@ class FinancialVerificationBase(object):
except NotFoundError: except NotFoundError:
pass pass
return TaskOrders.create(**task_order_data) if is_extended:
return TaskOrders.create(**task_order_data)
else:
return None
def _apply_pe_number_error(self, field): def _apply_pe_number_error(self, field):
suggestion = self.pe_validator.suggest_pe_id(field.data) suggestion = self.pe_validator.suggest_pe_id(field.data)
@ -93,9 +96,11 @@ class FinancialVerificationBase(object):
"Your request will need to go through a manual review." "Your request will need to go through a manual review."
).format('Did you mean "{}"? '.format(suggestion) if suggestion else "") ).format('Did you mean "{}"? '.format(suggestion) if suggestion else "")
field.errors += (error_str,) field.errors += (error_str,)
field.errors = list(field.errors)
def _apply_task_order_number_error(self, field): def _apply_task_order_number_error(self, field):
field.errors += ("Task Order number not found",) field.errors += ("Task Order number not found",)
field.errors = list(field.errors)
def _raise(self, form): def _raise(self, form):
form.reset() form.reset()
@ -139,22 +144,17 @@ class UpdateFinancialVerification(FinancialVerificationBase):
attachment = self._process_attachment(self.is_extended, form) attachment = self._process_attachment(self.is_extended, form)
if self.is_extended: if not form.validate(is_extended=self.is_extended, has_attachment=attachment):
if not form.validate(has_attachment=attachment): should_update = False
should_update = False
else:
should_update = form.do_validate_request()
if not self.pe_validator.validate(self.request, form.pe_id.data): if not self.pe_validator.validate(self.request, form.pe_id):
self._apply_pe_number_error(form.pe_id)
should_submit = False should_submit = False
if not self.task_order_validator.validate(form.task_order_number.data): if not self.task_order_validator.validate(form.task_order.number):
self._apply_task_order_number_error(form.task_order_number)
should_submit = False should_submit = False
if should_update: if should_update:
task_order = self._try_create_task_order(form, attachment) task_order = self._try_create_task_order(form, attachment, self.is_extended)
updated_request = Requests.update_financial_verification( updated_request = Requests.update_financial_verification(
self.request.id, form.request.data, task_order=task_order self.request.id, form.request.data, task_order=task_order
) )
@ -188,20 +188,14 @@ class SaveFinancialVerificationDraft(FinancialVerificationBase):
if not form.validate_draft(): if not form.validate_draft():
self._raise(form) self._raise(form)
if form.pe_id.data and not self.pe_validator.validate( if not self.pe_validator.validate(self.request, form.pe_id):
self.request, form.pe_id.data
):
valid = False valid = False
self._apply_pe_number_error(form.pe_id)
if form.task_order_number.data and not self.task_order_validator.validate( if form.task_order.number.data and not self.task_order_validator.validate(form.task_order.number):
form.task_order_number.data
):
valid = False valid = False
self._apply_task_order_number_error(form.task_order_number)
attachment = self._process_attachment(self.is_extended, form) attachment = self._process_attachment(self.is_extended, form)
task_order = self._try_create_task_order(form, attachment) task_order = self._try_create_task_order(form, attachment, self.is_extended)
updated_request = Requests.update_financial_verification( updated_request = Requests.update_financial_verification(
self.request.id, form.request.data, task_order=task_order self.request.id, form.request.data, task_order=task_order
) )

View File

@ -18,7 +18,7 @@
{% if paragraph %}paragraph='true'{% endif %} {% if paragraph %}paragraph='true'{% endif %}
{% if noMaxWidth %}no-max-width='true'{% endif %} {% if noMaxWidth %}no-max-width='true'{% endif %}
{% if initial_value or field.data is not none %}initial-value='{{ initial_value or field.data }}'{% endif %} {% if initial_value or field.data is not none %}initial-value='{{ initial_value or field.data }}'{% endif %}
{% if field.errors %}v-bind:initial-errors='{{ field.errors }}'{% endif %} {% if field.errors %}v-bind:initial-errors='{{ field.errors | list }}'{% endif %}
key='{{ field.name }}' key='{{ field.name }}'
inline-template> inline-template>

View File

@ -328,14 +328,14 @@ def test_get_fv_form_route(client, user_session, fv_data):
assert response.status_code == 200 assert response.status_code == 200
def test_manual_task_order_triggers_extended_form(client, user_session, fv_data): def test_manual_task_order_triggers_extended_form(client, user_session, fv_data, e_fv_data):
user = UserFactory.create() user = UserFactory.create()
request = RequestFactory.create(creator=user) request = RequestFactory.create(creator=user)
data = {**fv_data, "task_order-number": "DCA10096D0053"} data = {**fv_data, **e_fv_data, "task_order-number": "DCA10096D0053"}
UpdateFinancialVerification( UpdateFinancialVerification(
TrueValidator, TrueValidator, user, request, data, is_extended=False TrueValidator, TrueValidator, user, request, data, is_extended=True
).execute() ).execute()
user_session(user) user_session(user)