diff options
author | Mike Bayer <mike_mp@zzzcomputing.com> | 2012-10-28 12:55:36 -0400 |
---|---|---|
committer | Mike Bayer <mike_mp@zzzcomputing.com> | 2012-10-28 12:55:36 -0400 |
commit | 8498087654cfcea3f4abbc771d801d7af5947496 (patch) | |
tree | 6fa83618f2241b251f013f5e1b2616205c48dfdc /lib/sqlalchemy/orm/events.py | |
parent | 5f73cf9c514b6e6bd0d52b95397e165d9a82db67 (diff) | |
download | sqlalchemy-8498087654cfcea3f4abbc771d801d7af5947496.tar.gz |
- cover additional cases for [ticket:2585], where events are applied to base class
after subclasses are already mapped
Diffstat (limited to 'lib/sqlalchemy/orm/events.py')
-rw-r--r-- | lib/sqlalchemy/orm/events.py | 13 |
1 files changed, 12 insertions, 1 deletions
diff --git a/lib/sqlalchemy/orm/events.py b/lib/sqlalchemy/orm/events.py index a36377681..858c6e5a3 100644 --- a/lib/sqlalchemy/orm/events.py +++ b/lib/sqlalchemy/orm/events.py @@ -338,8 +338,16 @@ class _EventsHold(object): collection.append((target.class_, identifier, fn, raw, propagate)) + if propagate: + for subject_dispatch, (subclass, subject) in \ + target.established.items(): + if issubclass(subclass, target.class_): + subject_dispatch._listen(subject, identifier, fn, + raw=raw, propagate=propagate) + @classmethod def populate(cls, class_, subject): + cls.established[subject.dispatch] = (class_, subject) for subclass in class_.__mro__: if subclass in cls.all_holds: if subclass is class_: @@ -348,10 +356,12 @@ class _EventsHold(object): collection = cls.all_holds[subclass] for target, ident, fn, raw, propagate in collection: if propagate or subclass is class_: - subject.dispatch._listen(subject, ident, fn, raw, propagate) + subject.dispatch._listen(subject, ident, + fn, raw, propagate) class _InstanceEventsHold(_EventsHold): all_holds = weakref.WeakKeyDictionary() + established = weakref.WeakKeyDictionary() class HoldInstanceEvents(_EventsHold.HoldEvents, InstanceEvents): pass @@ -1019,6 +1029,7 @@ class MapperEvents(event.Events): class _MapperEventsHold(_EventsHold): all_holds = weakref.WeakKeyDictionary() + established = weakref.WeakKeyDictionary() class HoldMapperEvents(_EventsHold.HoldEvents, MapperEvents): pass |