summaryrefslogtreecommitdiff
path: root/lib/sqlalchemy
diff options
context:
space:
mode:
Diffstat (limited to 'lib/sqlalchemy')
-rw-r--r--lib/sqlalchemy/ext/declarative/base.py21
1 files changed, 21 insertions, 0 deletions
diff --git a/lib/sqlalchemy/ext/declarative/base.py b/lib/sqlalchemy/ext/declarative/base.py
index e35ae085a..7d4020b24 100644
--- a/lib/sqlalchemy/ext/declarative/base.py
+++ b/lib/sqlalchemy/ext/declarative/base.py
@@ -35,6 +35,21 @@ def _declared_mapping_info(cls):
return None
+def _resolve_for_abstract(cls):
+ if cls is object:
+ return None
+
+ if _get_immediate_cls_attr(cls, '__abstract__'):
+ for sup in cls.__bases__:
+ sup = _resolve_for_abstract(sup)
+ if sup is not None:
+ return sup
+ else:
+ return None
+ else:
+ return cls
+
+
def _get_immediate_cls_attr(cls, attrname):
"""return an attribute of the class that is either present directly
on the class, e.g. not on a superclass, or is from a superclass but
@@ -46,6 +61,9 @@ def _get_immediate_cls_attr(cls, attrname):
inherit from.
"""
+ if not issubclass(cls, object):
+ return None
+
for base in cls.__mro__:
_is_declarative_inherits = hasattr(base, '_decl_class_registry')
if attrname in base.__dict__:
@@ -389,6 +407,9 @@ class _MapperConfig(object):
table_args = self.table_args
declared_columns = self.declared_columns
for c in cls.__bases__:
+ c = _resolve_for_abstract(c)
+ if c is None:
+ continue
if _declared_mapping_info(c) is not None and \
not _get_immediate_cls_attr(
c, '_sa_decl_prepare_nocascade'):