No puede seleccionar más de 25 temas Los temas deben comenzar con una letra o número, pueden incluir guiones ('-') y pueden tener hasta 35 caracteres de largo.

profile.py 5.5 KiB

hace 13 años
hace 13 años
hace 13 años
hace 13 años
hace 13 años
hace 13 años
hace 13 años
hace 13 años
hace 13 años
hace 13 años
hace 13 años
hace 13 años
hace 13 años
hace 13 años
hace 13 años
hace 13 años
hace 13 años
hace 12 años
hace 12 años
hace 13 años
hace 13 años
hace 13 años
hace 13 años
hace 13 años
hace 13 años
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198
  1. # Copyright (c) 2013, Web Notes Technologies Pvt. Ltd.
  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 = webnotes.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():
  133. """returns all system manager's profile details"""
  134. system_managers = webnotes.conn.sql("""select distinct name
  135. from tabProfile p
  136. where docstatus < 2 and enabled = 1
  137. and name not in ("Administrator", "Guest")
  138. and exists (select * from tabUserRole ur
  139. where ur.parent = p.name and ur.role="System Manager")""")
  140. return [p[0] for p in system_managers]
  141. def add_role(profile, role):
  142. profile_wrapper = webnotes.bean("Profile", profile)
  143. profile_wrapper.doclist.append({
  144. "doctype": "UserRole",
  145. "parentfield": "user_roles",
  146. "role": role
  147. })
  148. profile_wrapper.save()
  149. def add_system_manager(email, first_name=None, last_name=None):
  150. # add profile
  151. profile = webnotes.new_bean("Profile")
  152. profile.doc.fields.update({
  153. "name": email,
  154. "email": email,
  155. "enabled": 1,
  156. "first_name": first_name or email,
  157. "last_name": last_name
  158. })
  159. profile.insert()
  160. # add roles
  161. roles = webnotes.conn.sql_list("""select name from `tabRole`
  162. where name not in ("Administrator", "Guest", "All")""")
  163. profile.make_controller().add_roles(*roles)