Ви не можете вибрати більше 25 тем Теми мають розпочинатися з літери або цифри, можуть містити дефіси (-) і не повинні перевищувати 35 символів.
 
 
 
 
 
 

161 рядки
4.4 KiB

  1. # Copyright (c) 2013, Web Notes Technologies Pvt. Ltd. and Contributors
  2. # MIT License. See license.txt
  3. from __future__ import unicode_literals
  4. import webnotes
  5. import memc
  6. # User
  7. def set_user_default(key, value, user=None):
  8. set_default(key, value, user or webnotes.session.user)
  9. def add_user_default(key, value, user=None):
  10. add_default(key, value, user or webnotes.session.user)
  11. def get_user_default(key, user=None):
  12. d = get_defaults(user or webnotes.session.user).get(key, None)
  13. return isinstance(d, list) and d[0] or d
  14. def get_user_default_as_list(key, user=None):
  15. d = get_defaults(user or webnotes.session.user).get(key, None)
  16. return (not isinstance(d, list)) and [d] or d
  17. def get_defaults(user=None):
  18. if not user and webnotes.session:
  19. user = webnotes.session.user
  20. if user:
  21. userd = get_defaults_for(user)
  22. if user in ["__global", "Control Panel"]:
  23. userd.update({"user": webnotes.session.user, "owner": webnotes.session.user})
  24. else:
  25. userd.update({"user": user, "owner": user})
  26. else:
  27. userd = {}
  28. globald = get_defaults_for()
  29. globald.update(userd)
  30. return globald
  31. def clear_user_default(key, user=None):
  32. clear_default(key, parent=user or webnotes.session.user)
  33. # Global
  34. def set_global_default(key, value):
  35. set_default(key, value, "Control Panel")
  36. def add_global_default(key, value):
  37. add_default(key, value, "Control Panel")
  38. def get_global_default(key):
  39. d = get_defaults().get(key, None)
  40. return isinstance(d, list) and d[0] or d
  41. # Common
  42. def set_default(key, value, parent):
  43. if webnotes.conn.sql("""select defkey from `tabDefaultValue` where
  44. defkey=%s and parent=%s """, (key, parent)):
  45. # update
  46. webnotes.conn.sql("""update `tabDefaultValue` set defvalue=%s
  47. where parent=%s and defkey=%s""", (value, parent, key))
  48. clear_cache(parent)
  49. else:
  50. add_default(key, value, parent)
  51. def add_default(key, value, parent):
  52. d = webnotes.doc({
  53. "doctype": "DefaultValue",
  54. "parent": parent,
  55. "parenttype": "Control Panel",
  56. "parentfield": "system_defaults",
  57. "defkey": key,
  58. "defvalue": value
  59. })
  60. d.insert()
  61. clear_cache(parent)
  62. def clear_default(key=None, value=None, parent=None, name=None):
  63. conditions = []
  64. values = []
  65. if key:
  66. conditions.append("defkey=%s")
  67. values.append(key)
  68. if value:
  69. conditions.append("defvalue=%s")
  70. values.append(value)
  71. if name:
  72. conditions.append("name=%s")
  73. values.append(name)
  74. if parent:
  75. conditions.append("parent=%s")
  76. values.append(parent)
  77. if not conditions:
  78. raise Exception, "[clear_default] No key specified."
  79. webnotes.conn.sql("""delete from tabDefaultValue where %s""" % " and ".join(conditions), values)
  80. clear_cache()
  81. def get_defaults_for(parent="Control Panel"):
  82. """get all defaults"""
  83. defaults = webnotes.cache().get_value("__defaults:" + parent)
  84. if not defaults:
  85. res = webnotes.conn.sql("""select defkey, defvalue from `tabDefaultValue`
  86. where parent = %s order by creation""", parent, as_dict=1)
  87. defaults = webnotes._dict({})
  88. for d in res:
  89. if d.defkey in defaults:
  90. # listify
  91. if not isinstance(defaults[d.defkey], list) and defaults[d.defkey] != d.defvalue:
  92. defaults[d.defkey] = [defaults[d.defkey]]
  93. if d.defvalue not in defaults[d.defkey]:
  94. defaults[d.defkey].append(d.defvalue)
  95. elif d.defvalue is not None:
  96. defaults[d.defkey] = d.defvalue
  97. if webnotes.session and parent == webnotes.session.user:
  98. defaults.update(get_defaults_for_match(defaults))
  99. webnotes.cache().set_value("__defaults:" + parent, defaults)
  100. return defaults
  101. def get_defaults_for_match(userd):
  102. """ if a profile based match condition exists for a user's role
  103. and no user property is specified for that match key,
  104. set default value as user's profile for that match key"""
  105. user_roles = webnotes.get_roles()
  106. out = {}
  107. for role, match in webnotes.conn.sql("""select distinct role, `match`
  108. from `tabDocPerm` where ifnull(permlevel, 0)=0 and `read`=1
  109. and `match` like "%:user" """):
  110. if role in user_roles and match.split(":")[0] not in userd:
  111. out[match.split(":")[0]] = webnotes.session.user
  112. return out
  113. def clear_cache(parent=None):
  114. def all_profiles():
  115. return webnotes.conn.sql_list("select name from tabProfile") + ["Control Panel", "__global"]
  116. if parent=="Control Panel" or not parent:
  117. parent = all_profiles()
  118. elif isinstance(parent, basestring):
  119. parent = [parent]
  120. for p in parent:
  121. webnotes.cache().delete_value("__defaults:" + p)
  122. webnotes.clear_cache()