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.

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108
  1. # Search
  2. import webnotes
  3. # this is called when a new doctype is setup for search - to set the filters
  4. @webnotes.whitelist()
  5. def getsearchfields():
  6. sf = webnotes.conn.sql("""\
  7. SELECT value FROM `tabProperty Setter`
  8. WHERE doc_type=%s AND doc_name=%s AND property='search_fields'""", \
  9. (webnotes.form.getvalue("doctype"), webnotes.form.getvalue("doctype")))
  10. if not (sf and len(sf)>0 and sf[0][0]):
  11. sf = webnotes.conn.sql("select search_fields from tabDocType where name=%s", webnotes.form.getvalue("doctype"))
  12. sf = sf and sf[0][0] or ''
  13. sf = [s.strip() for s in sf.split(',')]
  14. if sf and sf[0]:
  15. res = webnotes.conn.sql("select fieldname, label, fieldtype, options from tabDocField where parent='%s' and fieldname in (%s)" % (webnotes.form.getvalue("doctype","_NA"), '"'+'","'.join(sf)+'"'))
  16. else:
  17. res = []
  18. res = [[c or '' for c in r] for r in res]
  19. for r in res:
  20. if r[2]=='Select' and r[3] and r[3].startswith('link:'):
  21. dt = r[3][5:]
  22. ol = webnotes.conn.sql("select name from `tab%s` where docstatus!=2 order by name asc" % dt)
  23. r[3] = '\n'.join([''] + [o[0] for o in ol])
  24. webnotes.response['searchfields'] = [['name', 'ID', 'Data', '']] + res
  25. def make_query(fields, dt, key, txt, start, length):
  26. return """SELECT %(fields)s
  27. FROM `tab%(dt)s`
  28. WHERE `tab%(dt)s`.`%(key)s` LIKE '%(txt)s' AND `tab%(dt)s`.docstatus != 2
  29. ORDER BY `tab%(dt)s`.`%(key)s`
  30. DESC LIMIT %(start)s, %(len)s """ % {
  31. 'fields': fields,
  32. 'dt': dt,
  33. 'key': key,
  34. 'txt': txt + '%',
  35. 'start': start,
  36. 'len': length
  37. }
  38. def get_std_fields_list(dt, key):
  39. # get additional search fields
  40. sflist = webnotes.conn.sql("select search_fields from tabDocType where name = '%s'" % dt)
  41. sflist = sflist and sflist[0][0] and sflist[0][0].split(',') or []
  42. sflist = ['name'] + sflist
  43. if not key in sflist:
  44. sflist = sflist + [key]
  45. return ['`tab%s`.`%s`' % (dt, f.strip()) for f in sflist]
  46. def build_for_autosuggest(res):
  47. from webnotes.utils import cstr
  48. results = []
  49. for r in res:
  50. info = ''
  51. if len(r) > 1:
  52. info = ','.join([cstr(t) for t in r[1:]])
  53. if len(info) > 30:
  54. info = info[:30] + '...'
  55. results.append({'id':r[0], 'value':r[0], 'info':info})
  56. return results
  57. def scrub_custom_query(query, key, txt):
  58. if '%(key)s' in query:
  59. query = query.replace('%(key)s', key)
  60. if '%s' in query:
  61. query = query.replace('%s', ((txt or '') + '%'))
  62. return query
  63. # this is called by the Link Field
  64. @webnotes.whitelist()
  65. def search_link():
  66. import webnotes.widgets.query_builder
  67. txt = webnotes.form.getvalue('txt')
  68. dt = webnotes.form.getvalue('dt')
  69. query = webnotes.form.getvalue('query')
  70. if query:
  71. res = webnotes.conn.sql(scrub_custom_query(query, 'name', txt))
  72. else:
  73. q = make_query(', '.join(get_std_fields_list(dt, 'name')), dt, 'name', txt, '0', '10')
  74. res = webnotes.widgets.query_builder.runquery(q, ret=1)
  75. # make output
  76. webnotes.response['results'] = build_for_autosuggest(res)
  77. # this is called by the search box
  78. @webnotes.whitelist()
  79. def search_widget():
  80. import webnotes.widgets.query_builder
  81. dt = webnotes.form.getvalue('doctype')
  82. txt = webnotes.form.getvalue('txt') or ''
  83. key = webnotes.form.getvalue('searchfield') or 'name' # key field
  84. user_query = webnotes.form.getvalue('query') or ''
  85. if user_query:
  86. query = scrub_custom_query(user_query, key, txt)
  87. else:
  88. query = make_query(', '.join(get_std_fields_list(dt, key)), dt, key, txt, webnotes.form.getvalue('start') or 0, webnotes.form.getvalue('page_len') or 50)
  89. webnotes.widgets.query_builder.runquery(query)