From 27ea01ee05de4b5da8336fe8b8983ff591502670 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bastien=20G=C3=A9rard?= Date: Sat, 2 Mar 2019 23:44:33 +0100 Subject: [PATCH] refactored datetime to_mongo, separating parsing from str + added test --- mongoengine/fields.py | 7 +++++-- tests/fields/test_datetime_field.py | 15 +++++++-------- 2 files changed, 12 insertions(+), 10 deletions(-) diff --git a/mongoengine/fields.py b/mongoengine/fields.py index 1cd6be11..9650403c 100644 --- a/mongoengine/fields.py +++ b/mongoengine/fields.py @@ -497,15 +497,18 @@ class DateTimeField(BaseField): if not isinstance(value, six.string_types): return None + return self._parse_datetime(value) + + def _parse_datetime(self, value): + # Attempt to parse a datetime from a string value = value.strip() if not value: return None - # Attempt to parse a datetime: if dateutil: try: return dateutil.parser.parse(value) - except (TypeError, ValueError): + except (TypeError, ValueError, OverflowError): return None # split usecs, because they are not recognized by strptime. diff --git a/tests/fields/test_datetime_field.py b/tests/fields/test_datetime_field.py index 83be207f..92f0668a 100644 --- a/tests/fields/test_datetime_field.py +++ b/tests/fields/test_datetime_field.py @@ -190,25 +190,24 @@ class TestDateTimeField(MongoDBTestCase): log.time = '2019-05-16 21:42:57.123.456' self.assertRaises(ValidationError, log.validate) - def test_parse_valid_datetime_str(self): + def test_parse_datetime_as_str(self): class DTDoc(Document): date = DateTimeField() + date_str = '2019-03-02 22:26:01' + # make sure that passing a parsable datetime works dtd = DTDoc() - now = dt.datetime.utcnow() - dtd.date = str(now) + dtd.date = date_str self.assertIsInstance(dtd.date, six.string_types) dtd.save() dtd.reload() 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 - self.assertEqual( - dtd.date.strftime('%Y-%m-%d %H:%M:%S'), - now.strftime('%Y-%m-%d %H:%M:%S') - ) + dtd.date = 'January 1st, 9999999999' + self.assertRaises(ValidationError, dtd.validate) class TestDateTimeTzAware(MongoDBTestCase):