]> git.ipfire.org Git - thirdparty/sqlalchemy/sqlalchemy.git/commitdiff
- Fixed recursion issue which occured if a mapped object's
authorMike Bayer <mike_mp@zzzcomputing.com>
Mon, 31 Aug 2009 21:24:52 +0000 (21:24 +0000)
committerMike Bayer <mike_mp@zzzcomputing.com>
Mon, 31 Aug 2009 21:24:52 +0000 (21:24 +0000)
`__len__()` or `__nonzero__()` method resulted in state
changes.  [ticket:1501]

CHANGES
lib/sqlalchemy/orm/state.py
test/orm/test_mapper.py

diff --git a/CHANGES b/CHANGES
index 8f58c1d7379b39c59b9361f7ebbc20f62c441145..4018496c53d7048ffc0d2f90549a7ac8a14004b2 100644 (file)
--- a/CHANGES
+++ b/CHANGES
@@ -430,6 +430,10 @@ CHANGES
       http://www.sqlalchemy.org/trac/wiki/UsageRecipes/PreFilteredQuery
       for an example.
 
+    - Fixed recursion issue which occured if a mapped object's
+      `__len__()` or `__nonzero__()` method resulted in state
+      changes.  [ticket:1501]
+      
     - Fixed a somewhat hypothetical issue which would result
       in the wrong primary key being calculated for a mapper
       using the old polymorphic_union function - but this
index 25e557edae0215431892ca5d528b6558d9bbef24..3e80b703fd4aef1a1a4816461d30ac582d760edb 100644 (file)
@@ -289,7 +289,7 @@ class InstanceState(object):
                 instance_dict._modified.add(self)
 
         self.modified = True
-        if not self._strong_obj:
+        if self._strong_obj is None:
             self._strong_obj = self.obj()
 
     def commit(self, dict_, keys):
index 5d013b65cc0b46d580cdb3349e0a2a43b76ce655..250992049f456ee3ce53d6fe07777a1b20399b4d 100644 (file)
@@ -2631,7 +2631,35 @@ class RequirementsTest(_base.MappedTest):
                                   sa.orm.eagerload_all('h3s.h1s')).all()
         eq_(len(h1s), 5)
 
+    @testing.resolve_artifact_names
+    def test_nonzero_len_recursion(self):
+        class H1(object):
+            def __len__(self):
+                return len(self.get_value())
+            
+            def get_value(self):
+                self.value = "foobar"
+                return self.value
+
+        class H2(object):
+            def __nonzero__(self):
+                return bool(self.get_value())
 
+            def get_value(self):
+                self.value = "foobar"
+                return self.value
+                
+        mapper(H1, ht1)
+        mapper(H2, ht1)
+        
+        h1 = H1()
+        h1.value = "Asdf"
+        h1.value = "asdf asdf" # ding
+
+        h2 = H2()
+        h2.value = "Asdf"
+        h2.value = "asdf asdf" # ding
+        
 class MagicNamesTest(_base.MappedTest):
 
     @classmethod