If values cant be compared mark as changed (#287)
This commit is contained in:
		| @@ -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) | ||||||
|   | |||||||
| @@ -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. | ||||||
|   | |||||||
| @@ -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 | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user