]> git.ipfire.org Git - thirdparty/sqlalchemy/sqlalchemy.git/commitdiff
allow __tablename__ to come from a mixin
authorChris Withers <chris@simplistix.co.uk>
Mon, 1 Mar 2010 18:10:23 +0000 (18:10 +0000)
committerChris Withers <chris@simplistix.co.uk>
Mon, 1 Mar 2010 18:10:23 +0000 (18:10 +0000)
lib/sqlalchemy/ext/declarative.py
test/ext/test_declarative.py

index 65c9df13339b75b915c5c0a58c7fbc756b643101..12b79c79651669215d772ac6e9133a1714f6e7e0 100644 (file)
@@ -546,6 +546,9 @@ def _as_declarative(cls, classname, dict_):
                     dict_[name]=column_copies[obj]=obj.copy()
             mapper_args = mapper_args or getattr(base,'__mapper_args__',mapper_args)
             table_args = table_args or getattr(base,'__table_args__',None)
+            tablename = getattr(base,'__tablename__',None)
+            if tablename:
+                dict_['__tablename__']=tablename
 
     # make sure that column copies are used rather than the original columns
     # from any mixins
index de608e76aebc91aaef59b7510dda98625014e34d..a22a9581ea436bbaa86cb322a9d48fb4523096b0 100644 (file)
@@ -1846,6 +1846,49 @@ class DeclarativeMixinTest(DeclarativeTestBase):
         eq_(obj.foo(),'bar1')
         eq_(obj.baz,'fu')
         
+    def test_table_name_inherited(self):
+        
+        class MyMixin:
+            @classproperty
+            def __tablename__(cls):
+                return cls.__name__.lower()
+            id =  Column(Integer, primary_key=True)
+
+        class MyModel(Base,MyMixin):
+            pass
+
+        eq_(MyModel.__table__.name,'mymodel')
+    
+    def test_table_name_not_inherited(self):
+        
+        class MyMixin:
+            @classproperty
+            def __tablename__(cls):
+                return cls.__name__.lower()
+            id =  Column(Integer, primary_key=True)
+
+        class MyModel(Base,MyMixin):
+            __tablename__ = 'overridden'
+
+        eq_(MyModel.__table__.name,'overridden')
+    
+    def test_table_name_inheritance_order(self):
+        
+        class MyMixin1:
+            @classproperty
+            def __tablename__(cls):
+                return cls.__name__.lower()+'1'
+
+        class MyMixin2:
+            @classproperty
+            def __tablename__(cls):
+                return cls.__name__.lower()+'2'
+            
+        class MyModel(Base,MyMixin1,MyMixin2):
+            id =  Column(Integer, primary_key=True)
+
+        eq_(MyModel.__table__.name,'mymodel1')
+    
     def test_table_args_inherited(self):
         
         class MyMixin: