Skip to content

Commit f5f8b73

Browse files
authored
Merge pull request #2254 from bagerard/fix_complex_datetime_field_invalid_string_set
fix complex datetime field invalid string set
2 parents 49b0d73 + e8f6b42 commit f5f8b73

File tree

3 files changed

+22
-1
lines changed

3 files changed

+22
-1
lines changed

docs/changelog.rst

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ Development
88
- (Fill this out as you fix issues and develop your features).
99
- ATTENTION: Drop support for Python2
1010
- Add Mongo 4.0 to Travis
11+
- Fix error when setting a string as a ComplexDateTimeField #2253
1112
- Bump development Status classifier to Production/Stable #2232
1213
- Improve Queryset.get to avoid confusing MultipleObjectsReturned message in case multiple match are found #630
1314
- Fixed a bug causing inaccurate query results, while combining ``__raw__`` and regular filters for the same field #2264

mongoengine/fields.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -677,7 +677,10 @@ def __set__(self, instance, value):
677677
super().__set__(instance, value)
678678
value = instance._data[self.name]
679679
if value is not None:
680-
instance._data[self.name] = self._convert_from_datetime(value)
680+
if isinstance(value, datetime.datetime):
681+
instance._data[self.name] = self._convert_from_datetime(value)
682+
else:
683+
instance._data[self.name] = value
681684

682685
def validate(self, value):
683686
value = self.to_python(value)

tests/fields/test_complex_datetime_field.py

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@
44
import math
55
import re
66

7+
import pytest
8+
79
from mongoengine import *
810

911
from tests.utils import MongoDBTestCase
@@ -191,3 +193,18 @@ class Log(Document):
191193

192194
fetched_log = Log.objects.with_id(log.id)
193195
assert fetched_log.timestamp >= NOW
196+
197+
def test_setting_bad_value_does_not_raise_unless_validate_is_called(self):
198+
# test regression of #2253
199+
200+
class Log(Document):
201+
timestamp = ComplexDateTimeField()
202+
203+
Log.drop_collection()
204+
205+
log = Log(timestamp="garbage")
206+
with pytest.raises(ValidationError):
207+
log.validate()
208+
209+
with pytest.raises(ValidationError):
210+
log.save()

0 commit comments

Comments
 (0)