您最多选择25个主题 主题必须以字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符
 
 
 
 
 
 

149 行
4.5 KiB

  1. # Copyright (c) 2015, Frappe Technologies Pvt. Ltd. and Contributors
  2. # MIT License. See license.txt
  3. from __future__ import unicode_literals
  4. import frappe
  5. from frappe.utils import cint, quoted
  6. from frappe.website.render import resolve_path
  7. from frappe import _
  8. no_cache = 1
  9. no_sitemap = 1
  10. def get_context(context):
  11. """Returns context for a list standard list page.
  12. Will also update `get_list_context` from the doctype module file"""
  13. doctype = frappe.local.form_dict.doctype
  14. context.parents = [{"name":"me", "title":_("My Account")}]
  15. context.update(get_list_context(context, doctype) or {})
  16. context.doctype = doctype
  17. context.txt = frappe.local.form_dict.txt
  18. context.update(get(**frappe.local.form_dict))
  19. @frappe.whitelist(allow_guest=True)
  20. def get(doctype, txt=None, limit_start=0, **kwargs):
  21. """Returns processed HTML page for a standard listing."""
  22. limit_start = cint(limit_start)
  23. limit_page_length = 20
  24. next_start = limit_start + limit_page_length
  25. if not txt and frappe.form_dict.search:
  26. txt = frappe.form_dict.search
  27. del frappe.form_dict['search']
  28. filters = prepare_filters(doctype, kwargs)
  29. meta = frappe.get_meta(doctype)
  30. list_context = get_list_context(frappe._dict(), doctype)
  31. if list_context.filters:
  32. filters.update(list_context.filters)
  33. _get_list = list_context.get_list or get_list
  34. raw_result = _get_list(doctype=doctype, txt=txt, filters=filters,
  35. limit_start=limit_start, limit_page_length=limit_page_length)
  36. if not raw_result: return {"result": []}
  37. show_more = (_get_list(doctype=doctype, txt=txt, filters=filters,
  38. limit_start=next_start, limit_page_length=1) and True or False)
  39. if txt:
  40. list_context.default_subtitle = _('Filtered by "{0}"').format(txt)
  41. result = []
  42. row_template = list_context.row_template or "templates/includes/list/row_template.html"
  43. for doc in raw_result:
  44. doc.doctype = doctype
  45. new_context = frappe._dict(doc=doc, meta=meta)
  46. new_context.doc = frappe.get_doc(doc)
  47. if not frappe.flags.in_test:
  48. new_context["pathname"] = frappe.local.request.path.strip("/ ")
  49. new_context.update(list_context)
  50. set_route(new_context)
  51. rendered_row = frappe.render_template(row_template, new_context, is_path=True)
  52. result.append(rendered_row)
  53. return {
  54. "result": result,
  55. "show_more": show_more,
  56. "next_start": next_start
  57. }
  58. def set_route(context):
  59. '''Set link for the list item'''
  60. if context.is_web_form:
  61. context.route = "{0}?name={1}".format(context.pathname, quoted(context.doc.name))
  62. elif context.doc and getattr(context.doc, 'get_route', None):
  63. context.route = context.doc.get_route()
  64. else:
  65. context.route = "{0}/{1}".format(context.pathname or quoted(context.doc.doctype),
  66. quoted(context.doc.name))
  67. def prepare_filters(doctype, kwargs):
  68. filters = frappe._dict(kwargs)
  69. meta = frappe.get_meta(doctype)
  70. if filters.pathname:
  71. # resolve additional filters from path
  72. resolve_path(filters.pathname)
  73. for key, val in frappe.local.form_dict.items():
  74. if key not in filters:
  75. filters[key] = val
  76. # filter the filters to include valid fields only
  77. for fieldname, val in filters.items():
  78. if not meta.has_field(fieldname):
  79. del filters[fieldname]
  80. if "is_web_form" in filters:
  81. del filters["is_web_form"]
  82. return filters
  83. def get_list_context(context, doctype):
  84. from frappe.modules import load_doctype_module
  85. from frappe.website.doctype.web_form.web_form import get_web_form_list
  86. list_context = frappe._dict()
  87. module = load_doctype_module(doctype)
  88. if hasattr(module, "get_list_context"):
  89. list_context = frappe._dict(module.get_list_context(context) or {})
  90. # is web form
  91. if cint(frappe.local.form_dict.is_web_form):
  92. list_context.is_web_form = 1
  93. if not list_context.get("get_list"):
  94. list_context.get_list = get_web_form_list
  95. return list_context
  96. def get_list(doctype, txt, filters, limit_start, limit_page_length=20, ignore_permissions=False,
  97. fields=None, order_by=None):
  98. meta = frappe.get_meta(doctype)
  99. if not filters:
  100. filters = []
  101. if not fields:
  102. fields = "distinct *"
  103. or_filters = []
  104. if txt:
  105. if meta.search_fields:
  106. for f in meta.get_search_fields():
  107. if f == 'name' or meta.get_field(f).fieldtype in ('Data', 'Text', 'Small Text', 'Text Editor'):
  108. or_filters.append([doctype, f, "like", "%" + txt + "%"])
  109. else:
  110. if isinstance(filters, dict):
  111. filters["name"] = ("like", "%" + txt + "%")
  112. else:
  113. filters.append([doctype, "name", "like", "%" + txt + "%"])
  114. return frappe.get_list(doctype, fields = fields,
  115. filters=filters, or_filters=or_filters, limit_start=limit_start,
  116. limit_page_length = limit_page_length, ignore_permissions=ignore_permissions,
  117. order_by=order_by)