]> git.ipfire.org Git - thirdparty/sqlalchemy/sqlalchemy.git/commitdiff
restored "synonym" property
authorMike Bayer <mike_mp@zzzcomputing.com>
Tue, 17 Oct 2006 18:05:32 +0000 (18:05 +0000)
committerMike Bayer <mike_mp@zzzcomputing.com>
Tue, 17 Oct 2006 18:05:32 +0000 (18:05 +0000)
lib/sqlalchemy/orm/__init__.py
lib/sqlalchemy/orm/properties.py
lib/sqlalchemy/orm/query.py
test/orm/mapper.py

index 4ec3eb91e12306cbf104ac374332a2f70e5650d7..d2d8bd53277e447092be4fe558cdbe5bf60c7d32 100644 (file)
@@ -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 
index 3d4006e2f08b5a749ebb1020976b908ae2541710..d409352e45c62c008ff90301688cfa1a3ae3c331 100644 (file)
@@ -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):
index 462c5e799108f112c5d91c74b000b60f01b7873a..b436adb01452698cdbc694fc1625cfdb3314ea31 100644 (file)
@@ -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
index 2c7eab385f285fab56e8f5c70ebec2042d8fcf5f..9b6717010cfc6f5655ec858151e89d4f50e06718 100644 (file)
@@ -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()