diff --git a/gluon/sqlhtml.py b/gluon/sqlhtml.py
index 898e89e5..ea82e39b 100644
--- a/gluon/sqlhtml.py
+++ b/gluon/sqlhtml.py
@@ -677,7 +677,23 @@ class AutocompleteWidget(object):
def callback(self):
if self.keyword in self.request.vars:
field = self.fields[0]
- if settings and settings.global_settings.web2py_runtime_gae:
+ if type(field) is FieldVirtual:
+ records = []
+ table_rows = self.db(self.db[field.tablename]).select(orderby=self.orderby)
+ count = 0
+ for row in table_rows:
+ if self.at_beginning:
+ if row[field.name].lower().startswith(self.request.vars[self.keyword]):
+ count += 1
+ records.append(row)
+ else:
+ if self.request.vars[self.keyword] in row[field.name].lower():
+ count += 1
+ records.append(row)
+ if count == 10:
+ break
+ rows = Rows(self.db, records, table_rows.colnames, compact=table_rows.compact)
+ elif settings and settings.global_settings.web2py_runtime_gae:
rows = self.db(field.__ge__(self.request.vars[self.keyword]) & field.__lt__(self.request.vars[self.keyword] + u'\ufffd')).select(orderby=self.orderby, limitby=self.limitby, *(self.fields+self.help_fields))
elif self.at_beginning:
rows = self.db(field.like(self.request.vars[self.keyword] + '%', case_sensitive=False)).select(orderby=self.orderby, limitby=self.limitby, distinct=self.distinct, *(self.fields+self.help_fields))
@@ -725,8 +741,16 @@ class AutocompleteWidget(object):
del attr['requires']
attr['_name'] = key2
value = attr['value']
- record = self.db(
- self.fields[1] == value).select(self.fields[0]).first()
+ if type(self.fields[0]) is FieldVirtual:
+ record = None
+ table_rows = self.db(self.db[self.fields[0].tablename]).select(orderby=self.orderby)
+ for row in table_rows:
+ if row.id == value:
+ record = row
+ break
+ else:
+ record = self.db(
+ self.fields[1] == value).select(self.fields[0]).first()
attr['value'] = record and record[self.fields[0].name]
attr['_onblur'] = "jQuery('#%(div_id)s').delay(1000).fadeOut('slow');" % \
dict(div_id=div_id, u='F' + self.keyword)