您最多选择25个主题 主题必须以字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符
 
 
 
 
 
 

242 行
6.8 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 frappe, json
  5. class User:
  6. """
  7. A user object is created at the beginning of every request with details of the use.
  8. The global user object is `frappe.user`
  9. """
  10. def __init__(self, name=''):
  11. self.defaults = None
  12. self.name = name or frappe.session.get('user')
  13. self.roles = []
  14. self.all_read = []
  15. self.can_create = []
  16. self.can_read = []
  17. self.can_write = []
  18. self.can_cancel = []
  19. self.can_delete = []
  20. self.can_search = []
  21. self.can_get_report = []
  22. self.can_import = []
  23. self.can_export = []
  24. self.can_print = []
  25. self.can_email = []
  26. self.can_set_user_permissions = []
  27. self.allow_modules = []
  28. self.in_create = []
  29. def get_roles(self):
  30. """get list of roles"""
  31. if not self.roles:
  32. self.roles = get_roles(self.name)
  33. return self.roles
  34. def build_doctype_map(self):
  35. """build map of special doctype properties"""
  36. self.doctype_map = {}
  37. for r in frappe.db.sql("""select name, in_create, issingle, istable,
  38. read_only, module from tabDocType""", as_dict=1):
  39. self.doctype_map[r['name']] = r
  40. def build_perm_map(self):
  41. """build map of permissions at level 0"""
  42. self.perm_map = {}
  43. roles = self.get_roles()
  44. for r in frappe.db.sql("""select * from tabDocPerm where docstatus=0
  45. and ifnull(permlevel,0)=0
  46. and role in ({roles})""".format(roles=", ".join(["%s"]*len(roles))), tuple(roles), as_dict=1):
  47. dt = r['parent']
  48. if not dt in self.perm_map:
  49. self.perm_map[dt] = {}
  50. for k in frappe.permissions.rights:
  51. if not self.perm_map[dt].get(k):
  52. self.perm_map[dt][k] = r.get(k)
  53. def build_permissions(self):
  54. """build lists of what the user can read / write / create
  55. quirks:
  56. read_only => Not in Search
  57. in_create => Not in create
  58. """
  59. self.build_doctype_map()
  60. self.build_perm_map()
  61. for dt in self.doctype_map:
  62. dtp = self.doctype_map[dt]
  63. p = self.perm_map.get(dt, {})
  64. if not dtp.get('istable'):
  65. if p.get('create') and not dtp.get('issingle'):
  66. if dtp.get('in_create'):
  67. self.in_create.append(dt)
  68. else:
  69. self.can_create.append(dt)
  70. elif p.get('write'):
  71. self.can_write.append(dt)
  72. elif p.get('read'):
  73. if dtp.get('read_only'):
  74. self.all_read.append(dt)
  75. else:
  76. self.can_read.append(dt)
  77. if p.get('cancel'):
  78. self.can_cancel.append(dt)
  79. if p.get('delete'):
  80. self.can_delete.append(dt)
  81. if (p.get('read') or p.get('write') or p.get('create')):
  82. if p.get('report'):
  83. self.can_get_report.append(dt)
  84. for key in ("import", "export", "print", "email", "set_user_permissions"):
  85. if p.get(key):
  86. getattr(self, "can_" + key).append(dt)
  87. if not dtp.get('istable'):
  88. if not dtp.get('issingle') and not dtp.get('read_only'):
  89. self.can_search.append(dt)
  90. if not dtp.get('module') in self.allow_modules:
  91. self.allow_modules.append(dtp.get('module'))
  92. self.can_write += self.can_create
  93. self.can_write += self.in_create
  94. self.can_read += self.can_write
  95. self.all_read += self.can_read
  96. def get_defaults(self):
  97. import frappe.defaults
  98. self.defaults = frappe.defaults.get_defaults(self.name)
  99. return self.defaults
  100. # update recent documents
  101. def update_recent(self, dt, dn):
  102. rdl = frappe.cache().get_value("recent:" + self.name) or []
  103. new_rd = [dt, dn]
  104. # clear if exists
  105. for i in range(len(rdl)):
  106. rd = rdl[i]
  107. if rd==new_rd:
  108. del rdl[i]
  109. break
  110. if len(rdl) > 19:
  111. rdl = rdl[:19]
  112. rdl = [new_rd] + rdl
  113. r = frappe.cache().set_value("recent:" + self.name, rdl)
  114. def _get(self, key):
  115. if not self.can_read:
  116. self.build_permissions()
  117. return getattr(self, key)
  118. def get_can_read(self):
  119. """return list of doctypes that the user can read"""
  120. if not self.can_read:
  121. self.build_permissions()
  122. return self.can_read
  123. def load_user(self):
  124. d = frappe.db.sql("""select email, first_name, last_name, time_zone,
  125. email_signature, background_image, background_style, user_type, language
  126. from tabUser where name = %s""", (self.name,), as_dict=1)[0]
  127. if not self.can_read:
  128. self.build_permissions()
  129. d.name = self.name
  130. d.recent = json.dumps(frappe.cache().get_value("recent:" + self.name) or [])
  131. d['roles'] = self.get_roles()
  132. d['defaults'] = self.get_defaults()
  133. for key in ("can_create", "can_write", "can_read", "can_cancel", "can_delete",
  134. "can_get_report", "allow_modules", "all_read", "can_search",
  135. "in_create", "can_export", "can_import", "can_print", "can_email",
  136. "can_set_user_permissions"):
  137. d[key] = list(set(getattr(self, key)))
  138. return d
  139. def get_user_fullname(user):
  140. fullname = frappe.db.sql("SELECT CONCAT_WS(' ', first_name, last_name) FROM `tabUser` WHERE name=%s", (user,))
  141. return fullname and fullname[0][0] or ''
  142. def get_fullname_and_avatar(user):
  143. first_name, last_name, avatar = frappe.db.get_value("User",
  144. user, ["first_name", "last_name", "user_image"])
  145. return {
  146. "fullname": " ".join(filter(None, [first_name, last_name])),
  147. "avatar": avatar
  148. }
  149. def get_system_managers(only_name=False):
  150. """returns all system manager's user details"""
  151. import email.utils
  152. from frappe.core.doctype.user.user import STANDARD_USERS
  153. system_managers = frappe.db.sql("""select distinct name,
  154. concat_ws(" ", if(first_name="", null, first_name), if(last_name="", null, last_name))
  155. as fullname from tabUser p
  156. where docstatus < 2 and enabled = 1
  157. and name not in ({})
  158. and exists (select * from tabUserRole ur
  159. where ur.parent = p.name and ur.role="System Manager")""".format(", ".join(["%s"]*len(STANDARD_USERS))),
  160. STANDARD_USERS, as_dict=True)
  161. if only_name:
  162. return [p.name for p in system_managers]
  163. else:
  164. return [email.utils.formataddr((p.fullname, p.name)) for p in system_managers]
  165. def add_role(user, role):
  166. user_wrapper = frappe.get_doc("User", user).add_roles(role)
  167. def add_system_manager(email, first_name=None, last_name=None):
  168. # add user
  169. user = frappe.new_doc("User")
  170. user.update({
  171. "name": email,
  172. "email": email,
  173. "enabled": 1,
  174. "first_name": first_name or email,
  175. "last_name": last_name,
  176. "user_type": "System User"
  177. })
  178. user.insert()
  179. # add roles
  180. roles = frappe.db.sql_list("""select name from `tabRole`
  181. where name not in ("Administrator", "Guest", "All")""")
  182. user.add_roles(*roles)
  183. def get_roles(username=None, with_standard=True):
  184. """get roles of current user"""
  185. if not username:
  186. username = frappe.session.user
  187. if username=='Guest':
  188. return ['Guest']
  189. roles = frappe.cache().get_value("roles:" + username)
  190. if not roles:
  191. roles = [r[0] for r in frappe.db.sql("""select role from tabUserRole
  192. where parent=%s and role!='All'""", (username,))] + ['All']
  193. frappe.cache().set_value("roles:" + username, roles)
  194. # filter standard if required
  195. if not with_standard:
  196. roles = filter(lambda x: x not in ['All', 'Guest', 'Administrator'], roles)
  197. return roles