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

139 行
3.9 KiB

  1. # Copyright (c) 2015, Frappe Technologies Pvt. Ltd. and Contributors
  2. # MIT License. See license.txt
  3. from __future__ import unicode_literals
  4. def get_jenv():
  5. import frappe
  6. if not frappe.local.jenv:
  7. from jinja2 import Environment, DebugUndefined
  8. # frappe will be loaded last, so app templates will get precedence
  9. jenv = Environment(loader = get_jloader(),
  10. undefined=DebugUndefined)
  11. set_filters(jenv)
  12. jenv.globals.update(get_allowed_functions_for_jenv())
  13. frappe.local.jenv = jenv
  14. return frappe.local.jenv
  15. def get_template(path):
  16. return get_jenv().get_template(path)
  17. def render_template(template, context, is_path=None):
  18. if is_path or template.startswith("templates/"):
  19. return get_jenv().get_template(template).render(context)
  20. else:
  21. return get_jenv().from_string(template).render(context)
  22. def get_allowed_functions_for_jenv():
  23. import frappe
  24. import frappe.utils
  25. import frappe.utils.data
  26. from frappe.utils.autodoc import automodule, get_version
  27. from frappe.model.document import get_controller
  28. from frappe.website.utils import get_shade
  29. from frappe.modules import scrub
  30. datautils = {}
  31. for key, obj in frappe.utils.data.__dict__.items():
  32. if key.startswith("_"):
  33. # ignore
  34. continue
  35. if hasattr(obj, "__call__"):
  36. # only allow functions
  37. datautils[key] = obj
  38. if "_" in frappe.local.form_dict:
  39. del frappe.local.form_dict["_"]
  40. return {
  41. # make available limited methods of frappe
  42. "frappe": {
  43. "_": frappe._,
  44. "get_url": frappe.utils.get_url,
  45. "format_value": frappe.format_value,
  46. "format_date": frappe.utils.data.global_date_format,
  47. "form_dict": frappe.local.form_dict,
  48. "local": frappe.local,
  49. "get_hooks": frappe.get_hooks,
  50. "get_meta": frappe.get_meta,
  51. "get_doc": frappe.get_doc,
  52. "db": {
  53. "get_value": frappe.db.get_value,
  54. },
  55. "get_list": frappe.get_list,
  56. "get_all": frappe.get_all,
  57. "utils": datautils,
  58. "user": getattr(frappe.local, "session", None) and frappe.local.session.user or "Guest",
  59. "date_format": frappe.db.get_default("date_format") or "yyyy-mm-dd",
  60. "get_fullname": frappe.utils.get_fullname,
  61. "get_gravatar": frappe.utils.get_gravatar,
  62. "full_name": getattr(frappe.local, "session", None) and frappe.local.session.data.full_name or "Guest",
  63. "render_template": frappe.render_template
  64. },
  65. "autodoc": {
  66. "get_version": get_version,
  67. "automodule": automodule,
  68. "get_controller": get_controller
  69. },
  70. "get_visible_columns": \
  71. frappe.get_attr("frappe.templates.pages.print.get_visible_columns"),
  72. "_": frappe._,
  73. "get_shade": get_shade,
  74. "scrub": scrub
  75. }
  76. def get_jloader():
  77. import frappe
  78. if not frappe.local.jloader:
  79. from jinja2 import ChoiceLoader, PackageLoader, PrefixLoader
  80. apps = frappe.get_installed_apps(sort=True)
  81. apps.reverse()
  82. frappe.local.jloader = ChoiceLoader(
  83. # search for something like app/templates/...
  84. [PrefixLoader(dict(
  85. (app, PackageLoader(app, ".")) for app in apps
  86. ))]
  87. # search for something like templates/...
  88. + [PackageLoader(app, ".") for app in apps]
  89. )
  90. return frappe.local.jloader
  91. def set_filters(jenv):
  92. import frappe
  93. from frappe.utils import global_date_format, cint, cstr, flt
  94. from frappe.website.utils import get_shade, abs_url
  95. from markdown2 import markdown
  96. jenv.filters["global_date_format"] = global_date_format
  97. jenv.filters["markdown"] = markdown
  98. jenv.filters["json"] = frappe.as_json
  99. jenv.filters["get_shade"] = get_shade
  100. jenv.filters["len"] = len
  101. jenv.filters["int"] = cint
  102. jenv.filters["str"] = cstr
  103. jenv.filters["flt"] = flt
  104. jenv.filters["abs_url"] = abs_url
  105. # load jenv_filters from hooks.py
  106. for app in frappe.get_installed_apps():
  107. for jenv_filter in (frappe.get_hooks(app_name=app).jenv_filter or []):
  108. filter_name, filter_function = jenv_filter.split(":")
  109. jenv.filters[filter_name] = frappe.get_attr(filter_function)
  110. def render_include(content):
  111. from frappe.utils import cstr
  112. content = cstr(content)
  113. if "{% include" in content:
  114. content = get_jenv().from_string(content).render()
  115. return content