From 56c544edab96654976214acd0226efca9c168b89 Mon Sep 17 00:00:00 2001 From: Mike Bayer Date: Sat, 8 Dec 2007 19:56:11 +0000 Subject: [PATCH] [ticket:888] continued, synonym add_prop --- lib/sqlalchemy/orm/mapper.py | 3 ++- lib/sqlalchemy/topological.py | 1 + test/orm/mapper.py | 38 ++++++++++++++++++++++++++++------- 3 files changed, 34 insertions(+), 8 deletions(-) diff --git a/lib/sqlalchemy/orm/mapper.py b/lib/sqlalchemy/orm/mapper.py index ae4711beb8..20aa4aa641 100644 --- a/lib/sqlalchemy/orm/mapper.py +++ b/lib/sqlalchemy/orm/mapper.py @@ -554,6 +554,7 @@ class Mapper(object): def __init__(self, class_, key): self.class_ = class_ self.key = key + self.existing_prop = getattr(class_, key, None) def __getattribute__(self, key): cls = object.__getattribute__(self, 'class_') @@ -671,7 +672,7 @@ class Mapper(object): elif isinstance(prop, SynonymProperty): prop.instrument = getattr(self.class_, key, None) if isinstance(prop.instrument, Mapper._CompileOnAttr): - prop.instrument = None + prop.instrument = object.__getattribute__(prop.instrument, 'existing_prop') if prop.map_column: if not key in self.select_table.c: raise exceptions.ArgumentError("Can't compile synonym '%s': no column on table '%s' named '%s'" % (prop.name, self.select_table.description, key)) diff --git a/lib/sqlalchemy/topological.py b/lib/sqlalchemy/topological.py index d8ed550b0d..bd8b45f95f 100644 --- a/lib/sqlalchemy/topological.py +++ b/lib/sqlalchemy/topological.py @@ -166,6 +166,7 @@ class _EdgeCollection(object): def _sort(tuples, allitems, allow_cycles=False, ignore_self_cycles=False): nodes = {} edges = _EdgeCollection() + for item in list(allitems) + [t[0] for t in tuples] + [t[1] for t in tuples]: if id(item) not in nodes: node = _Node(item) diff --git a/test/orm/mapper.py b/test/orm/mapper.py index bde51b222e..84a2d5f241 100644 --- a/test/orm/mapper.py +++ b/test/orm/mapper.py @@ -164,21 +164,31 @@ class MapperTest(MapperSuperTest): assert getattr(Foo().__class__, 'user_name').impl is not None def test_add_property(self): + assert_col = [] + class User(object): + def _get_user_name(self): + assert_col.append(('get', self._user_name)) + return self._user_name + def _set_user_name(self, name): + assert_col.append(('set', name)) + self._user_name = name + user_name = property(_get_user_name, _set_user_name) + m = mapper(User, users) mapper(Address, addresses) - m.add_property('user_name', deferred(users.c.user_name)) - m.add_property('name', synonym('user_name')) + m.add_property('_user_name', deferred(users.c.user_name)) + m.add_property('user_name', synonym('_user_name')) m.add_property('addresses', relation(Address)) sess = create_session(transactional=True) assert sess.query(User).get(7) - - u = sess.query(User).filter_by(name='jack').one() + + u = sess.query(User).filter_by(user_name='jack').one() def go(): self.assert_result([u], User, user_address_result[0]) assert u.user_name == 'jack' - assert u.name == 'jack' + assert assert_col == [('get', 'jack')], str(assert_col) self.assert_sql_count(testbase.db, go, 2) u.name = 'ed' @@ -415,9 +425,20 @@ class MapperTest(MapperSuperTest): def test_synonym(self): sess = create_session() + + assert_col = [] + class User(object): + def _get_user_name(self): + assert_col.append(('get', self.user_name)) + return self.user_name + def _set_user_name(self, name): + assert_col.append(('set', name)) + self.user_name = name + uname = property(_get_user_name, _set_user_name) + mapper(User, users, properties = dict( addresses = relation(mapper(Address, addresses), lazy = True), - uname = synonym('user_name', proxy=True), + uname = synonym('user_name'), adlist = synonym('addresses', proxy=True), adname = synonym('addresses') )) @@ -430,7 +451,7 @@ class MapperTest(MapperSuperTest): u = sess.query(User).filter(User.uname=='jack').one() self.assert_result(u.adlist, Address, *(user_address_result[0]['addresses'][1])) - + addr = sess.query(Address).get_by(address_id=user_address_result[0]['addresses'][1][0]['address_id']) u = sess.query(User).filter_by(adname=addr).one() u2 = sess.query(User).filter_by(adlist=addr).one() @@ -439,7 +460,10 @@ class MapperTest(MapperSuperTest): assert u not in sess.dirty u.uname = "some user name" + assert len(assert_col) > 0 + assert assert_col == [('set', 'some user name')], str(assert_col) assert u.uname == "some user name" + assert assert_col == [('set', 'some user name'), ('get', 'some user name')], str(assert_col) assert u.user_name == "some user name" assert u in sess.dirty -- 2.47.3