From 378e86124b598f2773cf124beab853ad63b71ee9 Mon Sep 17 00:00:00 2001 From: Mike Bayer Date: Sat, 28 Jan 2012 10:45:23 -0500 Subject: [PATCH] - [bug] Fixed regression from 0.7.4 whereby using an already instrumented column from a superclass as "polymorphic_on" failed to resolve the underlying Column. [ticket:2345] --- CHANGES | 5 +++++ lib/sqlalchemy/orm/mapper.py | 2 +- test/ext/test_declarative.py | 19 ++++++++++++++++++- 3 files changed, 24 insertions(+), 2 deletions(-) diff --git a/CHANGES b/CHANGES index 7c3c6b9f7e..0c42b1f783 100644 --- a/CHANGES +++ b/CHANGES @@ -16,6 +16,11 @@ CHANGES restore_snapshot() is called a second time, discarding those changes. [ticket:2389] + - [bug] Fixed regression from 0.7.4 whereby + using an already instrumented column from a + superclass as "polymorphic_on" failed to resolve + the underlying Column. [ticket:2345] + - [feature] Added "class_registry" argument to declarative_base(). Allows two or more declarative bases to share the same registry of class names. diff --git a/lib/sqlalchemy/orm/mapper.py b/lib/sqlalchemy/orm/mapper.py index 13b5b3e471..4c952c1fd5 100644 --- a/lib/sqlalchemy/orm/mapper.py +++ b/lib/sqlalchemy/orm/mapper.py @@ -128,7 +128,7 @@ class Mapper(object): self.batch = batch self.eager_defaults = eager_defaults self.column_prefix = column_prefix - self.polymorphic_on = polymorphic_on + self.polymorphic_on = expression._clause_element_as_expr(polymorphic_on) self._dependency_processors = [] self.validators = util.immutabledict() self.passive_updates = passive_updates diff --git a/test/ext/test_declarative.py b/test/ext/test_declarative.py index 3069c2bfec..69042b5c84 100644 --- a/test/ext/test_declarative.py +++ b/test/ext/test_declarative.py @@ -1,6 +1,6 @@ from test.lib.testing import eq_, assert_raises, \ - assert_raises_message + assert_raises_message, is_ from sqlalchemy.ext import declarative as decl from sqlalchemy import exc import sqlalchemy as sa @@ -1855,6 +1855,23 @@ class DeclarativeInheritanceTest(DeclarativeTestBase): eq_(sess.query(Engineer).filter_by(primary_language='cobol' ).one(), Engineer(name='vlad', primary_language='cobol')) + def test_polymorphic_on_converted_from_inst(self): + class A(Base): + __tablename__ = 'A' + id = Column(Integer, primary_key=True) + discriminator = Column(String) + + @declared_attr + def __mapper_args__(cls): + return { + 'polymorphic_identity': cls.__name__, + 'polymorphic_on': cls.discriminator + } + + class B(A): + pass + is_(B.__mapper__.polymorphic_on, A.__table__.c.discriminator) + def test_add_deferred(self): class Person(Base, fixtures.ComparableEntity): -- 2.47.2