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

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