summaryrefslogtreecommitdiff
path: root/lib/sqlalchemy/orm/events.py
diff options
context:
space:
mode:
authorMike Bayer <mike_mp@zzzcomputing.com>2012-10-28 12:55:36 -0400
committerMike Bayer <mike_mp@zzzcomputing.com>2012-10-28 12:55:36 -0400
commit8498087654cfcea3f4abbc771d801d7af5947496 (patch)
tree6fa83618f2241b251f013f5e1b2616205c48dfdc /lib/sqlalchemy/orm/events.py
parent5f73cf9c514b6e6bd0d52b95397e165d9a82db67 (diff)
downloadsqlalchemy-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.py13
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