A better fix so we dont follow down a references rabbit hole.
This commit is contained in:
		| @@ -395,6 +395,7 @@ class BaseDocument(object): | ||||
|         """ | ||||
|         EmbeddedDocument = _import_class("EmbeddedDocument") | ||||
|         DynamicEmbeddedDocument = _import_class("DynamicEmbeddedDocument") | ||||
|         ReferenceField = _import_class("ReferenceField") | ||||
|         _changed_fields = [] | ||||
|         _changed_fields += getattr(self, '_changed_fields', []) | ||||
|  | ||||
| @@ -405,31 +406,36 @@ class BaseDocument(object): | ||||
|             inspected.add(self.id) | ||||
|  | ||||
|         for field_name in self._fields_ordered: | ||||
|  | ||||
|             db_field_name = self._db_field_map.get(field_name, field_name) | ||||
|             key = '%s.' % db_field_name | ||||
|             field = self._data.get(field_name, None) | ||||
|             if hasattr(field, 'id'): | ||||
|                 if field.id in inspected: | ||||
|                     continue | ||||
|                 inspected.add(field.id) | ||||
|             data = self._data.get(field_name, None) | ||||
|             field = self._fields.get(field_name) | ||||
|  | ||||
|             if (isinstance(field, (EmbeddedDocument, DynamicEmbeddedDocument)) | ||||
|             if hasattr(data, 'id'): | ||||
|                 if data.id in inspected: | ||||
|                     continue | ||||
|                 inspected.add(data.id) | ||||
|             if isinstance(field, ReferenceField): | ||||
|                 continue | ||||
|             elif (isinstance(data, (EmbeddedDocument, DynamicEmbeddedDocument)) | ||||
|                and db_field_name not in _changed_fields): | ||||
|                  # Find all embedded fields that have been changed | ||||
|                 changed = field._get_changed_fields(inspected) | ||||
|                 changed = data._get_changed_fields(inspected) | ||||
|                 _changed_fields += ["%s%s" % (key, k) for k in changed if k] | ||||
|             elif (isinstance(field, (list, tuple, dict)) and | ||||
|             elif (isinstance(data, (list, tuple, dict)) and | ||||
|                     db_field_name not in _changed_fields): | ||||
|                 # Loop list / dict fields as they contain documents | ||||
|                 # Determine the iterator to use | ||||
|                 if not hasattr(field, 'items'): | ||||
|                     iterator = enumerate(field) | ||||
|                 if not hasattr(data, 'items'): | ||||
|                     iterator = enumerate(data) | ||||
|                 else: | ||||
|                     iterator = field.iteritems() | ||||
|                     iterator = data.iteritems() | ||||
|                 for index, value in iterator: | ||||
|                     if not hasattr(value, '_get_changed_fields'): | ||||
|                         continue | ||||
|                     if (hasattr(field, 'field') and | ||||
|                         isinstance(field.field, ReferenceField)): | ||||
|                         continue | ||||
|                     list_key = "%s%s." % (key, index) | ||||
|                     changed = value._get_changed_fields(inspected) | ||||
|                     _changed_fields += ["%s%s" % (list_key, k) | ||||
|   | ||||
		Reference in New Issue
	
	Block a user