From 59fdad85547a0eb5db11ae95b5e8c24137283976 Mon Sep 17 00:00:00 2001 From: dandds Date: Tue, 4 Sep 2018 13:47:44 -0400 Subject: [PATCH] use regular WTForms DateField for requests dates --- atst/domain/date.py | 12 ------------ atst/forms/fields.py | 17 ----------------- atst/forms/org.py | 5 +++-- atst/forms/request.py | 5 +++-- atst/forms/validators.py | 4 +--- templates/components/date_input.html | 10 ++++++++++ templates/components/text_input.html | 4 ++-- templates/requests/screen-1.html | 3 ++- templates/requests/screen-2.html | 3 ++- tests/domain/test_date.py | 20 -------------------- tests/forms/test_fields.py | 22 +--------------------- tests/test_integration.py | 17 ++++++++++++++++- 12 files changed, 40 insertions(+), 82 deletions(-) delete mode 100644 atst/domain/date.py create mode 100644 templates/components/date_input.html delete mode 100644 tests/domain/test_date.py diff --git a/atst/domain/date.py b/atst/domain/date.py deleted file mode 100644 index 4a131671..00000000 --- a/atst/domain/date.py +++ /dev/null @@ -1,12 +0,0 @@ -import pendulum - - -def parse_date(data): - date_formats = ["YYYY-MM-DD", "MM/DD/YYYY"] - for _format in date_formats: - try: - return pendulum.from_format(data, _format).date() - except (ValueError, pendulum.parsing.exceptions.ParserError): - pass - - raise ValueError("Unable to parse string {}".format(data)) diff --git a/atst/forms/fields.py b/atst/forms/fields.py index 27db5742..042e43bd 100644 --- a/atst/forms/fields.py +++ b/atst/forms/fields.py @@ -1,23 +1,6 @@ -from wtforms.fields.html5 import DateField from wtforms.fields import Field, SelectField as SelectField_ from wtforms.widgets import TextArea -from atst.domain.date import parse_date - - -class DateField(DateField): - def _value(self): - if self.data: - return parse_date(self.data) - else: - return None - - def process_formdata(self, values): - if values: - self.data = values[0] - else: - self.data = None - class NewlineListField(Field): widget = TextArea() diff --git a/atst/forms/org.py b/atst/forms/org.py index d22c849e..b2846a29 100644 --- a/atst/forms/org.py +++ b/atst/forms/org.py @@ -1,9 +1,9 @@ -from wtforms.fields.html5 import EmailField, TelField +from wtforms.fields.html5 import DateField, EmailField, TelField from wtforms.fields import RadioField, StringField from wtforms.validators import Required, Email import pendulum -from .fields import DateField, SelectField +from .fields import SelectField from .forms import ValidatedForm from .validators import DateRange, PhoneNumber, Alphabet from .data import SERVICE_BRANCHES @@ -60,4 +60,5 @@ class OrgForm(ValidatedForm): message="Must be a date within the last year.", ), ], + format="%m/%d/%Y", ) diff --git a/atst/forms/request.py b/atst/forms/request.py index 207b2ebf..1d8e8741 100644 --- a/atst/forms/request.py +++ b/atst/forms/request.py @@ -1,8 +1,8 @@ -from wtforms.fields.html5 import IntegerField +from wtforms.fields.html5 import DateField, IntegerField from wtforms.fields import RadioField, TextAreaField from wtforms.validators import Optional, Required -from .fields import DateField, SelectField +from .fields import SelectField from .forms import ValidatedForm from .data import ( SERVICE_BRANCHES, @@ -135,4 +135,5 @@ class RequestForm(ValidatedForm): start_date = DateField( description="When do you expect to start using the JEDI Cloud (not for billing purposes)?", validators=[Required()], + format="%m/%d/%Y", ) diff --git a/atst/forms/validators.py b/atst/forms/validators.py index 9d007ecf..47673101 100644 --- a/atst/forms/validators.py +++ b/atst/forms/validators.py @@ -2,13 +2,11 @@ import re from wtforms.validators import ValidationError import pendulum -from atst.domain.date import parse_date - def DateRange(lower_bound=None, upper_bound=None, message=None): def _date_range(form, field): now = pendulum.now().date() - date = parse_date(field.data) + date = field.data if lower_bound is not None: if (now - lower_bound) > date: diff --git a/templates/components/date_input.html b/templates/components/date_input.html new file mode 100644 index 00000000..fcf73739 --- /dev/null +++ b/templates/components/date_input.html @@ -0,0 +1,10 @@ +{% from "components/text_input.html" import TextInput %} + +{% macro DateInput(field, tooltip='', placeholder='', validation='anything', paragraph=False) -%} + {% if field.data %} + {% set input_value=field.data.strftime("%m/%d/%Y") %} + {% else %} + {% set input_value=None %} + {% endif %} + {{ TextInput(field, initial_value=input_value, tooltip=tooltip, placeholder=placeholder, validation=validation, paragraph=paragraph) }} +{% endmacro %} diff --git a/templates/components/text_input.html b/templates/components/text_input.html index 7b808cec..ecd29f5c 100644 --- a/templates/components/text_input.html +++ b/templates/components/text_input.html @@ -1,12 +1,12 @@ {% from "components/icon.html" import Icon %} {% from "components/tooltip.html" import Tooltip %} -{% macro TextInput(field, tooltip='', placeholder='', validation='anything', paragraph=False) -%} +{% macro TextInput(field, tooltip='', placeholder='', validation='anything', paragraph=False, initial_value='') -%} diff --git a/templates/requests/screen-1.html b/templates/requests/screen-1.html index c4fa953d..88561030 100644 --- a/templates/requests/screen-1.html +++ b/templates/requests/screen-1.html @@ -3,6 +3,7 @@ {% from "components/alert.html" import Alert %} {% from "components/text_input.html" import TextInput %} {% from "components/options_input.html" import OptionsInput %} +{% from "components/date_input.html" import DateInput %} {% block subtitle %}

Details of Use

@@ -76,7 +77,7 @@ {{ TextInput(f.dollar_value, validation='dollars', placeholder='$0') }} - {{ TextInput(f.start_date, placeholder='MM / DD / YYYY', validation='date') }} + {{ DateInput(f.start_date, placeholder='MM / DD / YYYY', validation='date') }} diff --git a/templates/requests/screen-2.html b/templates/requests/screen-2.html index 1e67d2ab..9a23777e 100644 --- a/templates/requests/screen-2.html +++ b/templates/requests/screen-2.html @@ -3,6 +3,7 @@ {% from "components/alert.html" import Alert %} {% from "components/text_input.html" import TextInput %} {% from "components/options_input.html" import OptionsInput %} +{% from "components/date_input.html" import DateInput %} {% block subtitle %}

Information About You

@@ -29,5 +30,5 @@ {{ OptionsInput(f.service_branch) }} {{ OptionsInput(f.citizenship) }} {{ OptionsInput(f.designation) }} -{{ TextInput(f.date_latest_training,tooltip="When was the last time you completed the IA training?
Information Assurance (IA) training is an important step in cyber awareness.",placeholder="MM / DD / YYYY", validation="date") }} +{{ DateInput(f.date_latest_training,tooltip="When was the last time you completed the IA training?
Information Assurance (IA) training is an important step in cyber awareness.",placeholder="MM / DD / YYYY", validation="date") }} {% endblock %} diff --git a/tests/domain/test_date.py b/tests/domain/test_date.py deleted file mode 100644 index 87b3fc0a..00000000 --- a/tests/domain/test_date.py +++ /dev/null @@ -1,20 +0,0 @@ -import pytest -import pendulum - -from atst.domain.date import parse_date - - -def test_date_with_slashes(): - date_str = "1/2/2020" - assert parse_date(date_str) == pendulum.date(2020, 1, 2) - - -def test_date_with_dashes(): - date_str = "2020-1-2" - assert parse_date(date_str) == pendulum.date(2020, 1, 2) - - -def test_invalid_date(): - date_str = "This is not a valid data" - with pytest.raises(ValueError): - parse_date(date_str) diff --git a/tests/forms/test_fields.py b/tests/forms/test_fields.py index 99c4d6c7..e3cfa3ba 100644 --- a/tests/forms/test_fields.py +++ b/tests/forms/test_fields.py @@ -3,33 +3,13 @@ from wtforms import Form import pendulum from werkzeug.datastructures import ImmutableMultiDict -from atst.forms.fields import DateField, NewlineListField - - -class DateForm(Form): - date = DateField() +from atst.forms.fields import NewlineListField class NewlineListForm(Form): newline_list = NewlineListField() -def test_date_ie_format(): - form = DateForm(data={"date": "12/24/2018"}) - assert form.date._value() == pendulum.date(2018, 12, 24) - - -def test_date_sane_format(): - form = DateForm(data={"date": "2018-12-24"}) - assert form.date._value() == pendulum.date(2018, 12, 24) - - -def test_date_insane_format(): - form = DateForm(data={"date": "hello"}) - with pytest.raises(ValueError): - form.date._value() - - @pytest.mark.parametrize( "input_,expected", [ diff --git a/tests/test_integration.py b/tests/test_integration.py index 65236100..51a75789 100644 --- a/tests/test_integration.py +++ b/tests/test_integration.py @@ -12,6 +12,20 @@ def screens(app): return JEDIRequestFlow(3).screens +def serialize_dates(data): + if not data: + return data + + dates = { + k: v.strftime("%m/%d/%Y") for k, v in data.items() if hasattr(v, "strftime") + } + + new_data = data.copy() + new_data.update(dates) + + return new_data + + def test_stepthrough_request_form(user_session, screens, client): user = UserFactory.create() user_session(user) @@ -46,7 +60,8 @@ def test_stepthrough_request_form(user_session, screens, client): for i in range(1, len(screens)): # get appropriate form data to POST for this section section = screens[i - 1]["section"] - post_data = urlencode(mock_body[section]) + massaged = serialize_dates(mock_body[section]) + post_data = urlencode(massaged) effective_url, resp = take_a_step(i, req=req_id, data=post_data) req_id = effective_url.split("/")[-1]