diff --git a/VERSION b/VERSION index 455f47c0..617bfef3 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -Version 2.4.7-stable+timestamp.2013.06.03.17.47.22 +Version 2.4.7-stable+timestamp.2013.06.03.21.48.08 diff --git a/gluon/dal.py b/gluon/dal.py index e845837b..c54d6d24 100644 --- a/gluon/dal.py +++ b/gluon/dal.py @@ -9204,7 +9204,7 @@ class FieldVirtual(object): (self.name, self.f) = (name, f) if f else ('unkown', name) self.type = ftype self.label = label or self.name.capitalize().replace('_',' ') - self.represent = IDENTITY + self.represent = lambda v,r:v self.formatter = IDENTITY self.comment = None self.readable = True @@ -9213,6 +9213,8 @@ class FieldVirtual(object): self.widget = None self.tablename = table_name self.filter_out = None + def __str__(self): + return '%s.%s' % (self.tablename, self.name) class FieldMethod(object): def __init__(self, name, f=None, handler=None): diff --git a/gluon/sqlhtml.py b/gluon/sqlhtml.py index e14340f4..c1188636 100644 --- a/gluon/sqlhtml.py +++ b/gluon/sqlhtml.py @@ -122,7 +122,7 @@ class FormWidget(object): :param attributes: any other supplied attributes """ attr = dict( - _id='%s_%s' % (field._tablename, field.name), + _id='%s_%s' % (field.tablename, field.name), _class=cls._class or widget_class.match(str(field.type)).group(), _name=field.name, @@ -286,7 +286,7 @@ class ListWidget(StringWidget): @classmethod def widget(cls, field, value, **attributes): - _id = '%s_%s' % (field._tablename, field.name) + _id = '%s_%s' % (field.tablename, field.name) _name = field.name if field.type == 'list:integer': _class = 'integer' @@ -1956,14 +1956,20 @@ class SQLFORM(FORM): for join in left: tablenames += db._adapter.tables(join) tables = [db[tablename] for tablename in tablenames] - if not fields: - fields = reduce(lambda a, b: a + b, - [[field for field in table] for table in tables]) + if fields: + columns = copy.copy(fields) + else: + fields = [] + columns = [] + for table in tables: + fields += [f for f in table] + columns += [f for f in table] + for k,f in table.iteritems(): + if isinstance(f,Field.Virtual) and f.readable: + f.tablename = table._tablename + columns.append(f) if not field_id: field_id = tables[0]._id - columns = [str(field) for field in fields - if field._tablename in tablenames] - if not any(str(f)==str(field_id) for f in fields): fields = [f for f in fields]+[field_id] table = field_id.table @@ -2113,12 +2119,12 @@ class SQLFORM(FORM): if sign == '~': orderby = ~orderby - expcolumns = columns + expcolumns = [str(f) for f in columns] if export_type.endswith('with_hidden_cols'): expcolumns = [] for table in tables: for field in table: - if field.readable and field._tablename in tablenames: + if field.readable and field.tablename in tablenames: expcolumns.append(field) if export_type in exportManager and exportManager[export_type]: @@ -2219,9 +2225,7 @@ class SQLFORM(FORM): headcols = [] if selectable: headcols.append(TH(_class=ui.get('default'))) - for field in fields: - if columns and not str(field) in columns: - continue + for field in columns: if not field.readable: continue key = str(field) @@ -2275,7 +2279,7 @@ class SQLFORM(FORM): limitby = None try: - table_fields = [f for f in fields if f._tablename in tablenames] + table_fields = [f for f in fields if f.tablename in tablenames] if dbset._db._adapter.dbengine=='google:datastore': rows = dbset.select(left=left,orderby=orderby, groupby=groupby,limitby=limitby, @@ -2363,14 +2367,12 @@ class SQLFORM(FORM): trcols.append( INPUT(_type="checkbox", _name="records", _value=id, value=request.vars.records)) - for field in fields: - if not str(field) in columns: - continue + for field in columns: if not field.readable: continue if field.type == 'blob': continue - value = row[field] + value = row[str(field)] maxlength = maxtextlengths.get(str(field), maxtextlength) if field.represent: try: @@ -2378,7 +2380,7 @@ class SQLFORM(FORM): except KeyError: try: value = field.represent( - value, row[field._tablename]) + value, row[field.tablename]) except KeyError: pass elif field.type == 'boolean':