From 68c8b13ed6b8f88d958f72f6d0721b25817c6636 Mon Sep 17 00:00:00 2001 From: Mike Bayer Date: Sun, 2 Aug 2009 17:51:33 +0000 Subject: - Simplified the sweep of instrumentation in strategies._register_attribute - Improved support for MapperProperty objects overriding that of an inherited mapper for non-concrete inheritance setups - attribute extensions won't randomly collide with each other. [ticket:1488] - Added AttributeExtension to sqlalchemy.orm.__all__ --- lib/sqlalchemy/orm/__init__.py | 2 ++ lib/sqlalchemy/orm/mapper.py | 3 +++ lib/sqlalchemy/orm/strategies.py | 5 +++-- 3 files changed, 8 insertions(+), 2 deletions(-) (limited to 'lib') diff --git a/lib/sqlalchemy/orm/__init__.py b/lib/sqlalchemy/orm/__init__.py index 4c4ec8513..2a20b05ef 100644 --- a/lib/sqlalchemy/orm/__init__.py +++ b/lib/sqlalchemy/orm/__init__.py @@ -26,6 +26,7 @@ from sqlalchemy.orm.interfaces import ( MapperExtension, PropComparator, SessionExtension, + AttributeExtension, ) from sqlalchemy.orm.util import ( AliasedClass as aliased, @@ -61,6 +62,7 @@ __all__ = ( 'EXT_STOP', 'InstrumentationManager', 'MapperExtension', + 'AttributeExtension', 'Validator', 'PropComparator', 'Query', diff --git a/lib/sqlalchemy/orm/mapper.py b/lib/sqlalchemy/orm/mapper.py index d53faacf7..078056a01 100644 --- a/lib/sqlalchemy/orm/mapper.py +++ b/lib/sqlalchemy/orm/mapper.py @@ -649,6 +649,9 @@ class Mapper(object): return self # initialize properties on all mappers + # note that _mapper_registry is unordered, which + # may randomly conceal/reveal issues related to + # the order of mapper compilation for mapper in list(_mapper_registry): if getattr(mapper, '_compile_failed', False): raise sa_exc.InvalidRequestError("One or more mappers failed to compile. Exception was probably " diff --git a/lib/sqlalchemy/orm/strategies.py b/lib/sqlalchemy/orm/strategies.py index 1da2231a3..f739fb1dd 100644 --- a/lib/sqlalchemy/orm/strategies.py +++ b/lib/sqlalchemy/orm/strategies.py @@ -45,9 +45,10 @@ def _register_attribute(strategy, mapper, useobject, if useobject: attribute_ext.append(sessionlib.UOWEventHandler(prop.key)) - + for m in mapper.polymorphic_iterator(): - if (m is prop.parent or not m.concrete) and m.has_property(prop.key): + if prop is m._props.get(prop.key): + attributes.register_attribute_impl( m.class_, prop.key, -- cgit v1.2.1