From 436bd7b39c877faeb4bf838fa96fa847b11fb145 Mon Sep 17 00:00:00 2001 From: Tim Richardson Date: Thu, 10 Oct 2013 10:20:29 +1100 Subject: [PATCH 1/3] 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, From c526cedd41fd129bd260fc8f3c8899fdf729dbd8 Mon Sep 17 00:00:00 2001 From: Tim Richardson Date: Sat, 12 Oct 2013 14:37:14 +1100 Subject: [PATCH 2/3] completed merge of virtual fields in fields arguemnt for SQLFORM.grid --- gluon/sqlhtml.py | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/gluon/sqlhtml.py b/gluon/sqlhtml.py index 101e9a23..3e2521c5 100644 --- a/gluon/sqlhtml.py +++ b/gluon/sqlhtml.py @@ -1925,11 +1925,13 @@ class SQLFORM(FORM): columns = [] virtual_columns = [] for table in tables: - fields += filter(filter1, table) - columns += filter(filter2, table) for k,f in table.iteritems(): if not k.startswith('_'): - if isinstance(f,Field.Virtual) and f.readable: + if isinstance(f,Field): + fields.append(f) #what gets selected + if f.readable: + columns.append(f) #what gets shown + elif isinstance(f,Field.Virtual) and f.readable: f.tablename = table._tablename #show virtual fields after real fields so put at end of list virtual_columns.append(f) #add to fields as well From cff267c9c60d9599e9959cd6b948cac5297233ca Mon Sep 17 00:00:00 2001 From: Tim Richardson Date: Sat, 12 Oct 2013 23:25:59 +1100 Subject: [PATCH 3/3] This fixes SQLFORM.grid virtualfields with fields= --- gluon/sqlhtml.py | 21 ++++++++------------- 1 file changed, 8 insertions(+), 13 deletions(-) diff --git a/gluon/sqlhtml.py b/gluon/sqlhtml.py index 3e2521c5..60aec2ad 100644 --- a/gluon/sqlhtml.py +++ b/gluon/sqlhtml.py @@ -1912,9 +1912,8 @@ 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 + #add missing tablename to virtual fields for table in tables: for k,f in table.iteritems(): if isinstance(f,Field.Virtual): @@ -1923,21 +1922,17 @@ class SQLFORM(FORM): else: fields = [] columns = [] - virtual_columns = [] + filter1 = lambda f:isinstance(f,Field) + filter2 = lambda f:isinstance(f,Field) and f.readable for table in tables: + fields += filter(filter1, table) + columns += filter(filter2, table) for k,f in table.iteritems(): if not k.startswith('_'): - if isinstance(f,Field): - fields.append(f) #what gets selected - if f.readable: - columns.append(f) #what gets shown - elif isinstance(f,Field.Virtual) and f.readable: + if isinstance(f,Field.Virtual) and f.readable: f.tablename = table._tablename - #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 - + fields.append(f) + columns.append(f) if not field_id: if groupby is None: field_id = tables[0]._id