You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

98 lines
3.1 KiB

  1. # Copyright (c) 2013, Web Notes Technologies Pvt. Ltd.
  2. # MIT License. See license.txt
  3. # Search
  4. from __future__ import unicode_literals
  5. import webnotes
  6. import webnotes.widgets.reportview
  7. import webnotes.widgets.query_builder
  8. from webnotes.utils import cstr
  9. try:
  10. from startup.query_handlers import standard_queries
  11. startup_standard_queries = True
  12. except ImportError:
  13. startup_standard_queries = False
  14. # this is called by the Link Field
  15. @webnotes.whitelist()
  16. def search_link(doctype, txt, query=None, filters=None):
  17. search_widget(doctype, txt, query, page_len=20, filters=filters)
  18. webnotes.response['results'] = build_for_autosuggest(webnotes.response["values"])
  19. # this is called by the search box
  20. @webnotes.whitelist()
  21. def search_widget(doctype, txt, query=None, searchfield="name", start=0,
  22. page_len=50, filters=None):
  23. if isinstance(filters, basestring):
  24. import json
  25. filters = json.loads(filters)
  26. meta = webnotes.get_doctype(doctype)
  27. if query and query.split()[0].lower()!="select":
  28. # by method
  29. webnotes.response["values"] = webnotes.get_method(query)(doctype, txt,
  30. searchfield, start, page_len, filters)
  31. elif startup_standard_queries and not query and doctype in standard_queries:
  32. # from standard queries
  33. search_widget(doctype, txt, standard_queries[doctype],
  34. searchfield, start, page_len, filters)
  35. else:
  36. if query:
  37. # custom query
  38. webnotes.response["values"] = webnotes.conn.sql(scrub_custom_query(query,
  39. searchfield, txt))
  40. else:
  41. if isinstance(filters, dict):
  42. filters_items = filters.items()
  43. filters = []
  44. for f in filters_items:
  45. if isinstance(f[1], (list, tuple)):
  46. filters.append([doctype, f[0], f[1][0], f[1][1]])
  47. else:
  48. filters.append([doctype, f[0], "=", f[1]])
  49. if filters==None:
  50. filters = []
  51. # build from doctype
  52. if txt:
  53. filters.append([doctype, searchfield or "name", "like", txt + "%"])
  54. if meta.get({"parent":doctype, "fieldname":"enabled", "fieldtype":"Check"}):
  55. filters.append([doctype, "enabled", "=", 1])
  56. if meta.get({"parent":doctype, "fieldname":"disabled", "fieldtype":"Check"}):
  57. filters.append([doctype, "disabled", "!=", 1])
  58. webnotes.response["values"] = webnotes.widgets.reportview.execute(doctype,
  59. filters=filters, fields = get_std_fields_list(meta, searchfield or "name"),
  60. limit_start = start, limit_page_length=page_len, as_list=True)
  61. def get_std_fields_list(meta, key):
  62. # get additional search fields
  63. sflist = meta[0].search_fields and meta[0].search_fields.split(",") or []
  64. sflist = ['name'] + sflist
  65. if not key in sflist:
  66. sflist = sflist + [key]
  67. return ['`tab%s`.`%s`' % (meta[0].name, f.strip()) for f in sflist]
  68. def build_for_autosuggest(res):
  69. results = []
  70. for r in res:
  71. info = ''
  72. if len(r) > 1:
  73. info = ', '.join([cstr(t) for t in r[1:]])
  74. if len(info) > 50:
  75. info = "<span title=\"%s\">%s...</span>" % (info, info[:50])
  76. results.append({'label':r[0], 'value':r[0], 'info':info})
  77. return results
  78. def scrub_custom_query(query, key, txt):
  79. if '%(key)s' in query:
  80. query = query.replace('%(key)s', key)
  81. if '%s' in query:
  82. query = query.replace('%s', ((txt or '') + '%'))
  83. return query