Merge pull request #1966 from tjhall13/1965-fix-position-op-with-nested-list-in-embedded-document
Fix bug #1965 of $position and $push operators do not work with nested list
This commit is contained in:
		
							
								
								
									
										1
									
								
								AUTHORS
									
									
									
									
									
								
							
							
						
						
									
										1
									
								
								AUTHORS
									
									
									
									
									
								
							@@ -247,3 +247,4 @@ that much better:
 | 
				
			|||||||
 * Erdenezul Batmunkh (https://github.com/erdenezul)
 | 
					 * Erdenezul Batmunkh (https://github.com/erdenezul)
 | 
				
			||||||
 * Andy Yankovsky (https://github.com/werat)
 | 
					 * Andy Yankovsky (https://github.com/werat)
 | 
				
			||||||
 * Bastien Gérard (https://github.com/bagerard)
 | 
					 * Bastien Gérard (https://github.com/bagerard)
 | 
				
			||||||
 | 
					 * Trevor Hall (https://github.com/tjhall13)
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -6,6 +6,11 @@ Development
 | 
				
			|||||||
===========
 | 
					===========
 | 
				
			||||||
- (Fill this out as you fix issues and develop your features).
 | 
					- (Fill this out as you fix issues and develop your features).
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					=================
 | 
				
			||||||
 | 
					Changes in 0.16.3
 | 
				
			||||||
 | 
					=================
 | 
				
			||||||
 | 
					- Fix $push with $position operator not working with lists in embedded document #1965
 | 
				
			||||||
 | 
					
 | 
				
			||||||
=================
 | 
					=================
 | 
				
			||||||
Changes in 0.16.2
 | 
					Changes in 0.16.2
 | 
				
			||||||
=================
 | 
					=================
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -345,7 +345,7 @@ def update(_doc_cls=None, **update):
 | 
				
			|||||||
            value = {key: {'$each': value}}
 | 
					            value = {key: {'$each': value}}
 | 
				
			||||||
        elif op in ('push', 'pushAll'):
 | 
					        elif op in ('push', 'pushAll'):
 | 
				
			||||||
            if parts[-1].isdigit():
 | 
					            if parts[-1].isdigit():
 | 
				
			||||||
                key = parts[0]
 | 
					                key = '.'.join(parts[0:-1])
 | 
				
			||||||
                position = int(parts[-1])
 | 
					                position = int(parts[-1])
 | 
				
			||||||
                # $position expects an iterable. If pushing a single value,
 | 
					                # $position expects an iterable. If pushing a single value,
 | 
				
			||||||
                # wrap it in a list.
 | 
					                # wrap it in a list.
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -842,10 +842,16 @@ class InstanceTest(MongoDBTestCase):
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    @requires_mongodb_gte_26
 | 
					    @requires_mongodb_gte_26
 | 
				
			||||||
    def test_modify_with_positional_push(self):
 | 
					    def test_modify_with_positional_push(self):
 | 
				
			||||||
 | 
					        class Content(EmbeddedDocument):
 | 
				
			||||||
 | 
					            keywords = ListField(StringField())
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        class BlogPost(Document):
 | 
					        class BlogPost(Document):
 | 
				
			||||||
            tags = ListField(StringField())
 | 
					            tags = ListField(StringField())
 | 
				
			||||||
 | 
					            content = EmbeddedDocumentField(Content)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        post = BlogPost.objects.create(
 | 
				
			||||||
 | 
					            tags=['python'], content=Content(keywords=['ipsum']))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        post = BlogPost.objects.create(tags=['python'])
 | 
					 | 
				
			||||||
        self.assertEqual(post.tags, ['python'])
 | 
					        self.assertEqual(post.tags, ['python'])
 | 
				
			||||||
        post.modify(push__tags__0=['code', 'mongo'])
 | 
					        post.modify(push__tags__0=['code', 'mongo'])
 | 
				
			||||||
        self.assertEqual(post.tags, ['code', 'mongo', 'python'])
 | 
					        self.assertEqual(post.tags, ['code', 'mongo', 'python'])
 | 
				
			||||||
@@ -856,6 +862,16 @@ class InstanceTest(MongoDBTestCase):
 | 
				
			|||||||
            ['code', 'mongo', 'python']
 | 
					            ['code', 'mongo', 'python']
 | 
				
			||||||
        )
 | 
					        )
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        self.assertEqual(post.content.keywords, ['ipsum'])
 | 
				
			||||||
 | 
					        post.modify(push__content__keywords__0=['lorem'])
 | 
				
			||||||
 | 
					        self.assertEqual(post.content.keywords, ['lorem', 'ipsum'])
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        # Assert same order of the list items is maintained in the db
 | 
				
			||||||
 | 
					        self.assertEqual(
 | 
				
			||||||
 | 
					            BlogPost._get_collection().find_one({'_id': post.pk})['content']['keywords'],
 | 
				
			||||||
 | 
					            ['lorem', 'ipsum']
 | 
				
			||||||
 | 
					        )
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def test_save(self):
 | 
					    def test_save(self):
 | 
				
			||||||
        """Ensure that a document may be saved in the database."""
 | 
					        """Ensure that a document may be saved in the database."""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user