|
1 | 1 | # -*- coding: utf-8 -*- |
2 | | -import bson |
3 | 2 | import os |
4 | 3 | import pickle |
5 | 4 | import unittest |
6 | 5 | import uuid |
7 | | -import warnings |
8 | 6 | import weakref |
9 | 7 | from datetime import datetime |
10 | 8 |
|
| 9 | +import bson |
11 | 10 | from bson import DBRef, ObjectId |
12 | 11 | from pymongo.errors import DuplicateKeyError |
13 | 12 | from six import iteritems |
14 | 13 |
|
15 | | -from mongoengine.mongodb_support import get_mongodb_version, MONGODB_36, MONGODB_34 |
16 | | -from mongoengine.pymongo_support import list_collection_names |
17 | | -from tests import fixtures |
18 | | -from tests.fixtures import (PickleEmbedded, PickleTest, PickleSignalsTest, |
19 | | - PickleDynamicEmbedded, PickleDynamicTest) |
20 | | -from tests.utils import MongoDBTestCase, get_as_pymongo |
21 | | - |
22 | 14 | from mongoengine import * |
23 | | -from mongoengine.base import get_document, _document_registry |
| 15 | +from mongoengine import signals |
| 16 | +from mongoengine.base import _document_registry, get_document |
24 | 17 | from mongoengine.connection import get_db |
25 | | -from mongoengine.errors import (NotRegistered, InvalidDocumentError, |
26 | | - InvalidQueryError, NotUniqueError, |
27 | | - FieldDoesNotExist, SaveConditionError) |
| 18 | +from mongoengine.context_managers import query_counter, switch_db |
| 19 | +from mongoengine.errors import (FieldDoesNotExist, InvalidDocumentError, \ |
| 20 | + InvalidQueryError, NotRegistered, NotUniqueError, SaveConditionError) |
| 21 | +from mongoengine.mongodb_support import MONGODB_34, MONGODB_36, get_mongodb_version |
| 22 | +from mongoengine.pymongo_support import list_collection_names |
28 | 23 | from mongoengine.queryset import NULLIFY, Q |
29 | | -from mongoengine.context_managers import switch_db, query_counter |
30 | | -from mongoengine import signals |
| 24 | +from tests import fixtures |
| 25 | +from tests.fixtures import (PickleDynamicEmbedded, PickleDynamicTest, \ |
| 26 | + PickleEmbedded, PickleSignalsTest, PickleTest) |
| 27 | +from tests.utils import MongoDBTestCase, get_as_pymongo |
31 | 28 |
|
32 | 29 | TEST_IMAGE_PATH = os.path.join(os.path.dirname(__file__), |
33 | 30 | '../fields/mongoengine.png') |
@@ -1260,6 +1257,50 @@ def UUID(i): |
1260 | 1257 | self.assertTrue(w1.toggle) |
1261 | 1258 | self.assertEqual(w1.count, 3) |
1262 | 1259 |
|
| 1260 | + def test_save_update_selectively(self): |
| 1261 | + class WildBoy(Document): |
| 1262 | + age = IntField() |
| 1263 | + name = StringField() |
| 1264 | + |
| 1265 | + WildBoy.drop_collection() |
| 1266 | + |
| 1267 | + WildBoy(age=12, name='John').save() |
| 1268 | + |
| 1269 | + boy1 = WildBoy.objects().first() |
| 1270 | + boy2 = WildBoy.objects().first() |
| 1271 | + |
| 1272 | + boy1.age = 99 |
| 1273 | + boy1.save() |
| 1274 | + boy2.name = 'Bob' |
| 1275 | + boy2.save() |
| 1276 | + |
| 1277 | + fresh_boy = WildBoy.objects().first() |
| 1278 | + self.assertEqual(fresh_boy.age, 99) |
| 1279 | + self.assertEqual(fresh_boy.name, 'Bob') |
| 1280 | + |
| 1281 | + def test_save_update_selectively_with_custom_pk(self): |
| 1282 | + # Prevents regression of #2082 |
| 1283 | + class WildBoy(Document): |
| 1284 | + pk_id = StringField(primary_key=True) |
| 1285 | + age = IntField() |
| 1286 | + name = StringField() |
| 1287 | + |
| 1288 | + WildBoy.drop_collection() |
| 1289 | + |
| 1290 | + WildBoy(pk_id='A', age=12, name='John').save() |
| 1291 | + |
| 1292 | + boy1 = WildBoy.objects().first() |
| 1293 | + boy2 = WildBoy.objects().first() |
| 1294 | + |
| 1295 | + boy1.age = 99 |
| 1296 | + boy1.save() |
| 1297 | + boy2.name = 'Bob' |
| 1298 | + boy2.save() |
| 1299 | + |
| 1300 | + fresh_boy = WildBoy.objects().first() |
| 1301 | + self.assertEqual(fresh_boy.age, 99) |
| 1302 | + self.assertEqual(fresh_boy.name, 'Bob') |
| 1303 | + |
1263 | 1304 | def test_update(self): |
1264 | 1305 | """Ensure that an existing document is updated instead of be |
1265 | 1306 | overwritten. |
@@ -1552,9 +1593,9 @@ class ParentModel(Document): |
1552 | 1593 | EmbeddedChildModel) |
1553 | 1594 |
|
1554 | 1595 | emb = EmbeddedChildModel(id={'1': [1]}) |
1555 | | - ParentModel(children=emb)._get_changed_fields() |
| 1596 | + ParentModel(child=emb)._get_changed_fields() |
1556 | 1597 |
|
1557 | | - def test__get_changed_fields_same_ids_reference_field_does_not_enters_infinite_loop(self): |
| 1598 | + def test__get_changed_fields_same_ids_reference_field_does_not_enters_infinite_loop_full_caseEmailUser(self): |
1558 | 1599 | class User(Document): |
1559 | 1600 | id = IntField(primary_key=True) |
1560 | 1601 | name = StringField() |
|
0 commit comments