]> git.ipfire.org Git - thirdparty/sqlalchemy/sqlalchemy.git/commitdiff
- Added the same "columns-only" check to
authorMike Bayer <mike_mp@zzzcomputing.com>
Wed, 8 Jun 2011 21:37:42 +0000 (17:37 -0400)
committerMike Bayer <mike_mp@zzzcomputing.com>
Wed, 8 Jun 2011 21:37:42 +0000 (17:37 -0400)
mapper.polymorphic_on as used in
relationship.order_by, foreign_keys,
remote_side, etc.

CHANGES
lib/sqlalchemy/orm/mapper.py
lib/sqlalchemy/sql/expression.py
test/orm/inheritance/test_basic.py

diff --git a/CHANGES b/CHANGES
index 9eeeb725ae795c2d8866eeec040fe15277899d77..bcd1461e47630b52727fdd932f258be3fe55274f 100644 (file)
--- 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
index 7d6e0e5a8a79bed8f547e7d84cca12ad510a705b..6e97aaf25e3df21ecb4e3c3e02614b14080c283e 100644 (file)
@@ -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
index ec08014053545eb941f268193fea5ff9b23d162c..8eb552de9e53bee42bbd4b9bb9f02034456046be 100644 (file)
@@ -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,
index ce1d8028d46bfe1acbb9af9e230f252078c1af7f..7b991a618ed1cff1e4d7b23a87fb51ca5f844ca3 100644 (file)
@@ -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