From: Mike Bayer Date: Sun, 8 Aug 2010 19:52:50 +0000 (-0400) Subject: - merge tip X-Git-Tag: rel_0_7b1~252^2~9 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=56e628ea203219a7492c17e60eb58cd55c7d5caf;p=thirdparty%2Fsqlalchemy%2Fsqlalchemy.git - merge tip - fixes --- 56e628ea203219a7492c17e60eb58cd55c7d5caf diff --cc lib/sqlalchemy/orm/mapper.py index 1895798b16,74853dbbae..0a89ac7807 --- a/lib/sqlalchemy/orm/mapper.py +++ b/lib/sqlalchemy/orm/mapper.py @@@ -1075,11 -1089,9 +1075,11 @@@ class Mapper(object) def _is_userland_descriptor(self, obj): return not isinstance(obj, -- (MapperProperty, attributes.InstrumentedAttribute)) and \ - hasattr(obj, '__get__') - ++ (MapperProperty, attributes.QueryableAttribute)) and \ + hasattr(obj, '__get__') and not \ + isinstance(obj.__get__(None, obj), + attributes.QueryableAttribute) + def _should_exclude(self, name, assigned_name, local): """determine whether a particular property should be implicitly present on the class. diff --cc lib/sqlalchemy/orm/properties.py index 09c5042ff3,cbfba91f32..f50d1e077c --- a/lib/sqlalchemy/orm/properties.py +++ b/lib/sqlalchemy/orm/properties.py @@@ -237,66 -237,9 +237,65 @@@ class CompositeProperty(ColumnProperty) def __str__(self): return str(self.parent.class_.__name__) + "." + self.key - class DescriptorProperty(MapperProperty): """:class:`MapperProperty` which proxies access to a - plain descriptor.""" + user-defined descriptor.""" + + def instrument_class(self, mapper): + from sqlalchemy.ext import hybrid + + # hackety hack hack + class _ProxyImpl(object): + accepts_scalar_loader = False + expire_missing = True + + def __init__(self, key): + self.key = key + + if self.descriptor is None: + desc = getattr(mapper.class_, self.key, None) + if mapper._is_userland_descriptor(desc): + self.descriptor = desc + + if self.descriptor is None: + def fset(obj, value): + setattr(obj, self.name, value) + def fdel(obj): + delattr(obj, self.name) + def fget(obj): + return getattr(obj, self.name) + fget.__doc__ = self.doc + + descriptor = hybrid.property_( + fget=fget, + fset=fset, + fdel=fdel, + ) + elif isinstance(self.descriptor, property): + descriptor = hybrid.property_( + fget=self.descriptor.fget, + fset=self.descriptor.fset, + fdel=self.descriptor.fdel, + ) + else: + descriptor = hybrid.property_( + fget=self.descriptor.__get__, + fset=self.descriptor.__set__, + fdel=self.descriptor.__delete__, + ) + + proxy_attr = attributes.\ + create_proxied_attribute(self.descriptor or descriptor)\ + ( + self.key, + self.descriptor or descriptor, + lambda: self._comparator_factory(mapper) + ) + def get_comparator(owner): + return proxy_attr + descriptor.expr = get_comparator + descriptor.impl = _ProxyImpl(self.key) + mapper.class_manager.instrument_attribute(self.key, descriptor) def setup(self, context, entity, path, adapter, **kwargs): pass @@@ -307,7 -250,8 +306,7 @@@ def merge(self, session, source_state, source_dict, dest_state, dest_dict, load, _recursive): pass - + - class ConcreteInheritedProperty(DescriptorProperty): """A 'do nothing' :class:`MapperProperty` that disables an attribute on a concrete subclass that is only present @@@ -366,17 -314,9 +365,18 @@@ class SynonymProperty(DescriptorPropert self.doc = doc or (descriptor and descriptor.__doc__) or None util.set_creation_order(self) + def _comparator_factory(self, mapper): + prop = getattr(mapper.class_, self.name).property + + if self.comparator_factory: + comp = self.comparator_factory(prop, mapper) + else: + comp = prop.comparator_factory(prop, mapper) + return comp + def set_parent(self, parent, init): if self.map_column: + # implement the 'map_column' option. if self.key not in parent.mapped_table.c: raise sa_exc.ArgumentError( "Can't compile synonym '%s': no column on table " diff --cc lib/sqlalchemy/orm/util.py index 49f572572c,0f4adec001..be2b024a2c --- a/lib/sqlalchemy/orm/util.py +++ b/lib/sqlalchemy/orm/util.py @@@ -546,7 -548,7 +546,7 @@@ def _entity_descriptor(entity, key) """ if not isinstance(entity, (AliasedClass, type)): entity = entity.class_ - - ++ try: return getattr(entity, key) except AttributeError: