Merge pull request #2082 from divomen/v0.18.0_fix
Fix a big issue when determine if there is a new document
This commit is contained in:
		| @@ -371,7 +371,7 @@ class Document(six.with_metaclass(TopLevelDocumentMetaclass, BaseDocument)): | |||||||
|         if write_concern is None: |         if write_concern is None: | ||||||
|             write_concern = {} |             write_concern = {} | ||||||
|  |  | ||||||
|         doc_id = self.to_mongo(fields=['id']) |         doc_id = self.to_mongo(fields=[self._meta['id_field']]) | ||||||
|         created = ('_id' not in doc_id or self._created or force_insert) |         created = ('_id' not in doc_id or self._created or force_insert) | ||||||
|  |  | ||||||
|         signals.pre_save_post_validation.send(self.__class__, document=self, |         signals.pre_save_post_validation.send(self.__class__, document=self, | ||||||
|   | |||||||
| @@ -1,33 +1,30 @@ | |||||||
| # -*- coding: utf-8 -*- | # -*- coding: utf-8 -*- | ||||||
| import bson |  | ||||||
| import os | import os | ||||||
| import pickle | import pickle | ||||||
| import unittest | import unittest | ||||||
| import uuid | import uuid | ||||||
| import warnings |  | ||||||
| import weakref | import weakref | ||||||
| from datetime import datetime | from datetime import datetime | ||||||
|  |  | ||||||
|  | import bson | ||||||
| from bson import DBRef, ObjectId | from bson import DBRef, ObjectId | ||||||
| from pymongo.errors import DuplicateKeyError | from pymongo.errors import DuplicateKeyError | ||||||
| from six import iteritems | from six import iteritems | ||||||
|  |  | ||||||
| from mongoengine.mongodb_support import get_mongodb_version, MONGODB_36, MONGODB_34 |  | ||||||
| from mongoengine.pymongo_support import list_collection_names |  | ||||||
| from tests import fixtures |  | ||||||
| from tests.fixtures import (PickleEmbedded, PickleTest, PickleSignalsTest, |  | ||||||
|                             PickleDynamicEmbedded, PickleDynamicTest) |  | ||||||
| from tests.utils import MongoDBTestCase, get_as_pymongo |  | ||||||
|  |  | ||||||
| from mongoengine import * | from mongoengine import * | ||||||
| from mongoengine.base import get_document, _document_registry |  | ||||||
| from mongoengine.connection import get_db |  | ||||||
| from mongoengine.errors import (NotRegistered, InvalidDocumentError, |  | ||||||
|                                 InvalidQueryError, NotUniqueError, |  | ||||||
|                                 FieldDoesNotExist, SaveConditionError) |  | ||||||
| from mongoengine.queryset import NULLIFY, Q |  | ||||||
| from mongoengine.context_managers import switch_db, query_counter |  | ||||||
| from mongoengine import signals | from mongoengine import signals | ||||||
|  | from mongoengine.base import _document_registry, get_document | ||||||
|  | from mongoengine.connection import get_db | ||||||
|  | from mongoengine.context_managers import query_counter, switch_db | ||||||
|  | from mongoengine.errors import (FieldDoesNotExist, InvalidDocumentError, \ | ||||||
|  |                                 InvalidQueryError, NotRegistered, NotUniqueError, SaveConditionError) | ||||||
|  | from mongoengine.mongodb_support import MONGODB_34, MONGODB_36, get_mongodb_version | ||||||
|  | from mongoengine.pymongo_support import list_collection_names | ||||||
|  | from mongoengine.queryset import NULLIFY, Q | ||||||
|  | from tests import fixtures | ||||||
|  | from tests.fixtures import (PickleDynamicEmbedded, PickleDynamicTest, \ | ||||||
|  |                             PickleEmbedded, PickleSignalsTest, PickleTest) | ||||||
|  | from tests.utils import MongoDBTestCase, get_as_pymongo | ||||||
|  |  | ||||||
| TEST_IMAGE_PATH = os.path.join(os.path.dirname(__file__), | TEST_IMAGE_PATH = os.path.join(os.path.dirname(__file__), | ||||||
|                                '../fields/mongoengine.png') |                                '../fields/mongoengine.png') | ||||||
| @@ -1260,6 +1257,50 @@ class InstanceTest(MongoDBTestCase): | |||||||
|         self.assertTrue(w1.toggle) |         self.assertTrue(w1.toggle) | ||||||
|         self.assertEqual(w1.count, 3) |         self.assertEqual(w1.count, 3) | ||||||
|  |  | ||||||
|  |     def test_save_update_selectively(self): | ||||||
|  |         class WildBoy(Document): | ||||||
|  |             age = IntField() | ||||||
|  |             name = StringField() | ||||||
|  |  | ||||||
|  |         WildBoy.drop_collection() | ||||||
|  |  | ||||||
|  |         WildBoy(age=12, name='John').save() | ||||||
|  |  | ||||||
|  |         boy1 = WildBoy.objects().first() | ||||||
|  |         boy2 = WildBoy.objects().first() | ||||||
|  |  | ||||||
|  |         boy1.age = 99 | ||||||
|  |         boy1.save() | ||||||
|  |         boy2.name = 'Bob' | ||||||
|  |         boy2.save() | ||||||
|  |  | ||||||
|  |         fresh_boy = WildBoy.objects().first() | ||||||
|  |         self.assertEqual(fresh_boy.age, 99) | ||||||
|  |         self.assertEqual(fresh_boy.name, 'Bob') | ||||||
|  |  | ||||||
|  |     def test_save_update_selectively_with_custom_pk(self): | ||||||
|  |         # Prevents regression of #2082 | ||||||
|  |         class WildBoy(Document): | ||||||
|  |             pk_id = StringField(primary_key=True) | ||||||
|  |             age = IntField() | ||||||
|  |             name = StringField() | ||||||
|  |  | ||||||
|  |         WildBoy.drop_collection() | ||||||
|  |  | ||||||
|  |         WildBoy(pk_id='A', age=12, name='John').save() | ||||||
|  |  | ||||||
|  |         boy1 = WildBoy.objects().first() | ||||||
|  |         boy2 = WildBoy.objects().first() | ||||||
|  |  | ||||||
|  |         boy1.age = 99 | ||||||
|  |         boy1.save() | ||||||
|  |         boy2.name = 'Bob' | ||||||
|  |         boy2.save() | ||||||
|  |  | ||||||
|  |         fresh_boy = WildBoy.objects().first() | ||||||
|  |         self.assertEqual(fresh_boy.age, 99) | ||||||
|  |         self.assertEqual(fresh_boy.name, 'Bob') | ||||||
|  |  | ||||||
|     def test_update(self): |     def test_update(self): | ||||||
|         """Ensure that an existing document is updated instead of be |         """Ensure that an existing document is updated instead of be | ||||||
|         overwritten. |         overwritten. | ||||||
| @@ -1552,9 +1593,9 @@ class InstanceTest(MongoDBTestCase): | |||||||
|                 EmbeddedChildModel) |                 EmbeddedChildModel) | ||||||
|  |  | ||||||
|         emb = EmbeddedChildModel(id={'1': [1]}) |         emb = EmbeddedChildModel(id={'1': [1]}) | ||||||
|         ParentModel(children=emb)._get_changed_fields() |         ParentModel(child=emb)._get_changed_fields() | ||||||
|  |  | ||||||
|     def test__get_changed_fields_same_ids_reference_field_does_not_enters_infinite_loop(self): |     def test__get_changed_fields_same_ids_reference_field_does_not_enters_infinite_loop_full_caseEmailUser(self): | ||||||
|         class User(Document): |         class User(Document): | ||||||
|             id = IntField(primary_key=True) |             id = IntField(primary_key=True) | ||||||
|             name = StringField() |             name = StringField() | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user