better support of virtual fields in grid by accessing new sqlrows.colnames_fields, thanks Paolo

This commit is contained in:
mdipierro
2019-02-17 17:02:24 -08:00
parent 001b77b5f3
commit bf23e7bb0e
2 changed files with 18 additions and 17 deletions
+17 -16
View File
@@ -2450,11 +2450,6 @@ class SQLFORM(FORM):
tablenames = merge_tablemaps(tablenames, db._adapter.tables(join)) tablenames = merge_tablemaps(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 iteritems(table):
if isinstance(f, Field.Virtual):
f.tablename = table._tablename
columns = [f for f in fields if f.tablename in tablenames and f.listable] columns = [f for f in fields if f.tablename in tablenames and f.listable]
else: else:
fields = [] fields = []
@@ -2684,13 +2679,13 @@ class SQLFORM(FORM):
dbset = dbset(SQLFORM.build_query( dbset = dbset(SQLFORM.build_query(
sfields, keywords)) sfields, keywords))
rows = dbset.select(left=left, orderby=orderby, rows = dbset.select(left=left, orderby=orderby,
cacheable=True, *expcolumns) cacheable=True, *selectable_columns)
except Exception as e: except Exception as e:
response.flash = T('Internal Error') response.flash = T('Internal Error')
rows = [] rows = []
else: else:
rows = dbset.select(left=left, orderby=orderby, rows = dbset.select(left=left, orderby=orderby,
cacheable=True, *expcolumns) cacheable=True, *selectable_columns)
value = exportManager[export_type] value = exportManager[export_type]
clazz = value[0] if hasattr(value, '__getitem__') else value clazz = value[0] if hasattr(value, '__getitem__') else value
@@ -3425,16 +3420,22 @@ class SQLTABLE(TABLE):
(components, row) = (self.components, []) (components, row) = (self.components, [])
if not sqlrows: if not sqlrows:
return return
REGEX_TABLE_DOT_FIELD = sqlrows.db._adapter.REGEX_TABLE_DOT_FIELD fieldlist = sqlrows.colnames_fields
fieldmap = dict(list(zip(sqlrows.colnames, sqlrows.fields))) fieldmap = dict(zip(sqlrows.colnames, fieldlist))
tablemap = dict(((f.tablename, f.table) if isinstance(f, Field) else (f._table._tablename, f._table) for f in fieldmap.values())) if columns:
for table in tablemap.values(): tablenames = []
pref = table._tablename + '.' for colname, field in fieldmap.iteritems():
fieldmap.update(((pref+f.name, f) for f in table._virtual_fields)) if isinstance(field, (Field, Field.Virtual)):
fieldmap.update(((pref+f.name, f) for f in table._virtual_methods)) tablenames.append(field.tablename)
field_types = (Field, Field.Virtual, Field.Method) elif isinstance(field, Expression):
if not columns: tablenames.append(field._table._tablename)
for tablename in set(tablenames):
table = sqlrows.db[tablename]
fieldmap.update((("%s.%s" % (tablename, f.name), f) for f in table._virtual_fields + table._virtual_methods))
else:
columns = list(sqlrows.colnames) columns = list(sqlrows.colnames)
field_types = (Field, Field.Virtual, Field.Method)
header_func = { header_func = {
'fieldname:capitalize': lambda f: f.name.replace('_', ' ').title(), 'fieldname:capitalize': lambda f: f.name.replace('_', ' ').title(),
'labels': lambda f: f.label 'labels': lambda f: f.label