From ac9a007c507dbf31a55f1f8beb6da54a7aadedc5 Mon Sep 17 00:00:00 2001 From: Mike Bayer Date: Wed, 8 Jun 2011 17:37:42 -0400 Subject: [PATCH] - Added the same "columns-only" check to mapper.polymorphic_on as used in relationship.order_by, foreign_keys, remote_side, etc. --- CHANGES | 6 ++++++ lib/sqlalchemy/orm/mapper.py | 4 +++- lib/sqlalchemy/sql/expression.py | 11 +++++++++-- test/orm/inheritance/test_basic.py | 13 +++++++++++++ 4 files changed, 31 insertions(+), 3 deletions(-) diff --git a/CHANGES b/CHANGES index 9eeeb725ae..bcd1461e47 100644 --- a/CHANGES +++ b/CHANGES @@ -5,6 +5,12 @@ CHANGES ======= 0.7.2 ===== +- orm + - Added the same "columns-only" check to + mapper.polymorphic_on as used in + relationship.order_by, foreign_keys, + remote_side, etc. + - mssql - Adjusted the pyodbc dialect such that bound values are passed as bytes and not unicode diff --git a/lib/sqlalchemy/orm/mapper.py b/lib/sqlalchemy/orm/mapper.py index 7d6e0e5a8a..6e97aaf25e 100644 --- a/lib/sqlalchemy/orm/mapper.py +++ b/lib/sqlalchemy/orm/mapper.py @@ -127,7 +127,9 @@ 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._only_column_elements_or_none( + polymorphic_on, + "polymorphic_on") self._dependency_processors = [] self._validators = {} self.passive_updates = passive_updates diff --git a/lib/sqlalchemy/sql/expression.py b/lib/sqlalchemy/sql/expression.py index ec08014053..8eb552de9e 100644 --- a/lib/sqlalchemy/sql/expression.py +++ b/lib/sqlalchemy/sql/expression.py @@ -1334,12 +1334,19 @@ def _no_literals(element): else: return element +def _only_column_elements_or_none(element, name): + if element is None: + return None + else: + return _only_column_elements(element, name) + def _only_column_elements(element, name): if hasattr(element, '__clause_element__'): element = element.__clause_element__() if not isinstance(element, ColumnElement): - raise exc.ArgumentError("Column-based expression object expected for argument '%s'; " - "got: '%s', type %s" % (name, element, type(element))) + raise exc.ArgumentError( + "Column-based expression object expected for argument " + "'%s'; got: '%s', type %s" % (name, element, type(element))) return element def _corresponding_column_or_error(fromclause, column, diff --git a/test/orm/inheritance/test_basic.py b/test/orm/inheritance/test_basic.py index ce1d8028d4..7b991a618e 100644 --- a/test/orm/inheritance/test_basic.py +++ b/test/orm/inheritance/test_basic.py @@ -86,6 +86,19 @@ class PolymorphicOnNotLocalTest(fixtures.MappedTest): Column('y', String(10)), Column('xid', ForeignKey('t1.id'))) + def test_non_col_polymorphic_on(self): + class InterfaceBase(object): + pass + + assert_raises_message( + sa_exc.ArgumentError, + "Column-based expression object expected " + "for argument 'polymorphic_on'; got: " + "'im not a column', type", + mapper, + InterfaceBase, t2, polymorphic_on="im not a column" + ) + def test_bad_polymorphic_on(self): t2, t1 = self.tables.t2, self.tables.t1 -- 2.39.5