Não pode escolher mais do que 25 tópicos Os tópicos devem começar com uma letra ou um número, podem incluir traços ('-') e podem ter até 35 caracteres.
 
 
 
 
 
 

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