Fix clear_changed_fields() clearing unsaved documents bug #602

This commit is contained in:
Ross Lawley 2014-06-27 09:08:07 +01:00
parent 5be5685a09
commit cd63865d31
3 changed files with 9 additions and 5 deletions

View File

@ -196,3 +196,4 @@ that much better:
* Polyrabbit (https://github.com/polyrabbit) * Polyrabbit (https://github.com/polyrabbit)
* Sagiv Malihi (https://github.com/sagivmalihi) * Sagiv Malihi (https://github.com/sagivmalihi)
* Dmitry Konishchev (https://github.com/KonishchevDmitry) * Dmitry Konishchev (https://github.com/KonishchevDmitry)
* Martyn Smith (https://github.com/martynsmith)

View File

@ -6,6 +6,7 @@ Changelog
Changes in 0.9.X - DEV Changes in 0.9.X - DEV
====================== ======================
- Fix clear_changed_fields() clearing unsaved documents bug #602
- Removing support for Django 1.4.x, pymongo 2.5.x, pymongo 2.6.x. - Removing support for Django 1.4.x, pymongo 2.5.x, pymongo 2.6.x.
- Removing support for Python < 2.6.6 - Removing support for Python < 2.6.6
- Fixed $maxDistance location for geoJSON $near queries with MongoDB 2.6+ #664 - Fixed $maxDistance location for geoJSON $near queries with MongoDB 2.6+ #664

View File

@ -16,7 +16,7 @@ from mongoengine.errors import (ValidationError, InvalidDocumentError,
from mongoengine.python_support import PY3, txt_type from mongoengine.python_support import PY3, txt_type
from mongoengine.base.common import get_document, ALLOW_INHERITANCE from mongoengine.base.common import get_document, ALLOW_INHERITANCE
from mongoengine.base.datastructures import BaseDict, BaseList, StrictDict, SemiStrictDict from mongoengine.base.datastructures import BaseDict, BaseList, StrictDict, SemiStrictDict
from mongoengine.base.fields import ComplexBaseField from mongoengine.base.fields import ComplexBaseField
__all__ = ('BaseDocument', 'NON_FIELD_ERRORS') __all__ = ('BaseDocument', 'NON_FIELD_ERRORS')
@ -54,12 +54,12 @@ class BaseDocument(object):
values[name] = value values[name] = value
__auto_convert = values.pop("__auto_convert", True) __auto_convert = values.pop("__auto_convert", True)
signals.pre_init.send(self.__class__, document=self, values=values) signals.pre_init.send(self.__class__, document=self, values=values)
if self.STRICT and not self._dynamic: if self.STRICT and not self._dynamic:
self._data = StrictDict.create(allowed_keys=self._fields.keys())() self._data = StrictDict.create(allowed_keys=self._fields.keys())()
else: else:
self._data = SemiStrictDict.create(allowed_keys=self._fields.keys())() self._data = SemiStrictDict.create(allowed_keys=self._fields.keys())()
self._dynamic_fields = SON() self._dynamic_fields = SON()
# Assign default values to instance # Assign default values to instance
@ -150,7 +150,7 @@ class BaseDocument(object):
try: try:
self__initialised = self._initialised self__initialised = self._initialised
except AttributeError: except AttributeError:
self__initialised = False self__initialised = False
# Check if the user has created a new instance of a class # Check if the user has created a new instance of a class
if (self._is_document and self__initialised if (self._is_document and self__initialised
and self__created and name == self._meta['id_field']): and self__created and name == self._meta['id_field']):
@ -407,6 +407,8 @@ class BaseDocument(object):
else: else:
data = getattr(data, part, None) data = getattr(data, part, None)
if hasattr(data, "_changed_fields"): if hasattr(data, "_changed_fields"):
if hasattr(data, "_is_document") and data._is_document:
continue
data._changed_fields = [] data._changed_fields = []
self._changed_fields = [] self._changed_fields = []
@ -596,7 +598,7 @@ class BaseDocument(object):
msg = ("Invalid data to create a `%s` instance.\n%s" msg = ("Invalid data to create a `%s` instance.\n%s"
% (cls._class_name, errors)) % (cls._class_name, errors))
raise InvalidDocumentError(msg) raise InvalidDocumentError(msg)
if cls.STRICT: if cls.STRICT:
data = dict((k, v) for k,v in data.iteritems() if k in cls._fields) data = dict((k, v) for k,v in data.iteritems() if k in cls._fields)
obj = cls(__auto_convert=False, **data) obj = cls(__auto_convert=False, **data)