選択できるのは25トピックまでです。 トピックは、先頭が英数字で、英数字とダッシュ('-')を使用した35文字以内のものにしてください。

profile.py 6.3 KiB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220
  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_search = []
  20. self.can_get_report = []
  21. self.allow_modules = []
  22. self.in_create = []
  23. def get_roles(self):
  24. """get list of roles"""
  25. if not self.roles:
  26. self.roles = get_roles(self.name)
  27. return self.roles
  28. def build_doctype_map(self):
  29. """build map of special doctype properties"""
  30. self.doctype_map = {}
  31. for r in webnotes.conn.sql("""select name, in_create, issingle, istable,
  32. read_only, module from tabDocType""", as_dict=1):
  33. self.doctype_map[r['name']] = r
  34. def build_perm_map(self):
  35. """build map of permissions at level 0"""
  36. self.perm_map = {}
  37. for r in webnotes.conn.sql("""select parent, `read`, `write`, `create`, `submit`, `cancel`, `report`
  38. from tabDocPerm where docstatus=0
  39. and ifnull(permlevel,0)=0
  40. and parent not like "old_parent:%%"
  41. and role in ('%s')""" % "','".join(self.get_roles()), as_dict=1):
  42. dt = r['parent']
  43. if not dt in self.perm_map:
  44. self.perm_map[dt] = {}
  45. for k in ('read', 'write', 'create', 'submit', 'cancel', 'report'):
  46. if not self.perm_map[dt].get(k):
  47. self.perm_map[dt][k] = r.get(k)
  48. def build_permissions(self):
  49. """build lists of what the user can read / write / create
  50. quirks:
  51. read_only => Not in Search
  52. in_create => Not in create
  53. """
  54. self.build_doctype_map()
  55. self.build_perm_map()
  56. for dt in self.doctype_map:
  57. dtp = self.doctype_map[dt]
  58. p = self.perm_map.get(dt, {})
  59. if not dtp.get('istable'):
  60. if p.get('create') and not dtp.get('issingle'):
  61. if dtp.get('in_create'):
  62. self.in_create.append(dt)
  63. else:
  64. self.can_create.append(dt)
  65. elif p.get('write'):
  66. self.can_write.append(dt)
  67. elif p.get('read'):
  68. if dtp.get('read_only'):
  69. self.all_read.append(dt)
  70. else:
  71. self.can_read.append(dt)
  72. if p.get('cancel'):
  73. self.can_cancel.append(dt)
  74. if (p.get('read') or p.get('write') or p.get('create')):
  75. if p.get('report'):
  76. self.can_get_report.append(dt)
  77. if not dtp.get('istable'):
  78. if not dtp.get('issingle') and not dtp.get('read_only'):
  79. self.can_search.append(dt)
  80. if not dtp.get('module') in self.allow_modules:
  81. self.allow_modules.append(dtp.get('module'))
  82. self.can_write += self.can_create
  83. self.can_write += self.in_create
  84. self.can_read += self.can_write
  85. self.all_read += self.can_read
  86. def get_defaults(self):
  87. import webnotes.defaults
  88. self.defaults = webnotes.defaults.get_defaults(self.name)
  89. return self.defaults
  90. # update recent documents
  91. def update_recent(self, dt, dn):
  92. rdl = webnotes.cache().get_value("recent:" + self.name) or []
  93. new_rd = [dt, dn]
  94. # clear if exists
  95. for i in range(len(rdl)):
  96. rd = rdl[i]
  97. if rd==new_rd:
  98. del rdl[i]
  99. break
  100. if len(rdl) > 19:
  101. rdl = rdl[:19]
  102. rdl = [new_rd] + rdl
  103. r = webnotes.cache().set_value("recent:" + self.name, rdl)
  104. def get_can_read(self):
  105. """return list of doctypes that the user can read"""
  106. if not self.can_read:
  107. self.build_permissions()
  108. return self.can_read
  109. def load_profile(self):
  110. d = webnotes.conn.sql("""select email, first_name, last_name,
  111. email_signature, background_image, user_type
  112. from tabProfile where name = %s""", self.name, as_dict=1)[0]
  113. if not self.can_read:
  114. self.build_permissions()
  115. d.name = self.name
  116. d.recent = json.dumps(webnotes.cache().get_value("recent:" + self.name) or [])
  117. d['roles'] = self.get_roles()
  118. d['defaults'] = self.get_defaults()
  119. d['can_create'] = self.can_create
  120. d['can_write'] = self.can_write
  121. d['can_read'] = list(set(self.can_read))
  122. d['can_cancel'] = list(set(self.can_cancel))
  123. d['can_get_report'] = list(set(self.can_get_report))
  124. d['allow_modules'] = self.allow_modules
  125. d['all_read'] = self.all_read
  126. d['can_search'] = list(set(self.can_search))
  127. d['in_create'] = self.in_create
  128. return d
  129. def get_user_fullname(user):
  130. fullname = webnotes.conn.sql("SELECT CONCAT_WS(' ', first_name, last_name) FROM `tabProfile` WHERE name=%s", user)
  131. return fullname and fullname[0][0] or ''
  132. def get_system_managers(only_name=False):
  133. """returns all system manager's profile details"""
  134. import email.utils
  135. system_managers = webnotes.conn.sql("""select distinct name,
  136. concat_ws(" ", if(first_name="", null, first_name), if(last_name="", null, last_name))
  137. as fullname from tabProfile p
  138. where docstatus < 2 and enabled = 1
  139. and name not in ("Administrator", "Guest")
  140. and exists (select * from tabUserRole ur
  141. where ur.parent = p.name and ur.role="System Manager")""", as_dict=True)
  142. if only_name:
  143. return [p.name for p in system_managers]
  144. else:
  145. return [email.utils.formataddr((p.fullname, p.name)) for p in system_managers]
  146. def add_role(profile, role):
  147. profile_wrapper = webnotes.bean("Profile", profile)
  148. profile_wrapper.doclist.append({
  149. "doctype": "UserRole",
  150. "parentfield": "user_roles",
  151. "role": role
  152. })
  153. profile_wrapper.save()
  154. def add_system_manager(email, first_name=None, last_name=None):
  155. # add profile
  156. profile = webnotes.new_bean("Profile")
  157. profile.doc.fields.update({
  158. "name": email,
  159. "email": email,
  160. "enabled": 1,
  161. "first_name": first_name or email,
  162. "last_name": last_name
  163. })
  164. profile.insert()
  165. # add roles
  166. roles = webnotes.conn.sql_list("""select name from `tabRole`
  167. where name not in ("Administrator", "Guest", "All")""")
  168. profile.make_controller().add_roles(*roles)
  169. def get_roles(username=None, with_standard=True):
  170. """get roles of current user"""
  171. if not username:
  172. username = webnotes.session.user
  173. if username=='Guest':
  174. return ['Guest']
  175. roles = [r[0] for r in webnotes.conn.sql("""select role from tabUserRole
  176. where parent=%s and role!='All'""", username)] + ['All']
  177. # filter standard if required
  178. if not with_standard:
  179. roles = filter(lambda x: x not in ['All', 'Guest', 'Administrator'], roles)
  180. return roles