From d7b86491ae8ec993fdf46acac3226df5e732d5ac Mon Sep 17 00:00:00 2001 From: leigh-mil Date: Thu, 5 Sep 2019 11:53:25 -0400 Subject: [PATCH] Validate PoP dates against contract dates config on the backend --- atst/forms/task_order.py | 27 ++++++++++++++++++++++++--- tests/forms/test_task_order.py | 33 +++++++++++++++++++++++++++++++++ 2 files changed, 57 insertions(+), 3 deletions(-) diff --git a/atst/forms/task_order.py b/atst/forms/task_order.py index bd2a8f77..7a503e48 100644 --- a/atst/forms/task_order.py +++ b/atst/forms/task_order.py @@ -9,11 +9,13 @@ from wtforms.fields import ( from wtforms.fields.html5 import DateField from wtforms.validators import Required, Optional, Length from flask_wtf import FlaskForm +from datetime import datetime from .data import JEDI_CLIN_TYPES from .fields import SelectField from .forms import BaseForm from atst.utils.localization import translate +from flask import current_app as app def coerce_enum(enum_inst): @@ -52,6 +54,13 @@ class CLINForm(FlaskForm): def validate(self, *args, **kwargs): valid = super().validate(*args, **kwargs) + CONTRACT_START_DATE = datetime.strptime( + app.config.get("CONTRACT_START_DATE"), "%Y-%m-%d" + ).date() + CONTRACT_END_DATE = datetime.strptime( + app.config.get("CONTRACT_END_DATE"), "%Y-%m-%d" + ).date() + if ( self.start_date.data and self.end_date.data @@ -60,9 +69,21 @@ class CLINForm(FlaskForm): self.start_date.errors.append( translate("forms.task_order.start_date_error") ) - return False - else: - return valid + valid = False + + if self.start_date.data and self.start_date.data <= CONTRACT_START_DATE: + self.start_date.errors.append( + "PoP start date must be on or after {}.".format(CONTRACT_START_DATE) + ) + valid = False + + if self.end_date.data and self.end_date.data >= CONTRACT_END_DATE: + self.end_date.errors.append( + "PoP end date must be before or on {}.".format(CONTRACT_END_DATE) + ) + valid = False + + return valid class AttachmentForm(BaseForm): diff --git a/tests/forms/test_task_order.py b/tests/forms/test_task_order.py index d9ba3080..c9b99814 100644 --- a/tests/forms/test_task_order.py +++ b/tests/forms/test_task_order.py @@ -1,4 +1,6 @@ import datetime +from dateutil.relativedelta import relativedelta +from flask import current_app as app from atst.forms.task_order import CLINForm from atst.models import JEDICLINType @@ -30,3 +32,34 @@ def test_clin_form_start_date_before_end_date(): ) valid_clin_form = CLINForm(obj=valid_clin) assert valid_clin_form.validate() + + +def test_clin_form_pop_dates_within_contract_dates(): + CONTRACT_START_DATE = datetime.datetime.strptime( + app.config.get("CONTRACT_START_DATE"), "%Y-%m-%d" + ).date() + CONTRACT_END_DATE = datetime.datetime.strptime( + app.config.get("CONTRACT_END_DATE"), "%Y-%m-%d" + ).date() + + invalid_start = CONTRACT_START_DATE - relativedelta(months=1) + invalid_end = CONTRACT_END_DATE + relativedelta(months=1) + invalid_clin = factories.CLINFactory.create( + start_date=invalid_start, end_date=invalid_end + ) + clin_form = CLINForm(obj=invalid_clin) + assert not clin_form.validate() + assert ( + "PoP start date must be on or after {}.".format(CONTRACT_START_DATE) + ) in clin_form.start_date.errors + assert ( + "PoP end date must be before or on {}.".format(CONTRACT_END_DATE) + ) in clin_form.end_date.errors + + valid_start = CONTRACT_START_DATE + relativedelta(months=1) + valid_end = CONTRACT_END_DATE - relativedelta(months=1) + valid_clin = factories.CLINFactory.create( + start_date=valid_start, end_date=valid_end + ) + valid_clin_form = CLINForm(obj=valid_clin) + assert valid_clin_form.validate()