25개 이상의 토픽을 선택하실 수 없습니다. Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

102 lines
3.1 KiB

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