From: Mike Bayer Date: Tue, 3 Jun 2008 14:30:42 +0000 (+0000) Subject: - fixed bug preventing merge() from functioning in X-Git-Tag: rel_0_4_7~23 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=6bd2a1d804f179f365b3ebdb4adf79b6f50f4fb7;p=thirdparty%2Fsqlalchemy%2Fsqlalchemy.git - fixed bug preventing merge() from functioning in conjunction with a comparable_property() --- diff --git a/CHANGES b/CHANGES index 1abb13d832..3a9e678098 100644 --- a/CHANGES +++ b/CHANGES @@ -8,6 +8,9 @@ CHANGES will alias() the secondary (association) table so that multiple contains() calls will not conflict with each other [ticket:1058] + + - fixed bug preventing merge() from functioning in + conjunction with a comparable_property() - mysql - Added 'CALL' to the list of SQL keywords which return diff --git a/lib/sqlalchemy/orm/interfaces.py b/lib/sqlalchemy/orm/interfaces.py index d61ebe9603..841c19510b 100644 --- a/lib/sqlalchemy/orm/interfaces.py +++ b/lib/sqlalchemy/orm/interfaces.py @@ -402,7 +402,7 @@ class MapperProperty(object): return not self.parent.non_primary - def merge(self, session, source, dest): + def merge(self, session, source, dest, dont_load, _recursive): """Merge the attribute represented by this ``MapperProperty`` from source to destination object""" diff --git a/lib/sqlalchemy/orm/properties.py b/lib/sqlalchemy/orm/properties.py index db7b3a43f9..a06de1b79c 100644 --- a/lib/sqlalchemy/orm/properties.py +++ b/lib/sqlalchemy/orm/properties.py @@ -176,7 +176,7 @@ class SynonymProperty(MapperProperty): self.descriptor = SynonymProp() sessionlib.register_attribute(class_, self.key, uselist=False, proxy_property=self.descriptor, useobject=False, comparator=comparator) - def merge(self, session, source, dest, _recursive): + def merge(self, session, source, dest, dont_load, _recursive): pass SynonymProperty.logger = logging.class_logger(SynonymProperty) @@ -204,6 +204,9 @@ class ComparableProperty(MapperProperty): def create_row_processor(self, selectcontext, mapper, row): return (None, None, None) + def merge(self, session, source, dest, dont_load, _recursive): + pass + class PropertyLoader(StrategizedProperty): """Describes an object property that holds a single item or list diff --git a/test/orm/merge.py b/test/orm/merge.py index fd61ccc28c..5064aa709b 100644 --- a/test/orm/merge.py +++ b/test/orm/merge.py @@ -533,6 +533,32 @@ class MergeTest(TestBase, AssertsExecutionResults): except exceptions.InvalidRequestError, e: assert "dont_load=True option does not support" in str(e) + def test_synonym_comparable(self): + class User(object): + + class Comparator(PropComparator): + pass + + def _getValue(self): + return self._value + + def _setValue(self, value): + setattr(self, '_value', value) + + value = property(_getValue, _setValue) + + mapper(User, users, properties={ + 'uid':synonym('id'), + 'foobar':comparable_property(User.Comparator,User.value), + }) + + sess = create_session() + u = User() + u.name = 'ed' + sess.save(u) + sess.flush() + sess.expunge(u) + sess.merge(u) if __name__ == "__main__": testenv.main()