From 5fb2ae7260e315988826c316bb1feaefdc621592 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Lafr=C3=A9choux?= Date: Fri, 8 Mar 2019 09:47:22 +0100 Subject: [PATCH] Round datetimes to milliseconds in LocalDateTimeField --- tests/test_fields.py | 9 +++++++-- umongo/fields.py | 8 ++++++-- 2 files changed, 13 insertions(+), 4 deletions(-) diff --git a/tests/test_fields.py b/tests/test_fields.py index c0cb704b..22d14d41 100644 --- a/tests/test_fields.py +++ b/tests/test_fields.py @@ -150,6 +150,7 @@ def test_datetime(self): class MySchema(EmbeddedSchema): a = fields.DateTimeField() + b = fields.LocalDateTimeField() s = MySchema(strict=True) data, _ = s.load({'a': datetime(2016, 8, 6)}) @@ -161,10 +162,14 @@ class MySchema(EmbeddedSchema): with pytest.raises(ValidationError): s.load({'a': "dummy"}) - # Test DateTimeField rounds to milliseconds + # Test DateTimeField and LocalDateTimeField round to milliseconds s = MySchema() - data, _ = s.load({'a': datetime(2016, 8, 6, 12, 30, 30, 123456)}) + data, _ = s.load({ + 'a': datetime(2016, 8, 6, 12, 30, 30, 123456), + 'b': datetime(2016, 8, 6, 12, 30, 30, 123456), + }) assert data['a'].microsecond == 123000 + assert data['b'].microsecond == 123000 def test_strictdatetime(self): diff --git a/umongo/fields.py b/umongo/fields.py index 1532a684..e262a034 100644 --- a/umongo/fields.py +++ b/umongo/fields.py @@ -181,8 +181,12 @@ class LocalDateTimeField(BaseField, ma_fields.LocalDateTime): def _deserialize(self, value, attr, data): if isinstance(value, datetime): - return value - return super()._deserialize(value, attr, data) + ret = value + else: + ret = super()._deserialize(value, attr, data) + # MongoDB stores datetimes with a millisecond precision. + # Don't keep more precision in the object than in the database. + return ret.replace(microsecond=round(ret.microsecond, -3)) # class TimeField(BaseField, ma_fields.Time):