From 5add14bf682f8b50aed925542c8c996a197e7bbc Mon Sep 17 00:00:00 2001 From: mdipierro Date: Fri, 19 Jul 2013 03:28:11 -0500 Subject: [PATCH] possibly fixed a problem with virtualfields in fields option of SQLFORM.grid, thanks peckto --- VERSION | 2 +- gluon/dal.py | 21 ++++++++++----------- gluon/sqlhtml.py | 4 +++- 3 files changed, 14 insertions(+), 13 deletions(-) diff --git a/VERSION b/VERSION index 119bb72c..9507c0ac 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -Version 2.6.0-development+timestamp.2013.07.17.17.18.40 +Version 2.6.0-development+timestamp.2013.07.19.03.27.22 diff --git a/gluon/dal.py b/gluon/dal.py index 7a3b03bb..44b94278 100644 --- a/gluon/dal.py +++ b/gluon/dal.py @@ -1538,6 +1538,7 @@ class BaseAdapter(ConnectionPool): args_get = attributes.get tablenames = tables(query) tablenames_for_common_filters = tablenames + fields = [f for f in fields if not isinstance(f,Field.Virtual)] # skip virtual fields for field in fields: if isinstance(field, basestring) \ and REGEX_TABLE_DOT_FIELD.match(field): @@ -2109,19 +2110,17 @@ class BaseAdapter(ConnectionPool): rowsobj = Rows(db, new_rows, colnames, rawrows=rows) for tablename in virtualtables: - ### new style virtual fields table = db[tablename] - fields_virtual = [(f,v) for (f,v) in table.iteritems() - if isinstance(v,FieldVirtual)] - fields_lazy = [(f,v) for (f,v) in table.iteritems() - if isinstance(v,FieldMethod)] - if fields_virtual or fields_lazy: + all_fields = filter(lambda nv: nv[1] in fields and + isinstance(nv[1],(FieldVirtual,FieldMethod)), + table.iteritems()) + if all_fields: for row in rowsobj.records: - box = row[tablename] - for f,v in fields_virtual: - box[f] = v.f(row) - for f,v in fields_lazy: - box[f] = (v.handler or VirtualCommand)(v.f,row) + box = row[tablename] # CHECK THIS + for fieldname,field in all_fields: + box[fieldname] = field.f(row) \ + if isinstance(field,FieldVirtual) else \ + (field.handler or VirtualCommand)(field.f,row) ### old style virtual fields for item in table.virtualfields: diff --git a/gluon/sqlhtml.py b/gluon/sqlhtml.py index 502e50d3..52fd42a6 100644 --- a/gluon/sqlhtml.py +++ b/gluon/sqlhtml.py @@ -1928,6 +1928,7 @@ class SQLFORM(FORM): if isinstance(f,Field.Virtual) and f.readable: f.tablename = table._tablename columns.append(f) + fields.append(f) if not field_id: field_id = tables[0]._id if not any(str(f)==str(field_id) for f in fields): @@ -2239,7 +2240,7 @@ class SQLFORM(FORM): limitby = None try: - table_fields = [f for f in fields if f.tablename in tablenames] + table_fields = filter(lambda f: f.tablename in tablenames, fields) if dbset._db._adapter.dbengine=='google:datastore': rows = dbset.select(left=left,orderby=orderby, groupby=groupby,limitby=limitby, @@ -2247,6 +2248,7 @@ class SQLFORM(FORM): cacheable=True,*table_fields) next_cursor = dbset._db.get('_lastcursor', None) else: +# print('table_fields: %s' %([f_.name for f_ in table_fields],)) rows = dbset.select(left=left,orderby=orderby, groupby=groupby,limitby=limitby, cacheable=True,*table_fields)