diff options
| author | Mike Bayer <mike_mp@zzzcomputing.com> | 2010-12-23 15:27:47 -0500 |
|---|---|---|
| committer | Mike Bayer <mike_mp@zzzcomputing.com> | 2010-12-23 15:27:47 -0500 |
| commit | 6cd730541f4e61fb8262ac50752c21cf1e7262ac (patch) | |
| tree | f6dceb9d0be15e5a101d6119182eb227b86f2958 /lib/sqlalchemy | |
| parent | e9d1b5b8de35dabc42d7dcf91c01783fa3133733 (diff) | |
| download | sqlalchemy-6cd730541f4e61fb8262ac50752c21cf1e7262ac.tar.gz | |
- restore declarative support for "composite"
- add an example of mutable scalars with events
Diffstat (limited to 'lib/sqlalchemy')
| -rwxr-xr-x | lib/sqlalchemy/ext/declarative.py | 4 | ||||
| -rw-r--r-- | lib/sqlalchemy/orm/attributes.py | 3 | ||||
| -rw-r--r-- | lib/sqlalchemy/orm/descriptor_props.py | 2 | ||||
| -rw-r--r-- | lib/sqlalchemy/orm/events.py | 10 | ||||
| -rw-r--r-- | lib/sqlalchemy/orm/mapper.py | 2 |
5 files changed, 17 insertions, 4 deletions
diff --git a/lib/sqlalchemy/ext/declarative.py b/lib/sqlalchemy/ext/declarative.py index 40abfbb29..5d3c7d29d 100755 --- a/lib/sqlalchemy/ext/declarative.py +++ b/lib/sqlalchemy/ext/declarative.py @@ -928,7 +928,7 @@ from sqlalchemy.schema import Table, Column, MetaData, _get_table_key from sqlalchemy.orm import synonym as _orm_synonym, mapper,\ comparable_property, class_mapper from sqlalchemy.orm.interfaces import MapperProperty -from sqlalchemy.orm.properties import RelationshipProperty, ColumnProperty +from sqlalchemy.orm.properties import RelationshipProperty, ColumnProperty, CompositeProperty from sqlalchemy.orm.util import _is_mapped_class from sqlalchemy import util, exceptions from sqlalchemy.sql import util as sql_util, expression @@ -1083,7 +1083,7 @@ def _as_declarative(cls, classname, dict_): # extract columns from the class dict cols = [] for key, c in our_stuff.iteritems(): - if isinstance(c, ColumnProperty): + if isinstance(c, (ColumnProperty, CompositeProperty)): for col in c.columns: if isinstance(col, Column) and col.table is None: _undefer_column_name(key, col) diff --git a/lib/sqlalchemy/orm/attributes.py b/lib/sqlalchemy/orm/attributes.py index 40a69d96a..ac6a498c7 100644 --- a/lib/sqlalchemy/orm/attributes.py +++ b/lib/sqlalchemy/orm/attributes.py @@ -149,7 +149,8 @@ def create_proxied_attribute(descriptor): class Proxy(QueryableAttribute): """A combination of InsturmentedAttribute and a regular descriptor.""" - def __init__(self, key, descriptor, comparator, adapter=None): + def __init__(self, class_, key, descriptor, comparator, adapter=None): + self.class_ = class_ self.key = key self.descriptor = descriptor self._comparator = comparator diff --git a/lib/sqlalchemy/orm/descriptor_props.py b/lib/sqlalchemy/orm/descriptor_props.py index 3344ed888..a1498bfd4 100644 --- a/lib/sqlalchemy/orm/descriptor_props.py +++ b/lib/sqlalchemy/orm/descriptor_props.py @@ -75,6 +75,7 @@ class DescriptorProperty(MapperProperty): proxy_attr = attributes.\ create_proxied_attribute(self.descriptor or descriptor)\ ( + self.parent.class_, self.key, self.descriptor or descriptor, lambda: self._comparator_factory(mapper) @@ -94,6 +95,7 @@ class CompositeProperty(DescriptorProperty): self.active_history = kwargs.get('active_history', False) self.deferred = kwargs.get('deferred', False) self.group = kwargs.get('group', None) + util.set_creation_order(self) def fget(instance): # this could be optimized to store the value in __dict__, diff --git a/lib/sqlalchemy/orm/events.py b/lib/sqlalchemy/orm/events.py index 6d1e8f713..f511b0e40 100644 --- a/lib/sqlalchemy/orm/events.py +++ b/lib/sqlalchemy/orm/events.py @@ -136,7 +136,15 @@ class InstanceEvents(event.Events): initialized, depending on what's present in the result rows. """ - + + def on_refresh(self, target): + """Receive an object instance after one or more attributes have + been refreshed. + + This hook is called after expired attributes have been reloaded. + + """ + def on_resurrect(self, target): """Receive an object instance as it is 'resurrected' from garbage collection, which occurs when a "dirty" state falls diff --git a/lib/sqlalchemy/orm/mapper.py b/lib/sqlalchemy/orm/mapper.py index 91d512ad0..f2bc04570 100644 --- a/lib/sqlalchemy/orm/mapper.py +++ b/lib/sqlalchemy/orm/mapper.py @@ -2291,6 +2291,8 @@ class Mapper(object): if loaded_instance: state.manager.dispatch.on_load(state) + elif isnew: + state.manager.dispatch.on_refresh(state) if result is not None: if append_result: |
