From 436bd7b39c877faeb4bf838fa96fa847b11fb145 Mon Sep 17 00:00:00 2001 From: Tim Richardson Date: Thu, 10 Oct 2013 10:20:29 +1100 Subject: [PATCH] fix virtual fields with SQLFORM.grid fields= Conflicts: gluon/sqlhtml.py --- gluon/sqlhtml.py | 21 +++++++++++++-------- 1 file changed, 13 insertions(+), 8 deletions(-) diff --git a/gluon/sqlhtml.py b/gluon/sqlhtml.py index 44b73b08..101e9a23 100644 --- a/gluon/sqlhtml.py +++ b/gluon/sqlhtml.py @@ -1912,13 +1912,18 @@ class SQLFORM(FORM): for join in left: tablenames += db._adapter.tables(join) tables = [db[tablename] for tablename in tablenames] + 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] else: fields = [] columns = [] - filter1 = lambda f:isinstance(f,Field) - filter2 = lambda f:isinstance(f,Field) and f.readable + virtual_columns = [] for table in tables: fields += filter(filter1, table) columns += filter(filter2, table) @@ -1926,8 +1931,10 @@ class SQLFORM(FORM): if not k.startswith('_'): if isinstance(f,Field.Virtual) and f.readable: f.tablename = table._tablename - columns.append(f) - fields.append(f) + #show virtual fields after real fields so put at end of list + virtual_columns.append(f) #add to fields as well + fields = fields + virtual_columns + columns = columns + virtual_columns if not field_id: if groupby is None: @@ -2271,11 +2278,9 @@ class SQLFORM(FORM): limitby = (paginate*page,paginate*(page+1)) else: limitby = None - try: - table_fields = filter( - lambda f: (f.tablename in tablenames) and \ - (not(isinstance(f,Field.Virtual))),fields) + table_fields = [field for field in fields + if (field.tablename in tablenames and not(isinstance(field,Field.Virtual)))] if dbset._db._adapter.dbengine=='google:datastore': rows = dbset.select(left=left,orderby=orderby, groupby=groupby,limitby=limitby,