If values cant be compared mark as changed (#287)

This commit is contained in:
Ross Lawley 2013-04-29 10:36:11 +00:00
parent 5d7444c115
commit 85b81fb12a
3 changed files with 32 additions and 7 deletions

View File

@ -4,6 +4,7 @@ Changelog
Changes in 0.8.X Changes in 0.8.X
================ ================
- If values cant be compared mark as changed (#287)
- Ensure as_pymongo() and to_json honour only() and exclude() (#293) - Ensure as_pymongo() and to_json honour only() and exclude() (#293)
- Document serialization uses field order to ensure a strict order is set (#296) - Document serialization uses field order to ensure a strict order is set (#296)
- DecimalField now stores as float not string (#289) - DecimalField now stores as float not string (#289)

View File

@ -81,13 +81,16 @@ class BaseField(object):
def __set__(self, instance, value): def __set__(self, instance, value):
"""Descriptor for assigning a value to a field in a document. """Descriptor for assigning a value to a field in a document.
""" """
changed = False if instance._initialised:
if (self.name not in instance._data or try:
instance._data[self.name] != value): if (self.name not in instance._data or
changed = True instance._data[self.name] != value):
instance._data[self.name] = value instance._mark_as_changed(self.name)
if changed and instance._initialised: except:
instance._mark_as_changed(self.name) # Values cant be compared eg: naive and tz datetimes
# So mark it as changed
instance._mark_as_changed(self.name)
instance._data[self.name] = value
def error(self, message="", errors=None, field_name=None): def error(self, message="", errors=None, field_name=None):
"""Raises a ValidationError. """Raises a ValidationError.

View File

@ -409,6 +409,27 @@ class FieldTest(unittest.TestCase):
log.time = '1pm' log.time = '1pm'
self.assertRaises(ValidationError, log.validate) self.assertRaises(ValidationError, log.validate)
def test_datetime_tz_aware_mark_as_changed(self):
from mongoengine import connection
# Reset the connections
connection._connection_settings = {}
connection._connections = {}
connection._dbs = {}
connect(db='mongoenginetest', tz_aware=True)
class LogEntry(Document):
time = DateTimeField()
LogEntry.drop_collection()
LogEntry(time=datetime.datetime(2013, 1, 1, 0, 0, 0)).save()
log = LogEntry.objects.first()
log.time = datetime.datetime(2013, 1, 1, 0, 0, 0)
self.assertEqual(['time'], log._changed_fields)
def test_datetime(self): def test_datetime(self):
"""Tests showing pymongo datetime fields handling of microseconds. """Tests showing pymongo datetime fields handling of microseconds.
Microseconds are rounded to the nearest millisecond and pre UTC Microseconds are rounded to the nearest millisecond and pre UTC