From 7ca2ea0766644bf5053e80303d5c386302f11609 Mon Sep 17 00:00:00 2001 From: Ross Lawley Date: Tue, 19 Jun 2012 09:49:22 +0100 Subject: [PATCH] Fixes .save _delta issue with DBRefs Fixes hmarr/mongoengine#518 --- docs/changelog.rst | 4 +++- mongoengine/base.py | 8 ++++++-- mongoengine/dereference.py | 2 +- setup.cfg | 7 ++++--- 4 files changed, 14 insertions(+), 7 deletions(-) diff --git a/docs/changelog.rst b/docs/changelog.rst index eeb5b892..802e3023 100644 --- a/docs/changelog.rst +++ b/docs/changelog.rst @@ -4,6 +4,8 @@ Changelog Changes in 0.6.X ================ +- Fixed .save() _delta issue with DbRefs +- Fixed Django TestCase - Added cmp to Embedded Document - Added PULL reverse_delete_rule - Fixed CASCADE delete bug @@ -317,4 +319,4 @@ Changes in v0.1.2 Changes in v0.1.1 ================= -- Documents may now use capped collections +- \ No newline at end of file diff --git a/mongoengine/base.py b/mongoengine/base.py index 6ab7425d..a1364267 100644 --- a/mongoengine/base.py +++ b/mongoengine/base.py @@ -1050,14 +1050,18 @@ Invalid data to create a `%s` instance.\n%s""".strip() % (cls._class_name, error for path in set_fields: parts = path.split('.') d = doc + dbref = False for p in parts: - if hasattr(d, '__getattr__'): + if isinstance(d, DBRef): + dbref = True + elif hasattr(d, '__getattr__'): d = getattr(p, d) elif p.isdigit(): d = d[int(p)] else: d = d.get(p) - set_data[path] = d + if not dbref: + set_data[path] = d else: set_data = doc if '_id' in set_data: diff --git a/mongoengine/dereference.py b/mongoengine/dereference.py index 8928d1ef..84c57bb8 100644 --- a/mongoengine/dereference.py +++ b/mongoengine/dereference.py @@ -114,7 +114,7 @@ class DeReference(object): doc = get_document(ref["_cls"])._from_son(ref) elif doc_type is None: doc = get_document( - ''.join(x.capitalize() + ''.join(x.capitalize() for x in col.split('_')))._from_son(ref) else: doc = doc_type._from_son(ref) diff --git a/setup.cfg b/setup.cfg index 03b16554..43097a49 100644 --- a/setup.cfg +++ b/setup.cfg @@ -4,9 +4,10 @@ test = nosetests [nosetests] verbosity = 2 detailed-errors = 1 -with-coverage = 1 -#cover-html = 1 -#cover-html-dir = ../htmlcov +#with-coverage = 1 +cover-html = 1 +cover-html-dir = ../htmlcov cover-package = mongoengine cover-erase = 1 where = tests +#tests = test_bugfix.py