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.

преди 11 години
преди 11 години
преди 11 години
преди 11 години
преди 11 години
преди 11 години
преди 12 години
преди 9 години
преди 11 години
преди 11 години
преди 11 години
преди 11 години
преди 11 години
преди 11 години
преди 11 години
преди 11 години
преди 11 години
преди 11 години
преди 11 години
преди 12 години
преди 10 години
преди 11 години
преди 12 години
преди 10 години
преди 10 години
преди 11 години
преди 11 години
преди 11 години
преди 11 години
преди 11 години
преди 11 години
преди 10 години
преди 10 години
преди 8 години
преди 11 години
преди 11 години
преди 11 години
преди 10 години
преди 11 години
преди 11 години
преди 10 години
преди 11 години
преди 11 години
преди 11 години
преди 11 години
преди 11 години
преди 11 години
преди 11 години
преди 11 години
преди 11 години
преди 9 години
преди 11 години
преди 11 години
преди 11 години
преди 11 години
преди 11 години
преди 12 години
преди 10 години
преди 11 години
преди 10 години
преди 11 години
преди 11 години
преди 11 години
преди 11 години
преди 10 години
преди 10 години
преди 10 години
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211
  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")