diff options
| author | Mike Bayer <mike_mp@zzzcomputing.com> | 2008-03-18 20:59:52 +0000 |
|---|---|---|
| committer | Mike Bayer <mike_mp@zzzcomputing.com> | 2008-03-18 20:59:52 +0000 |
| commit | 13475937e4cdbd1ffaa98d2c426dd118f7edd74f (patch) | |
| tree | 9cb56906825195e8f9f43806078e3bb6cd09d1b5 /lib/sqlalchemy/orm/dependency.py | |
| parent | b9a67d1458ad4a307e9f25625731c8e85c2f2daf (diff) | |
| download | sqlalchemy-13475937e4cdbd1ffaa98d2c426dd118f7edd74f.tar.gz | |
- fixed/added coverage for various cascade scenarios
- added coverage for some extra cases in dynamic relations
- removed some unused methods from unitofwork
Diffstat (limited to 'lib/sqlalchemy/orm/dependency.py')
| -rw-r--r-- | lib/sqlalchemy/orm/dependency.py | 35 |
1 files changed, 21 insertions, 14 deletions
diff --git a/lib/sqlalchemy/orm/dependency.py b/lib/sqlalchemy/orm/dependency.py index 8b41d93dd..425b171df 100644 --- a/lib/sqlalchemy/orm/dependency.py +++ b/lib/sqlalchemy/orm/dependency.py @@ -217,16 +217,21 @@ class OneToManyDP(DependencyProcessor): if delete: # head object is being deleted, and we manage its list of child objects # the child objects have to have their foreign key to the parent set to NULL - if not self.post_update and not self.cascade.delete and not self.passive_deletes=='all': + if not self.post_update: + should_null_fks = not self.cascade.delete and not self.passive_deletes=='all' for state in deplist: (added, unchanged, deleted) = uowcommit.get_attribute_history(state, self.key,passive=self.passive_deletes) if unchanged or deleted: for child in deleted: if child is not None and self.hasparent(child) is False: - uowcommit.register_object(child) - for child in unchanged: - if child is not None: - uowcommit.register_object(child) + if self.cascade.delete_orphan: + uowcommit.register_object(child, isdelete=True) + else: + uowcommit.register_object(child) + if should_null_fks: + for child in unchanged: + if child is not None: + uowcommit.register_object(child) else: for state in deplist: (added, unchanged, deleted) = uowcommit.get_attribute_history(state, self.key,passive=True) @@ -249,8 +254,6 @@ class OneToManyDP(DependencyProcessor): uowcommit.register_object(child) def _synchronize(self, state, child, associationrow, clearkeys, uowcommit): - if child is not None: - child = getattr(child, '_state', child) source = state dest = child if dest is None or (not self.post_update and uowcommit.is_deleted(dest)): @@ -338,15 +341,19 @@ class ManyToOneDP(DependencyProcessor): if self.post_update: return if delete: - if self.cascade.delete: + if self.cascade.delete or self.cascade.delete_orphan: for state in deplist: (added, unchanged, deleted) = uowcommit.get_attribute_history(state, self.key,passive=self.passive_deletes) - if deleted or unchanged: - for child in deleted + unchanged: - if child is not None and self.hasparent(child) is False: - uowcommit.register_object(child, isdelete=True) - for c, m in self.mapper.cascade_iterator('delete', child): - uowcommit.register_object(c._state, isdelete=True) + if self.cascade.delete_orphan: + todelete = added + unchanged + deleted + else: + todelete = added + unchanged + for child in todelete: + if child is None: + continue + uowcommit.register_object(child, isdelete=True) + for c, m in self.mapper.cascade_iterator('delete', child): + uowcommit.register_object(c._state, isdelete=True) else: for state in deplist: uowcommit.register_object(state) |
