Nie możesz wybrać więcej, niż 25 tematów Tematy muszą się zaczynać od litery lub cyfry, mogą zawierać myślniki ('-') i mogą mieć do 35 znaków.
 
 
 
 
 
 

227 wiersze
6.6 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_search = []
  20. self.can_get_report = []
  21. self.can_import = []
  22. self.can_export = []
  23. self.can_print = []
  24. self.can_email = []
  25. self.can_restrict = []
  26. self.allow_modules = []
  27. self.in_create = []
  28. def get_roles(self):
  29. """get list of roles"""
  30. if not self.roles:
  31. self.roles = get_roles(self.name)
  32. return self.roles
  33. def build_doctype_map(self):
  34. """build map of special doctype properties"""
  35. self.doctype_map = {}
  36. for r in webnotes.conn.sql("""select name, in_create, issingle, istable,
  37. read_only, module from tabDocType""", as_dict=1):
  38. self.doctype_map[r['name']] = r
  39. def build_perm_map(self):
  40. """build map of permissions at level 0"""
  41. self.perm_map = {}
  42. for r in webnotes.conn.sql("""select parent, `read`, `write`, `create`, `submit`, `cancel`,
  43. `report`, `import`, `export`, `print`, `email`, `restrict`
  44. from tabDocPerm where docstatus=0
  45. and ifnull(permlevel,0)=0
  46. and parent not like "old_parent:%%"
  47. and role in ('%s')""" % "','".join(self.get_roles()), as_dict=1):
  48. dt = r['parent']
  49. if not dt in self.perm_map:
  50. self.perm_map[dt] = {}
  51. for k in ('read', 'write', 'create', 'submit', 'cancel', 'amend',
  52. 'report', 'import', 'export', 'print', 'email', 'restrict'):
  53. if not self.perm_map[dt].get(k):
  54. self.perm_map[dt][k] = r.get(k)
  55. def build_permissions(self):
  56. """build lists of what the user can read / write / create
  57. quirks:
  58. read_only => Not in Search
  59. in_create => Not in create
  60. """
  61. self.build_doctype_map()
  62. self.build_perm_map()
  63. for dt in self.doctype_map:
  64. dtp = self.doctype_map[dt]
  65. p = self.perm_map.get(dt, {})
  66. if not dtp.get('istable'):
  67. if p.get('create') and not dtp.get('issingle'):
  68. if dtp.get('in_create'):
  69. self.in_create.append(dt)
  70. else:
  71. self.can_create.append(dt)
  72. elif p.get('write'):
  73. self.can_write.append(dt)
  74. elif p.get('read'):
  75. if dtp.get('read_only'):
  76. self.all_read.append(dt)
  77. else:
  78. self.can_read.append(dt)
  79. if p.get('cancel'):
  80. self.can_cancel.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", "restrict"):
  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 webnotes.defaults
  98. self.defaults = webnotes.defaults.get_defaults(self.name)
  99. return self.defaults
  100. # update recent documents
  101. def update_recent(self, dt, dn):
  102. rdl = webnotes.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 = webnotes.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_profile(self):
  124. d = webnotes.conn.sql("""select email, first_name, last_name,
  125. email_signature, background_image, user_type, language
  126. from tabProfile 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(webnotes.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",
  134. "can_get_report", "allow_modules", "all_read", "can_search",
  135. "in_create", "can_export", "can_import", "can_print", "can_email",
  136. "can_restrict"):
  137. d[key] = list(set(getattr(self, key)))
  138. return d
  139. def get_user_fullname(user):
  140. fullname = webnotes.conn.sql("SELECT CONCAT_WS(' ', first_name, last_name) FROM `tabProfile` WHERE name=%s", (user,))
  141. return fullname and fullname[0][0] or ''
  142. def get_system_managers(only_name=False):
  143. """returns all system manager's profile details"""
  144. import email.utils
  145. system_managers = webnotes.conn.sql("""select distinct name,
  146. concat_ws(" ", if(first_name="", null, first_name), if(last_name="", null, last_name))
  147. as fullname from tabProfile p
  148. where docstatus < 2 and enabled = 1
  149. and name not in ("Administrator", "Guest")
  150. and exists (select * from tabUserRole ur
  151. where ur.parent = p.name and ur.role="System Manager")""", as_dict=True)
  152. if only_name:
  153. return [p.name for p in system_managers]
  154. else:
  155. return [email.utils.formataddr((p.fullname, p.name)) for p in system_managers]
  156. def add_role(profile, role):
  157. profile_wrapper = webnotes.bean("Profile", profile).get_controller().add_roles([role])
  158. def add_system_manager(email, first_name=None, last_name=None):
  159. # add profile
  160. profile = webnotes.new_bean("Profile")
  161. profile.doc.fields.update({
  162. "name": email,
  163. "email": email,
  164. "enabled": 1,
  165. "first_name": first_name or email,
  166. "last_name": last_name,
  167. "user_type": "System User"
  168. })
  169. profile.insert()
  170. # add roles
  171. roles = webnotes.conn.sql_list("""select name from `tabRole`
  172. where name not in ("Administrator", "Guest", "All")""")
  173. profile.get_controller().add_roles(*roles)
  174. def get_roles(username=None, with_standard=True):
  175. """get roles of current user"""
  176. if not username:
  177. username = webnotes.session.user
  178. if username=='Guest':
  179. return ['Guest']
  180. roles = [r[0] for r in webnotes.conn.sql("""select role from tabUserRole
  181. where parent=%s and role!='All'""", (username,))] + ['All']
  182. # filter standard if required
  183. if not with_standard:
  184. roles = filter(lambda x: x not in ['All', 'Guest', 'Administrator'], roles)
  185. return roles