Non puoi selezionare più di 25 argomenti Gli argomenti devono iniziare con una lettera o un numero, possono includere trattini ('-') e possono essere lunghi fino a 35 caratteri.
 
 
 
 
 
 

183 righe
5.2 KiB

  1. # Copyright (c) 2018, Frappe Technologies Pvt. Ltd. and Contributors
  2. # MIT License. See license.txt
  3. from __future__ import unicode_literals
  4. import frappe, json
  5. import frappe.defaults
  6. from frappe.model.document import Document
  7. from frappe.desk.notifications import (delete_notification_count_for,
  8. clear_notifications)
  9. common_default_keys = ["__default", "__global"]
  10. global_cache_keys = ("app_hooks", "installed_apps",
  11. "app_modules", "module_app", "system_settings",
  12. 'scheduler_events', 'time_zone', 'webhooks', 'active_domains',
  13. 'active_modules', 'assignment_rule', 'server_script_map', 'wkhtmltopdf_version',
  14. 'domain_restricted_doctypes', 'domain_restricted_pages', 'information_schema:counts',
  15. 'sitemap_routes', 'db_tables')
  16. user_cache_keys = ("bootinfo", "user_recent", "roles", "user_doc", "lang",
  17. "defaults", "user_permissions", "home_page", "linked_with",
  18. "desktop_icons", 'portal_menu_items', 'user_perm_can_read',
  19. "has_role:Page", "has_role:Report")
  20. doctype_cache_keys = ("meta", "form_meta", "table_columns", "last_modified",
  21. "linked_doctypes", 'notifications', 'workflow' ,'energy_point_rule_map')
  22. def clear_user_cache(user=None):
  23. cache = frappe.cache()
  24. # this will automatically reload the global cache
  25. # so it is important to clear this first
  26. clear_notifications(user)
  27. if user:
  28. for name in user_cache_keys:
  29. cache.hdel(name, user)
  30. cache.delete_keys("user:" + user)
  31. clear_defaults_cache(user)
  32. else:
  33. for name in user_cache_keys:
  34. cache.delete_key(name)
  35. clear_defaults_cache()
  36. clear_global_cache()
  37. def clear_domain_cache(user=None):
  38. cache = frappe.cache()
  39. domain_cache_keys = ('domain_restricted_doctypes', 'domain_restricted_pages')
  40. cache.delete_value(domain_cache_keys)
  41. def clear_global_cache():
  42. from frappe.website.render import clear_cache as clear_website_cache
  43. clear_doctype_cache()
  44. clear_website_cache()
  45. frappe.cache().delete_value(global_cache_keys)
  46. frappe.setup_module_map()
  47. def clear_defaults_cache(user=None):
  48. if user:
  49. for p in ([user] + common_default_keys):
  50. frappe.cache().hdel("defaults", p)
  51. elif frappe.flags.in_install!="frappe":
  52. frappe.cache().delete_key("defaults")
  53. def clear_document_cache():
  54. frappe.local.document_cache = {}
  55. frappe.cache().delete_key("document_cache")
  56. def clear_doctype_cache(doctype=None):
  57. cache = frappe.cache()
  58. if getattr(frappe.local, 'meta_cache') and (doctype in frappe.local.meta_cache):
  59. del frappe.local.meta_cache[doctype]
  60. for key in ('is_table', 'doctype_modules'):
  61. cache.delete_value(key)
  62. def clear_single(dt):
  63. for name in doctype_cache_keys:
  64. cache.hdel(name, dt)
  65. if doctype:
  66. clear_single(doctype)
  67. # clear all parent doctypes
  68. for dt in frappe.db.get_all('DocField', 'parent',
  69. dict(fieldtype=['in', frappe.model.table_fields], options=doctype)):
  70. clear_single(dt.parent)
  71. # clear all notifications
  72. delete_notification_count_for(doctype)
  73. else:
  74. # clear all
  75. for name in doctype_cache_keys:
  76. cache.delete_value(name)
  77. # Clear all document's cache. To clear documents of a specific DocType document_cache should be restructured
  78. clear_document_cache()
  79. def get_doctype_map(doctype, name, filters, order_by=None):
  80. cache = frappe.cache()
  81. cache_key = frappe.scrub(doctype) + '_map'
  82. doctype_map = cache.hget(cache_key, name)
  83. if doctype_map:
  84. # cached, return
  85. items = json.loads(doctype_map)
  86. else:
  87. # non cached, build cache
  88. try:
  89. items = frappe.get_all(doctype, filters=filters, order_by = order_by)
  90. cache.hset(cache_key, doctype, json.dumps(items))
  91. except frappe.db.TableMissingError:
  92. # executed from inside patch, ignore
  93. items = []
  94. return items
  95. def clear_doctype_map(doctype, name):
  96. cache_key = frappe.scrub(doctype) + '_map'
  97. frappe.cache().hdel(cache_key, name)
  98. def build_table_count_cache():
  99. if (frappe.flags.in_patch
  100. or frappe.flags.in_install
  101. or frappe.flags.in_migrate
  102. or frappe.flags.in_import
  103. or frappe.flags.in_setup_wizard):
  104. return
  105. _cache = frappe.cache()
  106. data = frappe.db.multisql({
  107. "mariadb": """
  108. SELECT table_name AS name,
  109. table_rows AS count
  110. FROM information_schema.tables""",
  111. "postgres": """
  112. SELECT "relname" AS name,
  113. "n_tup_ins" AS count
  114. FROM "pg_stat_all_tables"
  115. """
  116. }, as_dict=1)
  117. counts = {d.get('name').lstrip('tab'): d.get('count', None) for d in data}
  118. _cache.set_value("information_schema:counts", counts)
  119. return counts
  120. def build_domain_restriced_doctype_cache(*args, **kwargs):
  121. if (frappe.flags.in_patch
  122. or frappe.flags.in_install
  123. or frappe.flags.in_migrate
  124. or frappe.flags.in_import
  125. or frappe.flags.in_setup_wizard):
  126. return
  127. _cache = frappe.cache()
  128. active_domains = frappe.get_active_domains()
  129. doctypes = frappe.get_all("DocType", filters={'restrict_to_domain': ('IN', active_domains)})
  130. doctypes = [doc.name for doc in doctypes]
  131. _cache.set_value("domain_restricted_doctypes", doctypes)
  132. return doctypes
  133. def build_domain_restriced_page_cache(*args, **kwargs):
  134. if (frappe.flags.in_patch
  135. or frappe.flags.in_install
  136. or frappe.flags.in_migrate
  137. or frappe.flags.in_import
  138. or frappe.flags.in_setup_wizard):
  139. return
  140. _cache = frappe.cache()
  141. active_domains = frappe.get_active_domains()
  142. pages = frappe.get_all("Page", filters={'restrict_to_domain': ('IN', active_domains)})
  143. pages = [page.name for page in pages]
  144. _cache.set_value("domain_restricted_pages", pages)
  145. return pages