Du kannst nicht mehr als 25 Themen auswählen Themen müssen entweder mit einem Buchstaben oder einer Ziffer beginnen. Sie können Bindestriche („-“) enthalten und bis zu 35 Zeichen lang sein.

vor 12 Jahren
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  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, page_len=20, searchfield="name"):
  17. search_widget(doctype, txt, query, searchfield=searchfield, page_len=page_len, filters=filters)
  18. webnotes.response['results'] = build_for_autosuggest(webnotes.response["values"], searchfield)
  19. del webnotes.response["values"]
  20. # this is called by the search box
  21. @webnotes.whitelist()
  22. def search_widget(doctype, txt, query=None, searchfield="name", start=0,
  23. page_len=50, filters=None):
  24. if isinstance(filters, basestring):
  25. import json
  26. filters = json.loads(filters)
  27. meta = webnotes.get_doctype(doctype)
  28. if query and query.split()[0].lower()!="select":
  29. # by method
  30. webnotes.response["values"] = webnotes.get_method(query)(doctype, txt,
  31. searchfield, start, page_len, filters)
  32. elif startup_standard_queries and not query and doctype in standard_queries:
  33. # from standard queries
  34. search_widget(doctype, txt, standard_queries[doctype],
  35. searchfield, start, page_len, filters)
  36. else:
  37. if query:
  38. # custom query
  39. webnotes.response["values"] = webnotes.conn.sql(scrub_custom_query(query,
  40. searchfield, txt))
  41. else:
  42. if isinstance(filters, dict):
  43. filters_items = filters.items()
  44. filters = []
  45. for f in filters_items:
  46. if isinstance(f[1], (list, tuple)):
  47. filters.append([doctype, f[0], f[1][0], f[1][1]])
  48. else:
  49. filters.append([doctype, f[0], "=", f[1]])
  50. if filters==None:
  51. filters = []
  52. # build from doctype
  53. if txt:
  54. filters.append([doctype, searchfield or "name", "like", txt + "%"])
  55. if meta.get({"parent":doctype, "fieldname":"enabled", "fieldtype":"Check"}):
  56. filters.append([doctype, "enabled", "=", 1])
  57. if meta.get({"parent":doctype, "fieldname":"disabled", "fieldtype":"Check"}):
  58. filters.append([doctype, "disabled", "!=", 1])
  59. webnotes.response["values"] = webnotes.widgets.reportview.execute(doctype,
  60. filters=filters, fields = get_std_fields_list(meta, searchfield or "name"),
  61. limit_start = start, limit_page_length=page_len, as_list=True)
  62. def get_std_fields_list(meta, key):
  63. # get additional search fields
  64. sflist = meta[0].search_fields and meta[0].search_fields.split(",") or []
  65. sflist = ['name'] + sflist
  66. if not key in sflist:
  67. sflist = sflist + [key]
  68. return ['`tab%s`.`%s`' % (meta[0].name, f.strip()) for f in sflist]
  69. def build_for_autosuggest(res, searchfield):
  70. searchfield = [s.strip() for s in searchfield.split(",")]
  71. results = []
  72. for r in res:
  73. out = {}
  74. for i, s in enumerate(searchfield):
  75. if s=="name": s="value"
  76. out[s] = r[i]
  77. results.append(out)
  78. return results
  79. def scrub_custom_query(query, key, txt):
  80. if '%(key)s' in query:
  81. query = query.replace('%(key)s', key)
  82. if '%s' in query:
  83. query = query.replace('%s', ((txt or '') + '%'))
  84. return query