From: Mike Bayer Date: Tue, 17 Oct 2006 18:05:32 +0000 (+0000) Subject: restored "synonym" property X-Git-Tag: rel_0_3_0~34 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=9e74371d5320e11f34ee5009267174f5a5c482b4;p=thirdparty%2Fsqlalchemy%2Fsqlalchemy.git restored "synonym" property --- diff --git a/lib/sqlalchemy/orm/__init__.py b/lib/sqlalchemy/orm/__init__.py index 4ec3eb91e1..d2d8bd5327 100644 --- a/lib/sqlalchemy/orm/__init__.py +++ b/lib/sqlalchemy/orm/__init__.py @@ -46,7 +46,8 @@ def mapper(class_, table=None, *args, **params): return Mapper(class_, table, *args, **params) def synonym(name): - return SynonymProperty(name) + """set up 'name' as a synonym to another MapperProperty.""" + return properties.SynonymProperty(name) def clear_mappers(): """remove all mappers that have been created thus far. when new mappers are diff --git a/lib/sqlalchemy/orm/properties.py b/lib/sqlalchemy/orm/properties.py index 3d4006e2f0..d409352e45 100644 --- a/lib/sqlalchemy/orm/properties.py +++ b/lib/sqlalchemy/orm/properties.py @@ -19,7 +19,27 @@ import util as mapperutil import sets, random from interfaces import * - + +class SynonymProperty(MapperProperty): + def __init__(self, name): + self.name = name + def setup(self, querycontext, **kwargs): + pass + def execute(self, selectcontext, instance, row, identitykey, isnew): + pass + def do_init(self): + class SynonymProp(object): + def __set__(s, obj, value): + setattr(obj, self.name, value) + self.set(None, obj, value) + def __delete__(s, obj): + delattr(obj, self.name) + def __get__(s, obj, owner): + if obj is None: + return s + return getattr(obj, self.name) + setattr(self.parent.class_, self.key, SynonymProp()) + class ColumnProperty(StrategizedProperty): """describes an object attribute that corresponds to a table column.""" def __init__(self, *columns, **kwargs): diff --git a/lib/sqlalchemy/orm/query.py b/lib/sqlalchemy/orm/query.py index 462c5e7991..b436adb014 100644 --- a/lib/sqlalchemy/orm/query.py +++ b/lib/sqlalchemy/orm/query.py @@ -123,6 +123,8 @@ class Query(object): seen.add(mapper_) if mapper_.props.has_key(key): prop = mapper_.props[key] + if isinstance(prop, properties.SynonymProperty): + prop = mapper_.props[prop.name] if isinstance(prop, properties.PropertyLoader): keys.insert(0, prop.key) return prop diff --git a/test/orm/mapper.py b/test/orm/mapper.py index 2c7eab385f..9b6717010c 100644 --- a/test/orm/mapper.py +++ b/test/orm/mapper.py @@ -350,6 +350,17 @@ class MapperTest(MapperSuperTest): 'foo' : users.c.user_name, }) + def testsynonym(self): + sess = create_session() + mapper(User, users, properties = dict( + addresses = relation(mapper(Address, addresses), lazy = True), + uname = synonym('user_name'), + adlist = synonym('addresses') + )) + + u = sess.query(User).get_by(uname='jack') + self.assert_result(u.adlist, Address, *(user_address_result[0]['addresses'][1])) + def testeageroptions(self): """tests that a lazy relation can be upgraded to an eager relation via the options method""" sess = create_session()