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.
 
 
 
 
 
 

249 rivejä
6.1 KiB

  1. # Copyright (c) 2015, Frappe Technologies Pvt. Ltd. and Contributors
  2. # License: MIT. See LICENSE
  3. import frappe
  4. from frappe.cache_manager import clear_defaults_cache, common_default_keys
  5. from frappe.desk.notifications import clear_notifications
  6. from frappe.query_builder import DocType
  7. # Note: DefaultValue records are identified by parenttype
  8. # __default, __global or 'User Permission'
  9. def set_user_default(key, value, user=None, parenttype=None):
  10. set_default(key, value, user or frappe.session.user, parenttype)
  11. def add_user_default(key, value, user=None, parenttype=None):
  12. add_default(key, value, user or frappe.session.user, parenttype)
  13. def get_user_default(key, user=None):
  14. user_defaults = get_defaults(user or frappe.session.user)
  15. d = user_defaults.get(key, None)
  16. if is_a_user_permission_key(key):
  17. if d and isinstance(d, (list, tuple)) and len(d) == 1:
  18. # Use User Permission value when only when it has a single value
  19. d = d[0]
  20. else:
  21. d = user_defaults.get(frappe.scrub(key), None)
  22. value = isinstance(d, (list, tuple)) and d[0] or d
  23. if not_in_user_permission(key, value, user):
  24. return
  25. return value
  26. def get_user_default_as_list(key, user=None):
  27. user_defaults = get_defaults(user or frappe.session.user)
  28. d = user_defaults.get(key, None)
  29. if is_a_user_permission_key(key):
  30. if d and isinstance(d, (list, tuple)) and len(d) == 1:
  31. # Use User Permission value when only when it has a single value
  32. d = [d[0]]
  33. else:
  34. d = user_defaults.get(frappe.scrub(key), None)
  35. d = list(filter(None, (not isinstance(d, (list, tuple))) and [d] or d))
  36. # filter default values if not found in user permission
  37. values = [value for value in d if not not_in_user_permission(key, value)]
  38. return values
  39. def is_a_user_permission_key(key):
  40. return ":" not in key and key != frappe.scrub(key)
  41. def not_in_user_permission(key, value, user=None):
  42. # returns true or false based on if value exist in user permission
  43. user = user or frappe.session.user
  44. user_permission = get_user_permissions(user).get(frappe.unscrub(key)) or []
  45. for perm in user_permission:
  46. # doc found in user permission
  47. if perm.get("doc") == value:
  48. return False
  49. # return true only if user_permission exists
  50. return True if user_permission else False
  51. def get_user_permissions(user=None):
  52. from frappe.core.doctype.user_permission.user_permission import (
  53. get_user_permissions as _get_user_permissions,
  54. )
  55. """Return frappe.core.doctype.user_permissions.user_permissions._get_user_permissions (kept for backward compatibility)"""
  56. return _get_user_permissions(user)
  57. def get_defaults(user=None):
  58. globald = get_defaults_for()
  59. if not user:
  60. user = frappe.session.user if frappe.session else "Guest"
  61. if user:
  62. userd = {}
  63. userd.update(get_defaults_for(user))
  64. userd.update({"user": user, "owner": user})
  65. globald.update(userd)
  66. return globald
  67. def clear_user_default(key, user=None):
  68. clear_default(key, parent=user or frappe.session.user)
  69. # Global
  70. def set_global_default(key, value):
  71. set_default(key, value, "__default")
  72. def add_global_default(key, value):
  73. add_default(key, value, "__default")
  74. def get_global_default(key):
  75. d = get_defaults().get(key, None)
  76. value = isinstance(d, (list, tuple)) and d[0] or d
  77. if not_in_user_permission(key, value):
  78. return
  79. return value
  80. # Common
  81. def set_default(key, value, parent, parenttype="__default"):
  82. """Override or add a default value.
  83. Adds default value in table `tabDefaultValue`.
  84. :param key: Default key.
  85. :param value: Default value.
  86. :param parent: Usually, **User** to whom the default belongs.
  87. :param parenttype: [optional] default is `__default`."""
  88. table = DocType("DefaultValue")
  89. key_exists = (
  90. frappe.qb.from_(table)
  91. .where((table.defkey == key) & (table.parent == parent))
  92. .select(table.defkey)
  93. .for_update()
  94. .run()
  95. )
  96. if key_exists:
  97. frappe.db.delete("DefaultValue", {"defkey": key, "parent": parent})
  98. if value is not None:
  99. add_default(key, value, parent)
  100. else:
  101. _clear_cache(parent)
  102. def add_default(key, value, parent, parenttype=None):
  103. d = frappe.get_doc(
  104. {
  105. "doctype": "DefaultValue",
  106. "parent": parent,
  107. "parenttype": parenttype or "__default",
  108. "parentfield": "system_defaults",
  109. "defkey": key,
  110. "defvalue": value,
  111. }
  112. )
  113. d.insert(ignore_permissions=True)
  114. _clear_cache(parent)
  115. def clear_default(key=None, value=None, parent=None, name=None, parenttype=None):
  116. """Clear a default value by any of the given parameters and delete caches.
  117. :param key: Default key.
  118. :param value: Default value.
  119. :param parent: User name, or `__global`, `__default`.
  120. :param name: Default ID.
  121. :param parenttype: Clear defaults table for a particular type e.g. **User**.
  122. """
  123. filters = {}
  124. if name:
  125. filters.update({"name": name})
  126. else:
  127. if key:
  128. filters.update({"defkey": key})
  129. if value:
  130. filters.update({"defvalue": value})
  131. if parent:
  132. filters.update({"parent": parent})
  133. if parenttype:
  134. filters.update({"parenttype": parenttype})
  135. if parent:
  136. clear_defaults_cache(parent)
  137. else:
  138. clear_defaults_cache("__default")
  139. clear_defaults_cache("__global")
  140. if not filters:
  141. raise Exception("[clear_default] No key specified.")
  142. frappe.db.delete("DefaultValue", filters)
  143. _clear_cache(parent)
  144. def get_defaults_for(parent="__default"):
  145. """get all defaults"""
  146. defaults = frappe.cache().hget("defaults", parent)
  147. if defaults is None:
  148. # sort descending because first default must get precedence
  149. table = DocType("DefaultValue")
  150. res = (
  151. frappe.qb.from_(table)
  152. .where(table.parent == parent)
  153. .select(table.defkey, table.defvalue)
  154. .orderby("creation")
  155. .run(as_dict=True)
  156. )
  157. defaults = frappe._dict({})
  158. for d in res:
  159. if d.defkey in defaults:
  160. # listify
  161. if not isinstance(defaults[d.defkey], list) and defaults[d.defkey] != d.defvalue:
  162. defaults[d.defkey] = [defaults[d.defkey]]
  163. if d.defvalue not in defaults[d.defkey]:
  164. defaults[d.defkey].append(d.defvalue)
  165. elif d.defvalue is not None:
  166. defaults[d.defkey] = d.defvalue
  167. frappe.cache().hset("defaults", parent, defaults)
  168. return defaults
  169. def _clear_cache(parent):
  170. if parent in common_default_keys:
  171. frappe.clear_cache()
  172. else:
  173. clear_notifications(user=parent)
  174. frappe.clear_cache(user=parent)