summaryrefslogtreecommitdiff
path: root/lib/sqlalchemy
diff options
context:
space:
mode:
authormike bayer <mike_mp@zzzcomputing.com>2018-08-23 17:58:04 -0400
committerGerrit Code Review <gerrit@ci.zzzcomputing.com>2018-08-23 17:58:04 -0400
commitc6427fe14090d2d06a4d7c4c398be1f6e6a771f1 (patch)
treeb0b3fb1afe4d1e83d27906ac696619fd4d393720 /lib/sqlalchemy
parent1b5393db36a6c4353d41c7065b29a377d7c3b9b2 (diff)
parent626356842d77d4ec6427b3bfc04bdff93d24d246 (diff)
downloadsqlalchemy-c6427fe14090d2d06a4d7c4c398be1f6e6a771f1.tar.gz
Merge "Unwrap Proxy objects when scanning declared_attr"
Diffstat (limited to 'lib/sqlalchemy')
-rw-r--r--lib/sqlalchemy/ext/declarative/base.py16
-rw-r--r--lib/sqlalchemy/orm/attributes.py2
-rw-r--r--lib/sqlalchemy/orm/base.py7
-rw-r--r--lib/sqlalchemy/orm/descriptor_props.py1
4 files changed, 23 insertions, 3 deletions
diff --git a/lib/sqlalchemy/ext/declarative/base.py b/lib/sqlalchemy/ext/declarative/base.py
index 818b92c98..9e15582d6 100644
--- a/lib/sqlalchemy/ext/declarative/base.py
+++ b/lib/sqlalchemy/ext/declarative/base.py
@@ -11,7 +11,7 @@ from ...orm import mapper, class_mapper, synonym
from ...orm.interfaces import MapperProperty
from ...orm.properties import ColumnProperty, CompositeProperty
from ...orm.attributes import QueryableAttribute
-from ...orm.base import _is_mapped_class
+from ...orm.base import _is_mapped_class, InspectionAttr
from ... import util, exc
from ...util import topological
from ...sql import expression
@@ -287,8 +287,18 @@ class _MapperConfig(object):
util.warn_deprecated(
"Use of sqlalchemy.util.classproperty on "
"declarative classes is deprecated.")
- dict_[name] = column_copies[obj] = \
- ret = getattr(cls, name)
+ # access attribute using normal class access
+ ret = getattr(cls, name)
+
+ # correct for proxies created from hybrid_property
+ # or similar. note there is no known case that
+ # produces nested proxies, so we are only
+ # looking one level deep right now.
+ if isinstance(ret, InspectionAttr) and \
+ ret._is_internal_proxy:
+ ret = ret.descriptor
+
+ dict_[name] = column_copies[obj] = ret
if isinstance(ret, (Column, MapperProperty)) and \
ret.doc is None:
ret.doc = obj.__doc__
diff --git a/lib/sqlalchemy/orm/attributes.py b/lib/sqlalchemy/orm/attributes.py
index 0bbe70655..745032e44 100644
--- a/lib/sqlalchemy/orm/attributes.py
+++ b/lib/sqlalchemy/orm/attributes.py
@@ -271,6 +271,8 @@ def create_proxied_attribute(descriptor):
self._adapt_to_entity = adapt_to_entity
self.__doc__ = doc
+ _is_internal_proxy = True
+
@property
def property(self):
return self.comparator.property
diff --git a/lib/sqlalchemy/orm/base.py b/lib/sqlalchemy/orm/base.py
index 8c9d56269..e06e1fc78 100644
--- a/lib/sqlalchemy/orm/base.py
+++ b/lib/sqlalchemy/orm/base.py
@@ -475,6 +475,13 @@ class InspectionAttr(object):
"""
+ _is_internal_proxy = False
+ """True if this object is an internal proxy object.
+
+ .. versionadded:: 1.2.12
+
+ """
+
is_clause_element = False
"""True if this object is an instance of :class:`.ClauseElement`."""
diff --git a/lib/sqlalchemy/orm/descriptor_props.py b/lib/sqlalchemy/orm/descriptor_props.py
index a8db3fe1c..aaf53b698 100644
--- a/lib/sqlalchemy/orm/descriptor_props.py
+++ b/lib/sqlalchemy/orm/descriptor_props.py
@@ -500,6 +500,7 @@ class ConcreteInheritedProperty(DescriptorProperty):
(self.parent, self.key, self.parent))
class NoninheritedConcreteProp(object):
+
def __set__(s, obj, value):
warn()