@@ -1593,7 +1593,7 @@ def flush(cache):
1593
1593
cache .modified = False
1594
1594
1595
1595
for obj , status in saved_objects :
1596
- if obj is not None : obj ._after_save_ (status )
1596
+ obj ._after_save_ (status )
1597
1597
else :
1598
1598
if cache .modified : throw (TransactionError ,
1599
1599
'Recursion depth limit reached in obj._after_save_() call' )
@@ -4082,6 +4082,7 @@ def populate_criteria_list(criteria_list, columns, converters, params_count=0, t
4082
4082
statuses = set (['created' , 'cancelled' , 'loaded' , 'modified' , 'inserted' , 'updated' , 'marked_to_delete' , 'deleted' ])
4083
4083
del_statuses = set (['marked_to_delete' , 'deleted' , 'cancelled' ])
4084
4084
created_or_deleted_statuses = set (['created' ]) | del_statuses
4085
+ saved_statuses = set (['inserted' , 'updated' , 'deleted' ])
4085
4086
4086
4087
def throw_object_was_deleted (obj ):
4087
4088
assert obj ._status_ in del_statuses
@@ -4723,18 +4724,37 @@ def _save_(obj, dependent_objects=None):
4723
4724
cache = obj ._session_cache_
4724
4725
assert cache .is_alive
4725
4726
status = obj ._status_
4726
- if status in ('loaded' , 'inserted' , 'updated' , 'cancelled' ): return
4727
4727
4728
4728
if status in ('created' , 'modified' ):
4729
4729
obj ._save_principal_objects_ (dependent_objects )
4730
4730
4731
- obj ._save_pos_ = None
4732
4731
if status == 'created' : obj ._save_created_ ()
4733
4732
elif status == 'modified' : obj ._save_updated_ ()
4734
4733
elif status == 'marked_to_delete' : obj ._save_deleted_ ()
4735
- else : assert False # pragma: no cover
4734
+ else : assert False , "_save_() called for object %r with incorrect status %s" % (obj , status ) # pragma: no cover
4735
+
4736
+ assert obj ._status_ in saved_statuses
4737
+ obj ._save_pos_ = None
4736
4738
def flush (obj ):
4737
- with obj ._session_cache_ .flush_disabled (): obj ._save_ ()
4739
+ status = obj ._status_
4740
+ if status not in ('created' , 'modified' , 'marked_to_delete' ):
4741
+ return
4742
+
4743
+ save_pos = obj ._save_pos_
4744
+ assert save_pos is not None , 'save_pos is None for %s object' % status
4745
+
4746
+ with obj ._session_cache_ .flush_disabled ():
4747
+ obj ._before_save_ () # should be inside flush_disabled to prevent infinite recursion
4748
+ # TODO: add to documentation that flush is disabled inside before_xxx hooks
4749
+ obj ._save_ ()
4750
+
4751
+ objects_to_save = obj ._session_cache_ .objects_to_save
4752
+ if save_pos == len (objects_to_save ) - 1 :
4753
+ objects_to_save .pop ()
4754
+ else :
4755
+ objects_to_save [save_pos ] = None
4756
+
4757
+ obj ._after_save_ (status )
4738
4758
def _before_save_ (obj ):
4739
4759
status = obj ._status_
4740
4760
if status == 'created' : obj .before_insert ()
0 commit comments