added TimeField to newitem

This commit is contained in:
Ismael Carnales 2009-07-13 10:31:32 -03:00
parent 5eebe1f405
commit b44409a203
3 changed files with 81 additions and 0 deletions

View File

@ -76,3 +76,12 @@ DateField
.. _datetime.date: http://docs.python.org/library/datetime.html#datetime.date
TimeField
---------
.. class:: TimeField
A time, represented in Python by a `datetime.time`_ instance.
.. _datetime.time: http://docs.python.org/library/datetime.html#datetime.time

View File

@ -3,6 +3,7 @@ import decimal
import re
import time
class BaseField(object):
def __init__(self, default=None):
self.default = default or self.to_python(None)
@ -121,3 +122,36 @@ class StringField(BaseField):
"Converts the input iterable into a single value."
return ' '.join(value)
class TimeField(BaseField):
def to_python(self, value):
if value is None:
return None
if isinstance(value, datetime.time):
return value
if isinstance(value, datetime.datetime):
return value.time
# Attempt to parse a datetime:
value = str(value)
# split usecs, because they are not recognized by strptime.
if '.' in value:
try:
value, usecs = value.split('.')
usecs = int(usecs)
except ValueError:
raise ValueError('Enter a valid time in HH:MM[:ss[.uuuuuu]] format.')
else:
usecs = 0
kwargs = {'microsecond': usecs}
try: # Seconds are optional, so try converting seconds first.
return datetime.time(*time.strptime(value, '%H:%M:%S')[3:6],
**kwargs)
except ValueError:
try: # Try without seconds.
return datetime.time(*time.strptime(value, '%H:%M')[3:5],
**kwargs)
except ValueError:
raise ValueError('Enter a valid time in HH:MM[:ss[.uuuuuu]] format.')

View File

@ -246,3 +246,41 @@ class NewItemFieldsTest(unittest.TestCase):
self.assertRaises(ValueError, set_invalid_value)
def test_time_field(self):
class TestItem(Item):
field = fields.TimeField()
i = TestItem()
dt_t = datetime.time(11, 8, 10, 100)
i.field = dt_t
assert i.field == dt_t
dt_dt = datetime.datetime.today()
i.field = dt_dt
assert i.field == dt_dt.time
i.field = '11:08:10.100'
assert i.field == datetime.time(11, 8, 10, 100)
i.field = '11:08:10'
assert i.field == datetime.time(11, 8, 10)
i.field = '11:08'
assert i.field == datetime.time(11, 8)
def set_invalid_usecs():
i.field = '11:08:10.usecs'
self.assertRaises(ValueError, set_invalid_usecs)
def set_invalid_format():
i.field = 'string'
self.assertRaises(ValueError, set_invalid_format)
def set_invalid_time():
i.field = '25:08:10'
self.assertRaises(ValueError, set_invalid_time)