]> git.ipfire.org Git - thirdparty/sqlalchemy/sqlalchemy.git/commitdiff
- MapperExtension.before_update() and after_update() are now called
authorMike Bayer <mike_mp@zzzcomputing.com>
Sat, 29 Dec 2007 18:33:27 +0000 (18:33 +0000)
committerMike Bayer <mike_mp@zzzcomputing.com>
Sat, 29 Dec 2007 18:33:27 +0000 (18:33 +0000)
symmetrically; previously, an instance that had no modified column
attributes (but had a relation() modification) could be called with
before_update() but not after_update() [ticket:907]

CHANGES
lib/sqlalchemy/orm/mapper.py
test/orm/mapper.py

diff --git a/CHANGES b/CHANGES
index 2e4c88642b3cbe9372f981d7ef5614cf9efeb0b6..8f379be1a7cb78a311980af96ccfebe8d700d2dd 100644 (file)
--- a/CHANGES
+++ b/CHANGES
@@ -100,6 +100,11 @@ CHANGES
      instance of the extension for both mappers.
      [ticket:490]
 
+   - MapperExtension.before_update() and after_update() are now called
+     symmetrically; previously, an instance that had no modified column
+     attributes (but had a relation() modification) could be called with 
+     before_update() but not after_update() [ticket:907]
+     
    - columns which are missing from a Query's select statement
      now get automatically deferred during load.
      
index dca3c97b1b27da839bb1ab7033c8f38043bd6bfc..bec5d5c6ee193a0b2b51828613503d4cb41b7a79 100644 (file)
@@ -1125,15 +1125,14 @@ class Mapper(object):
 
         if not postupdate:
             # call after_XXX extensions
-            for state, connection in inserted_objects:
-                mapper = _state_mapper(state)
-                if 'after_insert' in mapper.extension.methods:
-                    mapper.extension.after_insert(mapper, connection, state.obj())
-
-            for state, connection in updated_objects:
+            for state, connection, has_identity in tups:
                 mapper = _state_mapper(state)
-                if 'after_update' in mapper.extension.methods:
-                    mapper.extension.after_update(mapper, connection, state.obj())
+                if not has_identity:
+                    if 'after_insert' in mapper.extension.methods:
+                        mapper.extension.after_insert(mapper, connection, state.obj())
+                else:
+                    if 'after_update' in mapper.extension.methods:
+                        mapper.extension.after_update(mapper, connection, state.obj())
     
     def _postfetch(self, connection, table, state, resultproxy, params, value_params):
         """After an ``INSERT`` or ``UPDATE``, assemble newly generated
index a7cb3a57d31d07a594c54b87ce74194e5917ee3b..e1aca134579f7e525a1f889c29be174b22ab73dc 100644 (file)
@@ -1237,6 +1237,28 @@ class MapperExtensionTest(PersistTest):
         self.assertEquals(methods, ['before_insert', 'after_insert', 'load', 'translate_row', 'populate_instance', 'get', 
             'translate_row', 'create_instance', 'populate_instance', 'before_update', 'after_update', 'before_delete', 'after_delete'])
 
+    def test_after_with_no_changes(self):
+        # test that after_update is called even if no cols were updated
+        
+        mapper(Item, orderitems, extension=Ext() , properties={
+            'keywords':relation(Keyword, secondary=itemkeywords)
+        })
+        mapper(Keyword, keywords, extension=Ext() )
+        
+        sess = create_session()
+        i1 = Item()
+        k1 = Keyword('blue')
+        sess.save(i1)
+        sess.save(k1)
+        sess.flush()
+        self.assertEquals(methods, ['before_insert', 'after_insert', 'before_insert', 'after_insert'])
+
+        methods[:] = []
+        i1.keywords.append(k1)
+        sess.flush()
+        self.assertEquals(methods, ['before_update', 'after_update'])
+        
+        
     def test_inheritance_with_dupes(self):
         # test using inheritance, same extension on both mappers
         class AdminUser(User):