Skip to content

Instantly share code, notes, and snippets.

@MaxMorais
Last active August 1, 2016 13:54
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
  • Save MaxMorais/5014234 to your computer and use it in GitHub Desktop.
Save MaxMorais/5014234 to your computer and use it in GitHub Desktop.
Web2Py Link Widget [UNDER DEVELOPMENT] This widget adds 3 new features to AutoCompleteWidget` ```      - Search: Allows the user to easily locate a record.      - Preview: Allows the user to view the records referenced.      - Add: Allows the user to add and self-references a record. ```
#-*- coding: utf-8 -*-
from gluon.sqlhtml import AutoCompleteWidget
from gluon.contrib.simplejson import loads
class LinkWidget(AutoCompleteWidget):
AGGREGATION = 'agg'
CONDITION = 'condition'
FIELD = 'fieldname'
QUERY = 'query'
AGGREGATIONS = (('and', T('And'),
('or', T('Or'))
CONDITIONS = (('eq', T('Equals'), lambda field, value: field == value),
('gt', T('Greater than'), lambda field, value: field > value),
('lt', T('Less than'), lambda field, value: field < value),
('ne', T('Not equals'), lambda field, value: field != value),
('ge', T('Greater or equals'), lambda field, value: field >= value),
('le', T('Less or equals'), lambda field, value: field <= value),
)
def __init__(self,
request,
field,
_id_field=None,
db = None,
order_by = None,
limitby = (0, 10),
distinct = False,
keyword = '_autocomplete_%(tablename)s_%(fieldname)s',
keyword_link = '_autocomplete_link_%(tablename)s_%(fieldname)s',
min_length=2,
help_fields=None,
help_string=None,
url_view=lambda _id=None: _id,
url_add=lambda _id=None: _id)
AutoCompleteWidget.__init__(self, request, field, _id_field, db, orderby, limitby,
distinct, keyword, min_length, help_fields)
self.keyword_link = keyword_link % {'tablename': field.tablename,
'fieldname': field.name}
self.url_view = url_view
self.url_view = url_view
def makequery(self, query):
result = None
base = loads(query)
i = int(query.pop(idx))
operators = dict([x[x], x[2]) for x in self.CONDITIONS])
for x in range(i):
sfx = '_%d'%x
field = self.db[self.field.tablename][self.request.vars[(self.FIELD)+sfx]]
op = self.request.vars[self.CONDITION+sfx]
val = self.request.vars[self.QUERY+sfx]
atom = operators[op](field, val)
if x==0:
result = atom
else:
agg_op = self.request.vars[self.AGGREGATION+sfx]
if agg_op == 'or':
query = (query | atom) if query else atom
else:
query = (query & atom) if query else atom
return query or (self.db[tablename].id>0)
def makeform(self, post_vars={}):
fields = [field for field in self.db[self.tablename]]
form = FORM(
DIV(
SELECT(*[OPTION(y, _value=x) for x,y if self.AGGREGATIONS],
_class=self.AGGREGATION,
_name=self.AGGREGATION+'_0'
),
SELECT(*[OPTION(y, _value=x) for x,y in fields],
_class=self.FIELD,
_name=self.FIELD+'_0'
),
SELECT(*[OPTION(x[1], _value=x[0]) for x in self.CONDITIONS],
_class=self.CONDITION,
_name=self.CONDITION+'_0'
)
INPUT(
_name=self.QUERY+'_0',
_type='text',
_class=self.QUERY
)
_class='link-condition first control-group'
),
DIV(
BUTTON(
I(_class='icon-search'),
' ' + str(self.T('Filter'),
_type='submit',
_class='btn btn-primary',
),
_class='actions'
)
)
def callback(self):
if self.keyword in self.request.vars:
return AutoCompleteWidget.callback(self)
elif self.keyword_link in self.request.vars:
query = self.request.vars[self.keyword_link]
if query == None:
raise HTTP(200, self.makeform())
else:
query = self.makequery(query)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment