Du kannst nicht mehr als 25 Themen auswählen Themen müssen entweder mit einem Buchstaben oder einer Ziffer beginnen. Sie können Bindestriche („-“) enthalten und bis zu 35 Zeichen lang sein.
 
 
 
 
 
 

179 Zeilen
5.7 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.model.document import get_controller, Document
  8. from frappe import _
  9. no_cache = 1
  10. no_sitemap = 1
  11. def get_context(context):
  12. """Returns context for a list standard list page.
  13. Will also update `get_list_context` from the doctype module file"""
  14. doctype = frappe.local.form_dict.doctype
  15. context.parents = [{"route":"me", "title":_("My Account")}]
  16. context.update(get_list_context(context, doctype) or {})
  17. context.doctype = doctype
  18. context.txt = frappe.local.form_dict.txt
  19. context.update(get(**frappe.local.form_dict))
  20. @frappe.whitelist(allow_guest=True)
  21. def get(doctype, txt=None, limit_start=0, limit=20, **kwargs):
  22. """Returns processed HTML page for a standard listing."""
  23. limit_start = cint(limit_start)
  24. limit_page_length = limit
  25. next_start = limit_start + limit_page_length
  26. if not txt and frappe.form_dict.search:
  27. txt = frappe.form_dict.search
  28. del frappe.form_dict['search']
  29. controller = get_controller(doctype)
  30. meta = frappe.get_meta(doctype)
  31. filters = prepare_filters(doctype, controller, kwargs)
  32. list_context = get_list_context(frappe._dict(), doctype)
  33. list_context.title_field = getattr(controller, 'website',
  34. {}).get('page_title_field', meta.title_field or 'name')
  35. if list_context.filters:
  36. filters.update(list_context.filters)
  37. _get_list = list_context.get_list or get_list
  38. kwargs = dict(doctype=doctype, txt=txt, filters=filters,
  39. limit_start=limit_start, limit_page_length=limit_page_length + 1,
  40. order_by = list_context.order_by or 'modified desc')
  41. # allow guest if flag is set
  42. if not list_context.get_list and (list_context.allow_guest or meta.allow_guest_to_view):
  43. kwargs['ignore_permissions'] = True
  44. raw_result = _get_list(**kwargs)
  45. if not raw_result: return {"result": []}
  46. show_more = len(raw_result) > limit_page_length
  47. if show_more:
  48. raw_result = raw_result[:-1]
  49. if txt:
  50. list_context.default_subtitle = _('Filtered by "{0}"').format(txt)
  51. result = []
  52. row_template = list_context.row_template or "templates/includes/list/row_template.html"
  53. for doc in raw_result:
  54. doc.doctype = doctype
  55. new_context = frappe._dict(doc=doc, meta=meta)
  56. if not list_context.get_list and not isinstance(new_context.doc, Document):
  57. new_context.doc = frappe.get_doc(doc.doctype, doc.name)
  58. new_context.update(new_context.doc.as_dict())
  59. if not frappe.flags.in_test:
  60. new_context["pathname"] = frappe.local.request.path.strip("/ ")
  61. new_context.update(list_context)
  62. set_route(new_context)
  63. rendered_row = frappe.render_template(row_template, new_context, is_path=True)
  64. result.append(rendered_row)
  65. return {
  66. "result": result,
  67. "show_more": show_more,
  68. "next_start": next_start
  69. }
  70. def set_route(context):
  71. '''Set link for the list item'''
  72. if context.web_form_name:
  73. context.route = "{0}?name={1}".format(context.pathname, quoted(context.doc.name))
  74. elif context.doc and getattr(context.doc, 'route', None):
  75. context.route = context.doc.route
  76. else:
  77. context.route = "{0}/{1}".format(context.pathname or quoted(context.doc.doctype),
  78. quoted(context.doc.name))
  79. def prepare_filters(doctype, controller, kwargs):
  80. filters = frappe._dict(kwargs)
  81. meta = frappe.get_meta(doctype)
  82. if hasattr(controller, 'website') and controller.website.get('condition_field'):
  83. filters[controller.website['condition_field']] = 1
  84. if filters.pathname:
  85. # resolve additional filters from path
  86. resolve_path(filters.pathname)
  87. for key, val in frappe.local.form_dict.items():
  88. if key not in filters and key != 'flags':
  89. filters[key] = val
  90. # filter the filters to include valid fields only
  91. for fieldname, val in filters.items():
  92. if not meta.has_field(fieldname):
  93. del filters[fieldname]
  94. return filters
  95. def get_list_context(context, doctype):
  96. from frappe.modules import load_doctype_module
  97. from frappe.website.doctype.web_form.web_form import get_web_form_list
  98. list_context = context or frappe._dict()
  99. module = load_doctype_module(doctype)
  100. if hasattr(module, "get_list_context"):
  101. out = frappe._dict(module.get_list_context(list_context) or {})
  102. if out:
  103. list_context = out
  104. # get path from '/templates/' folder of the doctype
  105. if not list_context.row_template:
  106. list_context.row_template = frappe.get_meta(doctype).get_row_template()
  107. # is web form, show the default web form filters
  108. # which is only the owner
  109. if frappe.form_dict.web_form_name:
  110. list_context.web_form_name = frappe.form_dict.web_form_name
  111. if not list_context.get("get_list"):
  112. list_context.get_list = get_web_form_list
  113. if not frappe.flags.web_form:
  114. # update list context from web_form
  115. frappe.flags.web_form = frappe.get_doc('Web Form', frappe.form_dict.web_form_name)
  116. if frappe.flags.web_form.is_standard:
  117. frappe.flags.web_form.update_list_context(list_context)
  118. return list_context
  119. def get_list(doctype, txt, filters, limit_start, limit_page_length=20, ignore_permissions=False,
  120. fields=None, order_by=None):
  121. meta = frappe.get_meta(doctype)
  122. if not filters:
  123. filters = []
  124. if not fields:
  125. fields = "distinct *"
  126. or_filters = []
  127. if txt:
  128. if meta.search_fields:
  129. for f in meta.get_search_fields():
  130. if f == 'name' or meta.get_field(f).fieldtype in ('Data', 'Text', 'Small Text', 'Text Editor'):
  131. or_filters.append([doctype, f, "like", "%" + txt + "%"])
  132. else:
  133. if isinstance(filters, dict):
  134. filters["name"] = ("like", "%" + txt + "%")
  135. else:
  136. filters.append([doctype, "name", "like", "%" + txt + "%"])
  137. return frappe.get_list(doctype, fields = fields,
  138. filters=filters, or_filters=or_filters, limit_start=limit_start,
  139. limit_page_length = limit_page_length, ignore_permissions=ignore_permissions,
  140. order_by=order_by)