fix virtual fields with SQLFORM.grid fields=

Conflicts:
	gluon/sqlhtml.py
This commit is contained in:
Tim Richardson
2013-10-12 13:59:39 +11:00
parent 1356dc1ef0
commit 436bd7b39c
+13 -8
View File
@@ -1912,13 +1912,18 @@ class SQLFORM(FORM):
for join in left: for join in left:
tablenames += db._adapter.tables(join) tablenames += db._adapter.tables(join)
tables = [db[tablename] for tablename in tablenames] tables = [db[tablename] for tablename in tablenames]
if fields: if fields:
#add missing tablename to virtual fields
for table in tables:
for k,f in table.iteritems():
if isinstance(f,Field.Virtual):
f.tablename = table._tablename
columns = [f for f in fields if f.tablename in tablenames] columns = [f for f in fields if f.tablename in tablenames]
else: else:
fields = [] fields = []
columns = [] columns = []
filter1 = lambda f:isinstance(f,Field) virtual_columns = []
filter2 = lambda f:isinstance(f,Field) and f.readable
for table in tables: for table in tables:
fields += filter(filter1, table) fields += filter(filter1, table)
columns += filter(filter2, table) columns += filter(filter2, table)
@@ -1926,8 +1931,10 @@ class SQLFORM(FORM):
if not k.startswith('_'): if not k.startswith('_'):
if isinstance(f,Field.Virtual) and f.readable: if isinstance(f,Field.Virtual) and f.readable:
f.tablename = table._tablename f.tablename = table._tablename
columns.append(f) #show virtual fields after real fields so put at end of list
fields.append(f) virtual_columns.append(f) #add to fields as well
fields = fields + virtual_columns
columns = columns + virtual_columns
if not field_id: if not field_id:
if groupby is None: if groupby is None:
@@ -2271,11 +2278,9 @@ class SQLFORM(FORM):
limitby = (paginate*page,paginate*(page+1)) limitby = (paginate*page,paginate*(page+1))
else: else:
limitby = None limitby = None
try: try:
table_fields = filter( table_fields = [field for field in fields
lambda f: (f.tablename in tablenames) and \ if (field.tablename in tablenames and not(isinstance(field,Field.Virtual)))]
(not(isinstance(f,Field.Virtual))),fields)
if dbset._db._adapter.dbengine=='google:datastore': if dbset._db._adapter.dbengine=='google:datastore':
rows = dbset.select(left=left,orderby=orderby, rows = dbset.select(left=left,orderby=orderby,
groupby=groupby,limitby=limitby, groupby=groupby,limitby=limitby,