Update SQLTABLE for API changes in PyDAL 17.01

This commit is contained in:
Martin Doucha
2017-02-28 22:12:54 +01:00
parent 16f60d5cff
commit 6954988851
+21 -20
View File
@@ -3311,23 +3311,28 @@ class SQLTABLE(TABLE):
if not sqlrows: if not sqlrows:
return return
REGEX_TABLE_DOT_FIELD = sqlrows.db._adapter.REGEX_TABLE_DOT_FIELD REGEX_TABLE_DOT_FIELD = sqlrows.db._adapter.REGEX_TABLE_DOT_FIELD
fieldmap = dict(zip(sqlrows.colnames, sqlrows.fields))
tablemap = dict(((f.tablename, f.table) for f in fieldmap.values()))
for table in tablemap.values():
pref = table._tablename + '.'
fieldmap.update(((pref+f.name, f) for f in table._virtual_fields))
fieldmap.update(((pref+f.name, f) for f in table._virtual_methods))
field_types = (Field, Field.Virtual, Field.Method)
if not columns: if not columns:
columns = list(sqlrows.colnames) columns = list(sqlrows.colnames)
if headers == 'fieldname:capitalize': header_func = {
'fieldname:capitalize': lambda f: f.name.replace('_', ' ').title(),
'labels': lambda f: f.label
}
if isinstance(headers, str) and headers in header_func:
make_name = header_func[headers]
headers = {} headers = {}
for c in columns: for c in columns:
tfmatch = REGEX_TABLE_DOT_FIELD.match(c) f = fieldmap.get(c)
if tfmatch: if isinstance(f, field_types):
(t, f) = REGEX_TABLE_DOT_FIELD.match(c).groups() headers[c] = make_name(f)
headers[t + '.' + f] = f.replace('_', ' ').title()
else: else:
headers[c] = REGEX_ALIAS_MATCH.sub(r'\2', c) headers[c] = REGEX_ALIAS_MATCH.sub(r'\2', c)
elif headers == 'labels':
headers = {}
for c in columns:
(t, f) = c.split('.')
field = sqlrows.db[t][f]
headers[c] = field.label
if colgroup: if colgroup:
cols = [COL(_id=c.replace('.', '-'), data={'column': i + 1}) cols = [COL(_id=c.replace('.', '-'), data={'column': i + 1})
for i, c in enumerate(columns)] for i, c in enumerate(columns)]
@@ -3380,9 +3385,8 @@ class SQLTABLE(TABLE):
_class += ' rowselected' _class += ' rowselected'
for colname in columns: for colname in columns:
matched_column_field = \ field = fieldmap.get(colname)
sqlrows.db._adapter.REGEX_TABLE_DOT_FIELD.match(colname) if not isinstance(field, field_types):
if not matched_column_field:
if "_extra" in record and colname in record._extra: if "_extra" in record and colname in record._extra:
r = record._extra[colname] r = record._extra[colname]
row.append(TD(r)) row.append(TD(r))
@@ -3390,12 +3394,9 @@ class SQLTABLE(TABLE):
else: else:
raise KeyError( raise KeyError(
"Column %s not found (SQLTABLE)" % colname) "Column %s not found (SQLTABLE)" % colname)
(tablename, fieldname) = matched_column_field.groups() # Virtual fields don't have parent table name...
colname = tablename + '.' + fieldname tablename = colname.split('.', 1)[0]
try: fieldname = field.name
field = sqlrows.db[tablename][fieldname]
except (KeyError, AttributeError):
field = None
if tablename in record \ if tablename in record \
and isinstance(record, Row) \ and isinstance(record, Row) \
and isinstance(record[tablename], Row): and isinstance(record[tablename], Row):