From e4ca0270655223fb85885f2241b1ff6d8681fd43 Mon Sep 17 00:00:00 2001 From: leigh-mil Date: Thu, 5 Sep 2019 11:25:14 -0400 Subject: [PATCH 1/8] Validate CLIN PoP against configurable contract start and end dates --- config/base.ini | 2 + js/components/clin_fields.js | 63 +++++++++++++++++++++++++------ templates/task_orders/step_3.html | 12 ++---- 3 files changed, 57 insertions(+), 20 deletions(-) diff --git a/config/base.ini b/config/base.ini index 1d4461b8..c034cc7a 100644 --- a/config/base.ini +++ b/config/base.ini @@ -2,6 +2,8 @@ CAC_URL = http://localhost:8000/login-redirect CA_CHAIN = ssl/server-certs/ca-chain.pem CLASSIFIED = false +CONTRACT_START_DATE = 2019-09-14 +CONTRACT_END_DATE = 2022-09-14 COOKIE_SECRET = some-secret-please-replace DISABLE_CRL_CHECK = false CRL_FAIL_OPEN = false diff --git a/js/components/clin_fields.js b/js/components/clin_fields.js index acf45d09..72da4b71 100644 --- a/js/components/clin_fields.js +++ b/js/components/clin_fields.js @@ -1,3 +1,5 @@ +import * as R from 'ramda' + import DateSelector from './date_selector' import { emitEvent } from '../lib/emitters' import Modal from '../mixins/modal' @@ -9,6 +11,12 @@ const END_DATE = 'end_date' const POP = 'period_of_performance' const NUMBER = 'number' +const fs = require('fs') +const ini = require('ini') +const config = ini.parse(fs.readFileSync('./config/base.ini', 'utf-8')) +const CONTRACT_START_DATE = new Date(config.default.CONTRACT_START_DATE) +const CONTRACT_END_DATE = new Date(config.default.CONTRACT_END_DATE) + export default { name: 'clin-fields', @@ -44,7 +52,6 @@ export default { ? new Date(this.initialEndDate) : undefined const popValidation = !this.initialStartDate ? false : start < end - const showPopValidation = !this.initialStartDate ? false : !popValidation const clinNumber = !!this.initialClinNumber ? this.initialClinNumber : undefined @@ -54,9 +61,22 @@ export default { startDate: start, endDate: end, popValid: popValidation, - showPopError: showPopValidation, clinNumber: clinNumber, - showClin: true, + popErrors: [], + validations: [ + { + func: this.popDateOrder, + message: 'PoP start date must be before end date.', + }, + { + func: this.popStartsAfterContract, + message: `PoP start date must be on or after ${CONTRACT_START_DATE}.`, + }, + { + func: this.popEndsBeforeContract, + message: `PoP end date must be before or on ${CONTRACT_END_DATE}.`, + }, + ], } }, @@ -74,20 +94,41 @@ export default { methods: { checkPopValid: function() { - return this.startDate < this.endDate + return ( + this.popDateOrder() && + this.popStartsAfterContract() && + this.popEndsBeforeContract() + ) }, validatePop: function() { - if (!!this.startDate && !!this.endDate) { - // only want to update popValid and showPopError if both dates are filled in - this.popValid = this.checkPopValid() - this.showPopError = !this.popValid - } - + this.popValid = this.checkPopValid() emitEvent('field-change', this, { name: 'clins-' + this.clinIndex + '-' + POP, - valid: this.checkPopValid(), + valid: this.popValid, }) + + this.popErrors = R.pipe( + R.map(validation => + !validation.func() ? validation.message : undefined + ), + R.filter(Boolean) + )(this.validations) + }, + + popStartsAfterContract: function() { + return this.startDate >= CONTRACT_START_DATE + }, + + popEndsBeforeContract: function() { + return this.endDate <= CONTRACT_END_DATE + }, + + popDateOrder: function() { + if (!!this.startDate && !!this.endDate) { + return this.startDate < this.endDate + } + return true }, handleFieldChange: function(event) { diff --git a/templates/task_orders/step_3.html b/templates/task_orders/step_3.html index 1d86a672..3b2bfe0b 100644 --- a/templates/task_orders/step_3.html +++ b/templates/task_orders/step_3.html @@ -314,15 +314,9 @@ {% endif %}
-

- -

+
+
+
From d7b86491ae8ec993fdf46acac3226df5e732d5ac Mon Sep 17 00:00:00 2001 From: leigh-mil Date: Thu, 5 Sep 2019 11:53:25 -0400 Subject: [PATCH 2/8] 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() From 2efd2c968d84053b5acf1c18ba8e3d6c11c72910 Mon Sep 17 00:00:00 2001 From: leigh-mil Date: Thu, 5 Sep 2019 14:13:28 -0400 Subject: [PATCH 3/8] Use translations and make errors look pretty --- atst/forms/task_order.py | 12 +++++++++--- js/components/clin_fields.js | 9 +++++++-- package.json | 1 + templates/task_orders/step_3.html | 4 ++-- tests/forms/test_task_order.py | 15 ++++++++++++--- translations.yaml | 5 ++++- 6 files changed, 35 insertions(+), 11 deletions(-) diff --git a/atst/forms/task_order.py b/atst/forms/task_order.py index 7a503e48..e933d139 100644 --- a/atst/forms/task_order.py +++ b/atst/forms/task_order.py @@ -67,19 +67,25 @@ class CLINForm(FlaskForm): and self.start_date.data > self.end_date.data ): self.start_date.errors.append( - translate("forms.task_order.start_date_error") + translate("forms.task_order.pop_errors.date_order") ) 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) + translate( + "forms.task_order.pop_errors.start", + {"date": CONTRACT_START_DATE.strftime("%b %d, %Y")}, + ) ) 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) + translate( + "forms.task_order.pop_errors.end", + {"date": CONTRACT_END_DATE.strftime("%b %d, %Y")}, + ) ) valid = False diff --git a/js/components/clin_fields.js b/js/components/clin_fields.js index 72da4b71..22faeabe 100644 --- a/js/components/clin_fields.js +++ b/js/components/clin_fields.js @@ -1,4 +1,5 @@ import * as R from 'ramda' +import moment from 'moment' import DateSelector from './date_selector' import { emitEvent } from '../lib/emitters' @@ -70,11 +71,15 @@ export default { }, { func: this.popStartsAfterContract, - message: `PoP start date must be on or after ${CONTRACT_START_DATE}.`, + message: `PoP start date must be on or after ${moment( + CONTRACT_START_DATE + ).format('MMM D, YYYY')}.`, }, { func: this.popEndsBeforeContract, - message: `PoP end date must be before or on ${CONTRACT_END_DATE}.`, + message: `PoP end date must be before or on ${moment( + CONTRACT_END_DATE + ).format('MMM D, YYYY')}.`, }, ], } diff --git a/package.json b/package.json index e5c95e60..0604d27e 100644 --- a/package.json +++ b/package.json @@ -18,6 +18,7 @@ "azure-storage": "^2.10.3", "babel-polyfill": "^6.26.0", "date-fns": "^1.29.0", + "moment": "^2.24.0", "ramda": "^0.25.0", "stickybits": "^3.6.6", "svg-innerhtml": "^1.1.0", diff --git a/templates/task_orders/step_3.html b/templates/task_orders/step_3.html index 3b2bfe0b..8c09f26f 100644 --- a/templates/task_orders/step_3.html +++ b/templates/task_orders/step_3.html @@ -314,8 +314,8 @@ {% endif %}
-
-
+
+

diff --git a/tests/forms/test_task_order.py b/tests/forms/test_task_order.py index c9b99814..506312fe 100644 --- a/tests/forms/test_task_order.py +++ b/tests/forms/test_task_order.py @@ -24,7 +24,10 @@ def test_clin_form_start_date_before_end_date(): ) clin_form = CLINForm(obj=invalid_clin) assert not clin_form.validate() - assert translate("forms.task_order.start_date_error") in clin_form.start_date.errors + assert ( + translate("forms.task_order.pop_errors.date_order") + in clin_form.start_date.errors + ) valid_start = datetime.date(2020, 1, 1) valid_end = datetime.date(2020, 12, 12) valid_clin = factories.CLINFactory.create( @@ -50,10 +53,16 @@ def test_clin_form_pop_dates_within_contract_dates(): clin_form = CLINForm(obj=invalid_clin) assert not clin_form.validate() assert ( - "PoP start date must be on or after {}.".format(CONTRACT_START_DATE) + translate( + "forms.task_order.pop_errors.start", + {"date": CONTRACT_START_DATE.strftime("%b %d, %Y")}, + ) ) in clin_form.start_date.errors assert ( - "PoP end date must be before or on {}.".format(CONTRACT_END_DATE) + translate( + "forms.task_order.pop_errors.end", + {"date": CONTRACT_END_DATE.strftime("%b %d, %Y")}, + ) ) in clin_form.end_date.errors valid_start = CONTRACT_START_DATE + relativedelta(months=1) diff --git a/translations.yaml b/translations.yaml index c7b5fcfb..9e94ac8a 100644 --- a/translations.yaml +++ b/translations.yaml @@ -197,9 +197,12 @@ forms: not_sure: 'Not sure, unsure if planning to develop natively in the cloud' not_sure_help: Not sure? Talk to your technical lead about where and how they plan on developing your application. number_description: Task order number (13 digits) + pop_errors: + date_order: PoP start date must be before end date. + end: PoP end date must be before or on {date}. + start: PoP start date must be on or after {date}. scope_description: 'What do you plan to do on the cloud? Some examples might include migrating an existing application or creating a prototype. You don’t need to include a detailed plan of execution, but should list key requirements. This section will be reviewed by your contracting officer, but won’t be sent to the CCPO.

Not sure how to describe your scope? Read some examples to get some inspiration.

' scope_label: Cloud project scope - start_date_error: PoP start date must be before end date. team_experience: built_1: Built, migrated, or consulted on 1-2 applications built_3: Built, migrated, or consulted on 3-5 applications From 2cefe93136863f2478122e73f77d4c59d08aadde Mon Sep 17 00:00:00 2001 From: leigh-mil Date: Fri, 6 Sep 2019 09:42:04 -0400 Subject: [PATCH 4/8] Use date-fns instead of moment --- js/components/clin_fields.js | 16 +++++++++------- package.json | 1 - 2 files changed, 9 insertions(+), 8 deletions(-) diff --git a/js/components/clin_fields.js b/js/components/clin_fields.js index 22faeabe..fa9bfcb0 100644 --- a/js/components/clin_fields.js +++ b/js/components/clin_fields.js @@ -1,5 +1,5 @@ import * as R from 'ramda' -import moment from 'moment' +import { format } from 'date-fns' import DateSelector from './date_selector' import { emitEvent } from '../lib/emitters' @@ -71,15 +71,17 @@ export default { }, { func: this.popStartsAfterContract, - message: `PoP start date must be on or after ${moment( - CONTRACT_START_DATE - ).format('MMM D, YYYY')}.`, + message: `PoP start date must be on or after ${format( + CONTRACT_START_DATE, + 'MMM D, YYYY' + )}.`, }, { func: this.popEndsBeforeContract, - message: `PoP end date must be before or on ${moment( - CONTRACT_END_DATE - ).format('MMM D, YYYY')}.`, + message: `PoP end date must be before or on ${format( + CONTRACT_END_DATE, + 'MMM D, YYYY' + )}.`, }, ], } diff --git a/package.json b/package.json index 0604d27e..e5c95e60 100644 --- a/package.json +++ b/package.json @@ -18,7 +18,6 @@ "azure-storage": "^2.10.3", "babel-polyfill": "^6.26.0", "date-fns": "^1.29.0", - "moment": "^2.24.0", "ramda": "^0.25.0", "stickybits": "^3.6.6", "svg-innerhtml": "^1.1.0", From d802a53db6c8c93530624e812bda4f87bb96e2dc Mon Sep 17 00:00:00 2001 From: leigh-mil Date: Fri, 6 Sep 2019 09:58:30 -0400 Subject: [PATCH 5/8] Only show contract date validation messages if the date has been completely filled in --- js/components/clin_fields.js | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/js/components/clin_fields.js b/js/components/clin_fields.js index fa9bfcb0..f9ac7acf 100644 --- a/js/components/clin_fields.js +++ b/js/components/clin_fields.js @@ -62,6 +62,8 @@ export default { startDate: start, endDate: end, popValid: popValidation, + startDateValid: false, + endDateValid: false, clinNumber: clinNumber, popErrors: [], validations: [ @@ -124,11 +126,17 @@ export default { }, popStartsAfterContract: function() { - return this.startDate >= CONTRACT_START_DATE + if (this.startDateValid) { + return this.startDate >= CONTRACT_START_DATE + } + return true }, popEndsBeforeContract: function() { - return this.endDate <= CONTRACT_END_DATE + if (this.endDateValid) { + return this.endDate <= CONTRACT_END_DATE + } + return true }, popDateOrder: function() { @@ -142,9 +150,11 @@ export default { if (this._uid === event.parent_uid) { if (event.name.includes(START_DATE)) { if (!!event.value) this.startDate = new Date(event.value) + if (!!event.valid) this.startDateValid = event.valid this.validatePop() } else if (event.name.includes(END_DATE)) { if (!!event.value) this.endDate = new Date(event.value) + if (!!event.valid) this.endDateValid = event.valid this.validatePop() } else if (event.name.includes(NUMBER)) { this.clinNumber = event.value From 6dea274c0a30a36b8c987f4a069397a624fb4978 Mon Sep 17 00:00:00 2001 From: leigh-mil Date: Mon, 9 Sep 2019 14:21:20 -0400 Subject: [PATCH 6/8] Put showClin back into data -- removing it messed up the removeClin function --- js/components/clin_fields.js | 1 + 1 file changed, 1 insertion(+) diff --git a/js/components/clin_fields.js b/js/components/clin_fields.js index f9ac7acf..6b164402 100644 --- a/js/components/clin_fields.js +++ b/js/components/clin_fields.js @@ -65,6 +65,7 @@ export default { startDateValid: false, endDateValid: false, clinNumber: clinNumber, + showClin: true, popErrors: [], validations: [ { From 3683c79ae0ecbcfeb3120648d55b7e46d8b007a3 Mon Sep 17 00:00:00 2001 From: leigh-mil Date: Mon, 9 Sep 2019 14:23:38 -0400 Subject: [PATCH 7/8] Use template args for the contract start and end date pointing to base.ini in the JS file resulted in the raw string content of base.ini to be in the JS bundle --- atst/routes/task_orders/new.py | 4 ++++ js/components/clin_fields.js | 26 ++++++++++++++++---------- templates/task_orders/step_3.html | 7 +++++-- translations.yaml | 2 +- 4 files changed, 26 insertions(+), 13 deletions(-) diff --git a/atst/routes/task_orders/new.py b/atst/routes/task_orders/new.py index c284d3f1..6ac3f4be 100644 --- a/atst/routes/task_orders/new.py +++ b/atst/routes/task_orders/new.py @@ -7,6 +7,7 @@ from flask import ( current_app as app, jsonify, ) +from datetime import datetime from . import task_orders_bp from atst.domain.authz.decorator import user_can_access_decorator as user_can @@ -22,6 +23,9 @@ def render_task_orders_edit( ): render_args = extra_args or {} + render_args["contract_start"] = app.config.get("CONTRACT_START_DATE") + render_args["contract_end"] = app.config.get("CONTRACT_END_DATE") + if task_order_id: task_order = TaskOrders.get(task_order_id) portfolio_id = task_order.portfolio_id diff --git a/js/components/clin_fields.js b/js/components/clin_fields.js index 6b164402..eb958780 100644 --- a/js/components/clin_fields.js +++ b/js/components/clin_fields.js @@ -12,12 +12,6 @@ const END_DATE = 'end_date' const POP = 'period_of_performance' const NUMBER = 'number' -const fs = require('fs') -const ini = require('ini') -const config = ini.parse(fs.readFileSync('./config/base.ini', 'utf-8')) -const CONTRACT_START_DATE = new Date(config.default.CONTRACT_START_DATE) -const CONTRACT_END_DATE = new Date(config.default.CONTRACT_END_DATE) - export default { name: 'clin-fields', @@ -43,6 +37,14 @@ export default { type: String, default: null, }, + contractStart: { + type: String, + required: true, + }, + contractEnd: { + type: String, + required: true, + }, }, data: function() { @@ -56,6 +58,8 @@ export default { const clinNumber = !!this.initialClinNumber ? this.initialClinNumber : undefined + const contractStartDate = new Date(this.contractStart) + const contractEndDate = new Date(this.contractEnd) return { clinIndex: this.initialClinIndex, @@ -64,6 +68,8 @@ export default { popValid: popValidation, startDateValid: false, endDateValid: false, + contractStartDate: contractStartDate, + contractEndDate: contractEndDate, clinNumber: clinNumber, showClin: true, popErrors: [], @@ -75,14 +81,14 @@ export default { { func: this.popStartsAfterContract, message: `PoP start date must be on or after ${format( - CONTRACT_START_DATE, + contractStartDate, 'MMM D, YYYY' )}.`, }, { func: this.popEndsBeforeContract, message: `PoP end date must be before or on ${format( - CONTRACT_END_DATE, + contractEndDate, 'MMM D, YYYY' )}.`, }, @@ -128,14 +134,14 @@ export default { popStartsAfterContract: function() { if (this.startDateValid) { - return this.startDate >= CONTRACT_START_DATE + return this.startDate >= this.contractStartDate } return true }, popEndsBeforeContract: function() { if (this.endDateValid) { - return this.endDate <= CONTRACT_END_DATE + return this.endDate <= this.contractEndDate } return true }, diff --git a/templates/task_orders/step_3.html b/templates/task_orders/step_3.html index 8c09f26f..bff66003 100644 --- a/templates/task_orders/step_3.html +++ b/templates/task_orders/step_3.html @@ -23,6 +23,8 @@ v-bind:initial-clin-index='clinIndex' v-bind:initial-clin-type="'JEDI_CLIN_1'" {% endif %} + v-bind:contract-start="'{{ contract_start | string }}'" + v-bind:contract-end="'{{ contract_end | string }}'" inline-template>
@@ -169,6 +171,7 @@ {{ 'task_orders.form.pop' | translate }}
+ {% set contract_end_formatted = contract_end | dateFromString(formatter="%Y-%m-%d") | formattedDate(formatter="%B %d, %Y") %} {% if fields %}
@@ -178,7 +181,7 @@
{% call DatePicker(fields.end_date, watch=True, optional=False) %} - {{ Alert(message="task_orders.form.pop_end_alert" | translate) }} + {{ Alert(message="task_orders.form.pop_end_alert" | translate({'end_date': contract_end_formatted})) }} {% endcall %}
@@ -255,7 +258,7 @@ {{ 'task_orders.form.pop_end' | translate }}
- {{ Alert(message="A CLIN's period of performance must end before September 14, 2022.") }} + {{ Alert(message="task_orders.form.pop_end_alert" | translate({'end_date': contract_end_formatted})) }}

{{ 'task_orders.form.pop_example' | translate }} diff --git a/translations.yaml b/translations.yaml index 9e94ac8a..028bd05e 100644 --- a/translations.yaml +++ b/translations.yaml @@ -385,7 +385,7 @@ task_orders: obligated_funds_label: Obligated Funds pop: Period of Performance pop_end: End Date - pop_end_alert: "A CLIN's period of performance must end before September 14, 2022." + pop_end_alert: "A CLIN's period of performance must end before {end_date}." pop_example: "For example: 07 04 1776" pop_start: Start Date review_button: Review task order From 09efa4f4344b41bfb09c61e678ad7974953dedd5 Mon Sep 17 00:00:00 2001 From: leigh-mil Date: Mon, 9 Sep 2019 14:33:05 -0400 Subject: [PATCH 8/8] use lowercase for variable names and remove unused import --- atst/forms/task_order.py | 12 ++++++------ atst/routes/task_orders/new.py | 1 - 2 files changed, 6 insertions(+), 7 deletions(-) diff --git a/atst/forms/task_order.py b/atst/forms/task_order.py index e933d139..09a8fe8e 100644 --- a/atst/forms/task_order.py +++ b/atst/forms/task_order.py @@ -54,10 +54,10 @@ class CLINForm(FlaskForm): def validate(self, *args, **kwargs): valid = super().validate(*args, **kwargs) - CONTRACT_START_DATE = datetime.strptime( + contract_start = datetime.strptime( app.config.get("CONTRACT_START_DATE"), "%Y-%m-%d" ).date() - CONTRACT_END_DATE = datetime.strptime( + contract_end = datetime.strptime( app.config.get("CONTRACT_END_DATE"), "%Y-%m-%d" ).date() @@ -71,20 +71,20 @@ class CLINForm(FlaskForm): ) valid = False - if self.start_date.data and self.start_date.data <= CONTRACT_START_DATE: + if self.start_date.data and self.start_date.data <= contract_start: self.start_date.errors.append( translate( "forms.task_order.pop_errors.start", - {"date": CONTRACT_START_DATE.strftime("%b %d, %Y")}, + {"date": contract_start.strftime("%b %d, %Y")}, ) ) valid = False - if self.end_date.data and self.end_date.data >= CONTRACT_END_DATE: + if self.end_date.data and self.end_date.data >= contract_end: self.end_date.errors.append( translate( "forms.task_order.pop_errors.end", - {"date": CONTRACT_END_DATE.strftime("%b %d, %Y")}, + {"date": contract_end.strftime("%b %d, %Y")}, ) ) valid = False diff --git a/atst/routes/task_orders/new.py b/atst/routes/task_orders/new.py index 6ac3f4be..5cc51d9c 100644 --- a/atst/routes/task_orders/new.py +++ b/atst/routes/task_orders/new.py @@ -7,7 +7,6 @@ from flask import ( current_app as app, jsonify, ) -from datetime import datetime from . import task_orders_bp from atst.domain.authz.decorator import user_can_access_decorator as user_can