refactored datetime to_mongo, separating parsing from str + added test

This commit is contained in:
Bastien Gérard 2019-03-02 23:44:33 +01:00
parent 7ed5829b2c
commit 27ea01ee05
2 changed files with 12 additions and 10 deletions

View File

@ -497,15 +497,18 @@ class DateTimeField(BaseField):
if not isinstance(value, six.string_types): if not isinstance(value, six.string_types):
return None return None
return self._parse_datetime(value)
def _parse_datetime(self, value):
# Attempt to parse a datetime from a string
value = value.strip() value = value.strip()
if not value: if not value:
return None return None
# Attempt to parse a datetime:
if dateutil: if dateutil:
try: try:
return dateutil.parser.parse(value) return dateutil.parser.parse(value)
except (TypeError, ValueError): except (TypeError, ValueError, OverflowError):
return None return None
# split usecs, because they are not recognized by strptime. # split usecs, because they are not recognized by strptime.

View File

@ -190,25 +190,24 @@ class TestDateTimeField(MongoDBTestCase):
log.time = '2019-05-16 21:42:57.123.456' log.time = '2019-05-16 21:42:57.123.456'
self.assertRaises(ValidationError, log.validate) self.assertRaises(ValidationError, log.validate)
def test_parse_valid_datetime_str(self): def test_parse_datetime_as_str(self):
class DTDoc(Document): class DTDoc(Document):
date = DateTimeField() date = DateTimeField()
date_str = '2019-03-02 22:26:01'
# make sure that passing a parsable datetime works # make sure that passing a parsable datetime works
dtd = DTDoc() dtd = DTDoc()
now = dt.datetime.utcnow() dtd.date = date_str
dtd.date = str(now)
self.assertIsInstance(dtd.date, six.string_types) self.assertIsInstance(dtd.date, six.string_types)
dtd.save() dtd.save()
dtd.reload() dtd.reload()
self.assertIsInstance(dtd.date, dt.datetime) self.assertIsInstance(dtd.date, dt.datetime)
self.assertEqual(str(dtd.date), date_str)
self.assertNotEqual(dtd.date, now) # microseconds differ as its not stored in mongo dtd.date = 'January 1st, 9999999999'
self.assertEqual( self.assertRaises(ValidationError, dtd.validate)
dtd.date.strftime('%Y-%m-%d %H:%M:%S'),
now.strftime('%Y-%m-%d %H:%M:%S')
)
class TestDateTimeTzAware(MongoDBTestCase): class TestDateTimeTzAware(MongoDBTestCase):