# 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 = "%s..." % (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