Fixed changing default values to False for embedded items
This commit is contained in:
		| @@ -755,9 +755,26 @@ class BaseDocument(object): | |||||||
|             if value: |             if value: | ||||||
|                 continue |                 continue | ||||||
|  |  | ||||||
|             # If we've set a value that aint the default value save it. |             # If we've set a value that ain't the default value unset it. | ||||||
|  |             default = None | ||||||
|  |  | ||||||
|             if path in self._fields: |             if path in self._fields: | ||||||
|                 default = self._fields[path].default |                 default = self._fields[path].default | ||||||
|  |             else:  # Perform a full lookup for lists / embedded lookups | ||||||
|  |                 d = self | ||||||
|  |                 parts = path.split('.') | ||||||
|  |                 field_name = parts.pop() | ||||||
|  |                 for p in parts: | ||||||
|  |                     if p.isdigit(): | ||||||
|  |                         d = d[int(p)] | ||||||
|  |                     elif hasattr(d, '__getattribute__'): | ||||||
|  |                         d = getattr(d, p) | ||||||
|  |                     else: | ||||||
|  |                         d = d.get(p) | ||||||
|  |                 if hasattr(d, '_fields'): | ||||||
|  |                     default = d._fields[field_name].default | ||||||
|  |  | ||||||
|  |             if default is not None: | ||||||
|                 if callable(default): |                 if callable(default): | ||||||
|                     default = default() |                     default = default() | ||||||
|                 if default != value: |                 if default != value: | ||||||
|   | |||||||
| @@ -1735,6 +1735,47 @@ class DocumentTest(unittest.TestCase): | |||||||
|         self.assertEquals(person.age, 21) |         self.assertEquals(person.age, 21) | ||||||
|         self.assertEquals(person.active, False) |         self.assertEquals(person.active, False) | ||||||
|  |  | ||||||
|  |     def test_save_only_changed_fields_recursive(self): | ||||||
|  |         """Ensure save only sets / unsets changed fields | ||||||
|  |         """ | ||||||
|  |  | ||||||
|  |         class Comment(EmbeddedDocument): | ||||||
|  |             published = BooleanField(default=True) | ||||||
|  |  | ||||||
|  |         class User(self.Person): | ||||||
|  |             comments_dict = DictField() | ||||||
|  |             comments = ListField(EmbeddedDocumentField(Comment)) | ||||||
|  |             active = BooleanField(default=True) | ||||||
|  |  | ||||||
|  |         User.drop_collection() | ||||||
|  |  | ||||||
|  |         # Create person object and save it to the database | ||||||
|  |         person = User(name='Test User', age=30, active=True) | ||||||
|  |         person.comments.append(Comment()) | ||||||
|  |         person.save() | ||||||
|  |         person.reload() | ||||||
|  |  | ||||||
|  |         person = self.Person.objects.get() | ||||||
|  |         self.assertTrue(person.comments[0].published) | ||||||
|  |  | ||||||
|  |         person.comments[0].published = False | ||||||
|  |         person.save() | ||||||
|  |  | ||||||
|  |         person = self.Person.objects.get() | ||||||
|  |         self.assertFalse(person.comments[0].published) | ||||||
|  |  | ||||||
|  |         # Simple dict w | ||||||
|  |         person.comments_dict['first_post'] = Comment() | ||||||
|  |         person.save() | ||||||
|  |  | ||||||
|  |         person = self.Person.objects.get() | ||||||
|  |         self.assertTrue(person.comments_dict['first_post'].published) | ||||||
|  |  | ||||||
|  |         person.comments_dict['first_post'].published = False | ||||||
|  |         person.save() | ||||||
|  |  | ||||||
|  |         person = self.Person.objects.get() | ||||||
|  |         self.assertTrue(person.comments_dict['first_post'].published) | ||||||
|     def test_delete(self): |     def test_delete(self): | ||||||
|         """Ensure that document may be deleted using the delete method. |         """Ensure that document may be deleted using the delete method. | ||||||
|         """ |         """ | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user