Вы не можете выбрать более 25 тем Темы должны начинаться с буквы или цифры, могут содержать дефисы(-) и должны содержать не более 35 символов.

13 лет назад
12 лет назад
12 лет назад
12 лет назад
12 лет назад
12 лет назад
12 лет назад
12 лет назад
12 лет назад
12 лет назад
12 лет назад
12 лет назад
12 лет назад
12 лет назад
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