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.
 
 
 
 
 
 

87 lines
2.7 KiB

  1. # Copyright (c) 2013, Web Notes Technologies Pvt. Ltd. and Contributors
  2. # MIT License. See license.txt
  3. from __future__ import unicode_literals
  4. import frappe
  5. from frappe.model.base_document import get_controller
  6. from frappe.utils import cint
  7. from frappe.website.render import resolve_path
  8. no_cache = 1
  9. no_sitemap = 1
  10. def get_context(context):
  11. doctype = frappe.local.form_dict.doctype
  12. context.update(get_list_context(context, doctype) or {})
  13. context.doctype = doctype
  14. context.txt = frappe.local.form_dict.txt
  15. context.update(get(**frappe.local.form_dict))
  16. return context
  17. def get_list_context(context, doctype):
  18. controller = get_controller(doctype)
  19. if hasattr(controller, "get_list_context"):
  20. return controller.get_list_context(context)
  21. @frappe.whitelist(allow_guest=True)
  22. def get(doctype, txt=None, limit_start=0, **kwargs):
  23. limit_start = cint(limit_start)
  24. limit_page_length = 20
  25. next_start = limit_start + limit_page_length
  26. filters = frappe._dict(kwargs)
  27. if filters.pathname:
  28. # resolve additional filters from path
  29. resolve_path(filters.pathname)
  30. for key, val in frappe.local.form_dict.items():
  31. if not (key in ("doctype", "txt", "limit_start") and key in filters):
  32. filters[key] = val
  33. controller = get_controller(doctype)
  34. meta = frappe.get_meta(doctype)
  35. list_context = frappe._dict(hasattr(controller, "get_list_context") and controller.get_list_context() or {})
  36. _get_list = list_context.get_list or get_list
  37. raw_result = _get_list(doctype=doctype, txt=txt, filters=filters,
  38. limit_start=limit_start, limit_page_length=limit_page_length)
  39. show_more = (_get_list(doctype=doctype, txt=txt, filters=filters,
  40. limit_start=next_start, limit_page_length=1)
  41. and True or False)
  42. result = []
  43. row_template = list_context.row_template or "templates/includes/list/row_template.html"
  44. for item in raw_result:
  45. item.doctype = doctype
  46. item.update(list_context)
  47. result.append(frappe.render_template(row_template,
  48. { "doc": item, "meta": meta, "pathname": frappe.local.request.path.strip("/ ") },
  49. is_path=True))
  50. return {
  51. "result": result,
  52. "show_more": show_more,
  53. "next_start": next_start
  54. }
  55. def get_list(doctype, txt, filters, limit_start, limit_page_length=20, ignore_permissions=False):
  56. meta = frappe.get_meta(doctype)
  57. if not filters:
  58. filters = []
  59. or_filters = []
  60. if txt:
  61. if meta.search_fields:
  62. for f in meta.get_search_fields():
  63. or_filters.append([doctype, f.strip(), "like", "%" + txt + "%"])
  64. else:
  65. filters.append([doctype, "name", "like", "%" + txt + "%"])
  66. return frappe.get_list(doctype, fields = ["*"],
  67. filters=filters, or_filters=or_filters, limit_start=limit_start,
  68. limit_page_length = limit_page_length, ignore_permissions=ignore_permissions)