Author: luke
Date: 2007-02-21 08:24:43 -0700 (Wed, 21 Feb 2007)
New Revision: 2337
Modified:
SQLObject/branches/sqlbuilder-views/sqlobject/include/
SQLObject/branches/sqlbuilder-views/sqlobject/include/pydispatch/
SQLObject/branches/sqlbuilder-views/sqlobject/inheritance/
SQLObject/branches/sqlbuilder-views/sqlobject/inheritance/__init__.py
SQLObject/branches/sqlbuilder-views/sqlobject/inheritance/tests/
SQLObject/branches/sqlbuilder-views/sqlobject/sqlbuilder.py
SQLObject/branches/sqlbuilder-views/sqlobject/tests/
SQLObject/branches/sqlbuilder-views/sqlobject/tests/test_sqlbuilder_importproxy.py
SQLObject/branches/sqlbuilder-views/sqlobject/util/
SQLObject/branches/sqlbuilder-views/sqlobject/versioning/
SQLObject/branches/sqlbuilder-views/sqlobject/versioning/test/
SQLObject/branches/sqlbuilder-views/sqlobject/views.py
Log:
ImportProxy inside aliases
Property changes on: SQLObject/branches/sqlbuilder-views/sqlobject/include
___________________________________________________________________
Name: svn:ignore
+ *.pyc
*.pyo
*~
Property changes on: SQLObject/branches/sqlbuilder-views/sqlobject/include/pydispatch
___________________________________________________________________
Name: svn:ignore
+ *.pyc
*.pyo
*~
Property changes on: SQLObject/branches/sqlbuilder-views/sqlobject/inheritance
___________________________________________________________________
Name: svn:ignore
+ *.pyc
*.pyo
*~
Modified: SQLObject/branches/sqlbuilder-views/sqlobject/inheritance/__init__.py
===================================================================
--- SQLObject/branches/sqlbuilder-views/sqlobject/inheritance/__init__.py 2007-02-21 06:23:02 UTC (rev 2336)
+++ SQLObject/branches/sqlbuilder-views/sqlobject/inheritance/__init__.py 2007-02-21 15:24:43 UTC (rev 2337)
@@ -13,13 +13,13 @@
basestring = (types.StringType, types.UnicodeType)
-def tablesUsedDict(obj):
+def tablesUsedDict(obj, db):
if hasattr(obj, "tablesUsedDict"):
- return obj.tablesUsedDict()
+ return obj.tablesUsedDict(db)
elif isinstance(obj, (tuple, list)):
d = {}
for component in obj:
- d.update(tablesUsedDict(component))
+ d.update(tablesUsedDict(component, db))
return d
else:
return {}
@@ -35,14 +35,14 @@
dbName = (ops.get('connection',None) or sourceClass._connection).dbName
- tablesDict = sqlbuilder.tablesUsedDict(clause, dbName)
+ tablesDict = tablesUsedDict(clause, dbName)
tablesDict[sourceClass.sqlmeta.table] = 1
orderBy = ops.get('orderBy')
if inheritedTables:
for tableName in inheritedTables:
tablesDict[tableName] = 1
if orderBy and not isinstance(orderBy, basestring):
- tablesDict.update(sqlbuilder.tablesUsedDict(orderBy, dbName))
+ tablesDict.update(tablesUsedDict(orderBy, dbName))
#DSM: if this class has a parent, we need to link it
#DSM: and be sure the parent is in the table list.
#DSM: The following code is before clauseTables
Property changes on: SQLObject/branches/sqlbuilder-views/sqlobject/inheritance/tests
___________________________________________________________________
Name: svn:ignore
+ *.pyc
*.pyo
*~
Modified: SQLObject/branches/sqlbuilder-views/sqlobject/sqlbuilder.py
===================================================================
--- SQLObject/branches/sqlbuilder-views/sqlobject/sqlbuilder.py 2007-02-21 06:23:02 UTC (rev 2336)
+++ SQLObject/branches/sqlbuilder-views/sqlobject/sqlbuilder.py 2007-02-21 15:24:43 UTC (rev 2337)
@@ -416,7 +416,10 @@
self.aliasTable = aliasTable
def __sqlrepr__(self, db):
- return self.alias + "." + self.fieldName
+ fieldName = self.fieldName
+ if isinstance(fieldName, SQLExpression):
+ fieldName = sqlrepr(fieldName, db)
+ return self.alias + "." + fieldName
def tablesUsedImmediate(self):
return [self.aliasTable]
@@ -1146,10 +1149,14 @@
FieldClass = ImportProxyField
def __init__(self, clsName, registry=None):
self.tableName = _DelayClass(self, clsName)
+ self.sqlmeta = _Delay_proxy(table=_DelayClass(self, clsName))
self.q = self
self.soClass = None
classregistry.registry(registry).addClassCallback(clsName,lambda foreign, me: setattr(me, 'soClass', foreign), self)
+ def __nonzero__(self):
+ return True
+
def __getattr__(self, attr):
if self.soClass is None:
return _Delay(self, attr)
@@ -1163,15 +1170,32 @@
def __sqlrepr__(self, db):
if self.proxy.soClass is None:
return '_DELAYED_' + self.attr
- return sqlrepr(self._resolve(), db)
+ val = self._resolve()
+ if isinstance(val, SQLExpression):
+ val = sqlrepr(val, db)
+ return val
def _resolve(self):
return getattr(self.proxy, self.attr)
+
+ # For AliasTable etc
+ def fieldName(self):
+ class _aliasFieldName(SQLExpression):
+ def __init__(self, proxy):
+ self.proxy = proxy
+ def __sqlrepr__(self, db):
+ return self.proxy._resolve().fieldName
+ return _aliasFieldName(self)
+ fieldName = property(fieldName)
class _DelayClass(_Delay):
def _resolve(self):
return self.proxy.soClass.sqlmeta.table
+class _Delay_proxy(object):
+ def __init__(self, **kw):
+ self.__dict__.update(kw)
+
######
Property changes on: SQLObject/branches/sqlbuilder-views/sqlobject/tests
___________________________________________________________________
Name: svn:ignore
+ *.pyc
*.pyo
*~
Modified: SQLObject/branches/sqlbuilder-views/sqlobject/tests/test_sqlbuilder_importproxy.py
===================================================================
--- SQLObject/branches/sqlbuilder-views/sqlobject/tests/test_sqlbuilder_importproxy.py 2007-02-21 06:23:02 UTC (rev 2336)
+++ SQLObject/branches/sqlbuilder-views/sqlobject/tests/test_sqlbuilder_importproxy.py 2007-02-21 15:24:43 UTC (rev 2337)
@@ -1,7 +1,7 @@
from sqlobject import *
from sqlobject.tests.dbtest import *
from sqlobject.views import *
-from sqlobject.sqlbuilder import ImportProxy
+from sqlobject.sqlbuilder import ImportProxy, Alias
def testSimple():
nyi = ImportProxy('NotYetImported')
@@ -36,4 +36,16 @@
idName = NotYetImported3.q.id
name = StringCol(dbName=NotYetImported3.q.name)
- assert str(x) == 'not_yet_imported_v.name'
\ No newline at end of file
+ assert str(x) == 'not_yet_imported_v.name'
+
+def testAlias():
+ nyi = ImportProxy('NotYetImported4')
+ y = Alias(nyi, 'y')
+ x = y.q.name
+
+ class NotYetImported4(SQLObject):
+ name = StringCol(dbName='a_name')
+
+ assert str(y) == 'not_yet_imported4 y'
+ assert tablesUsedDict(x, None).keys() == ['not_yet_imported4 y']
+ assert str(x) == 'y.a_name'
\ No newline at end of file
Property changes on: SQLObject/branches/sqlbuilder-views/sqlobject/util
___________________________________________________________________
Name: svn:ignore
+ *.pyc
*.pyo
*~
Property changes on: SQLObject/branches/sqlbuilder-views/sqlobject/versioning
___________________________________________________________________
Name: svn:ignore
+ *.pyc
*.pyo
*~
Property changes on: SQLObject/branches/sqlbuilder-views/sqlobject/versioning/test
___________________________________________________________________
Name: svn:ignore
+ *.pyc
*.pyo
*~
Modified: SQLObject/branches/sqlbuilder-views/sqlobject/views.py
===================================================================
--- SQLObject/branches/sqlbuilder-views/sqlobject/views.py 2007-02-21 06:23:02 UTC (rev 2336)
+++ SQLObject/branches/sqlbuilder-views/sqlobject/views.py 2007-02-21 15:24:43 UTC (rev 2337)
@@ -89,10 +89,12 @@
else:
columns.append(ColumnAS(col.dbName, n))
+ metajoin = getattr(cls.sqlmeta, 'join', NoDefault)
clause = getattr(cls.sqlmeta, 'clause', NoDefault)
select = Select(columns,
distinct=True,
distinctOn=cls.sqlmeta.idName,
+ join=metajoin,
clause=clause)
if aggregates:
@@ -110,6 +112,7 @@
new_alias = Alias(
Select([ColumnAS(cls.sqlmeta.idName, agg_id), agg],
groupBy=cls.sqlmeta.idName,
+ join=metajoin,
clause=clause),
agg_alias)
agg_join = LEFTJOINOn(last,
|