97 lines
3.1 KiB
Python
97 lines
3.1 KiB
Python
# Copyright (c) 2013, Web Notes Technologies Pvt. Ltd.
|
|
# MIT License. See license.txt
|
|
|
|
# Search
|
|
from __future__ import unicode_literals
|
|
import webnotes
|
|
import webnotes.widgets.reportview
|
|
import webnotes.widgets.query_builder
|
|
from webnotes.utils import cstr
|
|
|
|
try:
|
|
from startup.query_handlers import standard_queries
|
|
startup_standard_queries = True
|
|
except ImportError:
|
|
startup_standard_queries = False
|
|
|
|
# this is called by the Link Field
|
|
@webnotes.whitelist()
|
|
def search_link(doctype, txt, query=None, filters=None):
|
|
search_widget(doctype, txt, query, page_len=20, filters=filters)
|
|
webnotes.response['results'] = build_for_autosuggest(webnotes.response["values"])
|
|
|
|
# this is called by the search box
|
|
@webnotes.whitelist()
|
|
def search_widget(doctype, txt, query=None, searchfield="name", start=0,
|
|
page_len=50, filters=None):
|
|
if isinstance(filters, basestring):
|
|
import json
|
|
filters = json.loads(filters)
|
|
|
|
meta = webnotes.get_doctype(doctype)
|
|
|
|
if query and query.split()[0].lower()!="select":
|
|
# by method
|
|
webnotes.response["values"] = webnotes.get_method(query)(doctype, txt,
|
|
searchfield, start, page_len, filters)
|
|
elif startup_standard_queries and not query and doctype in standard_queries:
|
|
# from standard queries
|
|
search_widget(doctype, txt, standard_queries[doctype],
|
|
searchfield, start, page_len, filters)
|
|
else:
|
|
if query:
|
|
# custom query
|
|
webnotes.response["values"] = webnotes.conn.sql(scrub_custom_query(query,
|
|
searchfield, txt))
|
|
else:
|
|
if isinstance(filters, dict):
|
|
filters_items = filters.items()
|
|
filters = []
|
|
for f in filters_items:
|
|
if isinstance(f[1], (list, tuple)):
|
|
filters.append([doctype, f[0], f[1][0], f[1][1]])
|
|
else:
|
|
filters.append([doctype, f[0], "=", f[1]])
|
|
|
|
if filters==None:
|
|
filters = []
|
|
|
|
# build from doctype
|
|
if txt:
|
|
filters.append([doctype, searchfield or "name", "like", txt + "%"])
|
|
if meta.get({"parent":doctype, "fieldname":"enabled", "fieldtype":"Check"}):
|
|
filters.append([doctype, "enabled", "=", 1])
|
|
if meta.get({"parent":doctype, "fieldname":"disabled", "fieldtype":"Check"}):
|
|
filters.append([doctype, "disabled", "!=", 1])
|
|
|
|
webnotes.response["values"] = webnotes.widgets.reportview.execute(doctype,
|
|
filters=filters, fields = get_std_fields_list(meta, searchfield or "name"),
|
|
limit_start = start, limit_page_length=page_len, as_list=True)
|
|
|
|
def get_std_fields_list(meta, key):
|
|
# get additional search fields
|
|
sflist = meta[0].search_fields and meta[0].search_fields.split(",") or []
|
|
sflist = ['name'] + sflist
|
|
if not key in sflist:
|
|
sflist = sflist + [key]
|
|
|
|
return ['`tab%s`.`%s`' % (meta[0].name, f.strip()) for f in sflist]
|
|
|
|
def build_for_autosuggest(res):
|
|
results = []
|
|
for r in res:
|
|
info = ''
|
|
if len(r) > 1:
|
|
info = ', '.join([cstr(t) for t in r[1:]])
|
|
if len(info) > 50:
|
|
info = "<span title=\"%s\">%s...</span>" % (info, info[:50])
|
|
|
|
results.append({'label':r[0], 'value':r[0], 'info':info})
|
|
return results
|
|
|
|
def scrub_custom_query(query, key, txt):
|
|
if '%(key)s' in query:
|
|
query = query.replace('%(key)s', key)
|
|
if '%s' in query:
|
|
query = query.replace('%s', ((txt or '') + '%'))
|
|
return query
|