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.
 
 
 
 
 
 

209 rivejä
5.6 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.desk.notifications import clear_notifications
  6. # Note: DefaultValue records are identified by parenttype
  7. # __default, __global or 'User Permission'
  8. common_keys = ["__default", "__global"]
  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. return isinstance(d, (list, tuple)) and d[0] or d
  23. def get_user_default_as_list(key, user=None):
  24. user_defaults = get_defaults(user or frappe.session.user)
  25. d = user_defaults.get(key, None)
  26. if is_a_user_permission_key(key):
  27. if d and isinstance(d, (list, tuple)) and len(d)==1:
  28. # Use User Permission value when only when it has a single value
  29. d = [d[0]]
  30. else:
  31. d = user_defaults.get(frappe.scrub(key), None)
  32. return list(filter(None, (not isinstance(d, (list, tuple))) and [d] or d))
  33. def is_a_user_permission_key(key):
  34. return ":" not in key and key != frappe.scrub(key)
  35. def get_user_permissions(user=None):
  36. from frappe.core.doctype.user_permission.user_permission \
  37. import get_user_permissions as _get_user_permissions
  38. '''Return frappe.core.doctype.user_permissions.user_permissions._get_user_permissions (kept for backward compatibility)'''
  39. return _get_user_permissions(user)
  40. def get_defaults(user=None):
  41. globald = get_defaults_for()
  42. if not user:
  43. user = frappe.session.user if frappe.session else "Guest"
  44. if user:
  45. userd = {}
  46. userd.update(get_defaults_for(user))
  47. userd.update({"user": user, "owner": user})
  48. globald.update(userd)
  49. return globald
  50. def clear_user_default(key, user=None):
  51. clear_default(key, parent=user or frappe.session.user)
  52. # Global
  53. def set_global_default(key, value):
  54. set_default(key, value, "__default")
  55. def add_global_default(key, value):
  56. add_default(key, value, "__default")
  57. def get_global_default(key):
  58. d = get_defaults().get(key, None)
  59. return isinstance(d, list) and d[0] or d
  60. # Common
  61. def set_default(key, value, parent, parenttype="__default"):
  62. """Override or add a default value.
  63. Adds default value in table `tabDefaultValue`.
  64. :param key: Default key.
  65. :param value: Default value.
  66. :param parent: Usually, **User** to whom the default belongs.
  67. :param parenttype: [optional] default is `__default`."""
  68. if frappe.db.sql('''
  69. select
  70. defkey
  71. from
  72. tabDefaultValue
  73. where
  74. defkey=%s and parent=%s
  75. for update''', (key, parent)):
  76. frappe.db.sql("""
  77. delete from
  78. `tabDefaultValue`
  79. where
  80. defkey=%s and parent=%s""", (key, parent))
  81. if value != None:
  82. add_default(key, value, parent)
  83. def add_default(key, value, parent, parenttype=None):
  84. d = frappe.get_doc({
  85. "doctype": "DefaultValue",
  86. "parent": parent,
  87. "parenttype": parenttype or "__default",
  88. "parentfield": "system_defaults",
  89. "defkey": key,
  90. "defvalue": value
  91. })
  92. d.insert(ignore_permissions=True)
  93. _clear_cache(parent)
  94. def clear_default(key=None, value=None, parent=None, name=None, parenttype=None):
  95. """Clear a default value by any of the given parameters and delete caches.
  96. :param key: Default key.
  97. :param value: Default value.
  98. :param parent: User name, or `__global`, `__default`.
  99. :param name: Default ID.
  100. :param parenttype: Clear defaults table for a particular type e.g. **User**.
  101. """
  102. conditions = []
  103. values = []
  104. if name:
  105. conditions.append("name=%s")
  106. values.append(name)
  107. else:
  108. if key:
  109. conditions.append("defkey=%s")
  110. values.append(key)
  111. if value:
  112. conditions.append("defvalue=%s")
  113. values.append(value)
  114. if parent:
  115. conditions.append("parent=%s")
  116. values.append(parent)
  117. if parenttype:
  118. conditions.append("parenttype=%s")
  119. values.append(parenttype)
  120. if parent:
  121. clear_cache(parent)
  122. else:
  123. clear_cache("__default")
  124. clear_cache("__global")
  125. if not conditions:
  126. raise Exception("[clear_default] No key specified.")
  127. frappe.db.sql("""delete from tabDefaultValue where {0}""".format(" and ".join(conditions)),
  128. tuple(values))
  129. _clear_cache(parent)
  130. def get_defaults_for(parent="__default"):
  131. """get all defaults"""
  132. defaults = frappe.cache().hget("defaults", parent)
  133. if defaults==None:
  134. # sort descending because first default must get precedence
  135. res = frappe.db.sql("""select defkey, defvalue from `tabDefaultValue`
  136. where parent = %s order by creation""", (parent,), as_dict=1)
  137. defaults = frappe._dict({})
  138. for d in res:
  139. if d.defkey in defaults:
  140. # listify
  141. if not isinstance(defaults[d.defkey], list) and defaults[d.defkey] != d.defvalue:
  142. defaults[d.defkey] = [defaults[d.defkey]]
  143. if d.defvalue not in defaults[d.defkey]:
  144. defaults[d.defkey].append(d.defvalue)
  145. elif d.defvalue is not None:
  146. defaults[d.defkey] = d.defvalue
  147. frappe.cache().hset("defaults", parent, defaults)
  148. return defaults
  149. def _clear_cache(parent):
  150. if parent in common_keys:
  151. frappe.clear_cache()
  152. else:
  153. clear_notifications(user=parent)
  154. frappe.clear_cache(user=parent)
  155. def clear_cache(user=None):
  156. if user:
  157. for p in ([user] + common_keys):
  158. frappe.cache().hdel("defaults", p)
  159. elif frappe.flags.in_install!="frappe":
  160. frappe.cache().delete_key("defaults")