Skip to content

Commit

Permalink
Support for TimeField (pallets-eco#254)
Browse files Browse the repository at this point in the history
  • Loading branch information
lipis authored and davidism committed Nov 3, 2016
1 parent e65085d commit 086d0bf
Show file tree
Hide file tree
Showing 3 changed files with 47 additions and 2 deletions.
21 changes: 21 additions & 0 deletions tests/fields.py
Original file line number Diff line number Diff line change
Expand Up @@ -589,6 +589,27 @@ def test_failure(self):
self.assertEqual(form.a.process_errors[0], 'Not a valid date value')


class TimeFieldTest(TestCase):
class F(Form):
a = TimeField()
b = TimeField(format='%H:%M')

def test_basic(self):
d = datetime(2008, 5, 5, 4, 30, 0, 0).time()
# Basic test with both inputs
form = self.F(DummyPostData(a=['4:30'], b=['04:30']))
self.assertEqual(form.a.data, d)
self.assertEqual(form.a(), """<input id="a" name="a" type="text" value="4:30">""")
self.assertEqual(form.b.data, d)
self.assertEqual(form.b(), """<input id="b" name="b" type="text" value="04:30">""")
self.assertTrue(form.validate())

# Test with a missing input
form = self.F(DummyPostData(a=['04']))
self.assertFalse(form.validate())
self.assertEqual(form.a.errors[0], 'Not a valid time value')


class DateTimeFieldTest(TestCase):
class F(Form):
a = DateTimeField()
Expand Down
19 changes: 18 additions & 1 deletion wtforms/fields/core.py
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@
__all__ = (
'BooleanField', 'DecimalField', 'DateField', 'DateTimeField', 'FieldList',
'FloatField', 'FormField', 'IntegerField', 'RadioField', 'SelectField',
'SelectMultipleField', 'StringField',
'SelectMultipleField', 'StringField', 'TimeField',
)


Expand Down Expand Up @@ -762,6 +762,23 @@ def process_formdata(self, valuelist):
raise ValueError(self.gettext('Not a valid date value'))


class TimeField(DateTimeField):
"""
Same as DateTimeField, except stores a `time`.
"""
def __init__(self, label=None, validators=None, format='%H:%M', **kwargs):
super(TimeField, self).__init__(label, validators, format, **kwargs)

def process_formdata(self, valuelist):
if valuelist:
time_str = ' '.join(valuelist)
try:
self.data = datetime.datetime.strptime(time_str, self.format).time()
except ValueError:
self.data = None
raise ValueError(self.gettext('Not a valid time value'))


class FormField(Field):
"""
Encapsulate a form as a field in another form.
Expand Down
9 changes: 8 additions & 1 deletion wtforms/fields/html5.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
__all__ = (
'DateField', 'DateTimeField', 'DateTimeLocalField', 'DecimalField',
'DecimalRangeField', 'EmailField', 'IntegerField', 'IntegerRangeField',
'SearchField', 'TelField', 'URLField',
'SearchField', 'TelField', 'TimeField', 'URLField',
)


Expand Down Expand Up @@ -53,6 +53,13 @@ class DateField(core.DateField):
widget = widgets.DateInput()


class TimeField(core.TimeField):
"""
Represents an ``<input type="time">``.
"""
widget = widgets.TimeInput()


class DateTimeLocalField(core.DateTimeField):
"""
Represents an ``<input type="datetime-local">``.
Expand Down

0 comments on commit 086d0bf

Please sign in to comment.