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.
 
 
 
 
 
 

154 lines
4.1 KiB

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