From faa3d1d477e62ecaa003a120bab2c63f92eb3736 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Carlos=20Cesar=20Caballero=20D=C3=ADaz?= Date: Sat, 30 Jan 2016 10:20:37 -0500 Subject: [PATCH] Added virtual field support to autocomplete widget Added support to use Virtual Fields in autocomplete widget. Gotchas: - Using Virtual Fields is slower than normal fields. - Virtual Fields must be declared with name and table_name attributes. --- gluon/sqlhtml.py | 30 +++++++++++++++++++++++++++--- 1 file changed, 27 insertions(+), 3 deletions(-) diff --git a/gluon/sqlhtml.py b/gluon/sqlhtml.py index c813950d..596e8767 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)