Du kannst nicht mehr als 25 Themen auswählen Themen müssen entweder mit einem Buchstaben oder einer Ziffer beginnen. Sie können Bindestriche („-“) enthalten und bis zu 35 Zeichen lang sein.
 
 
 
 
 
 

226 Zeilen
6.4 KiB

  1. import webnotes
  2. class Profile:
  3. """
  4. A profile object is created at the beginning of every request with details of the use.
  5. The global profile object is `webnotes.user`
  6. """
  7. def __init__(self, name=''):
  8. self.name = name or webnotes.session.get('user')
  9. self.roles = []
  10. self.can_create = []
  11. self.can_read = []
  12. self.can_write = []
  13. self.can_get_report = []
  14. def _load_roles(self):
  15. res = webnotes.conn.sql('select role from tabUserRole where parent = %s', self.name)
  16. self.roles = []
  17. for t in res:
  18. if t[0]: self.roles.append(t[0])
  19. if webnotes.session.get('user') == 'Guest':
  20. self.roles.append('Guest')
  21. else:
  22. self.roles.append('All')
  23. return self.roles
  24. def get_roles(self):
  25. """
  26. get list of roles
  27. """
  28. if self.roles:
  29. return self.roles
  30. return self._load_roles()
  31. def get_allow_list(self, key):
  32. """
  33. Internal - get list of DocType where `key` is allowed. Key is either 'read', 'write' or 'create'
  34. """
  35. conn = webnotes.conn
  36. roles = self.get_roles()
  37. return [r[0] for r in conn.sql('SELECT DISTINCT t1.parent FROM `tabDocPerm` t1, tabDocType t2 WHERE t1.`%s`=1 AND t1.parent not like "old_parent:%%" AND t1.parent = t2.name AND IFNULL(t2.istable,0) = 0 AND t1.role in ("%s") order by t1.parent' % (key, '", "'.join(roles)))]
  38. def get_create_list(self):
  39. """
  40. Get list of DocTypes the user can create. Will filter DocTypes tagged with 'not_in_create' and table
  41. """
  42. cl = self.get_allow_list('create')
  43. conn = webnotes.conn
  44. no_create_list = [r[0] for r in conn.sql('select name from tabDocType where ifnull(in_create,0)=1 or ifnull(istable,0)=1 or ifnull(issingle,0)=1')]
  45. self.can_create = filter(lambda x: x not in no_create_list, cl)
  46. return self.can_create
  47. def get_read_list(self):
  48. """
  49. Get list of DocTypes the user can read
  50. """
  51. self.can_read = list(set(self.get_allow_list('read') + self.get_allow_list('write')))
  52. return self.can_read
  53. def get_report_list(self):
  54. conn = webnotes.conn
  55. # get all tables list
  56. res = conn.sql('SELECT parent, options from tabDocField where fieldtype="Table"')
  57. table_types, all_tabletypes = {}, []
  58. # make a dictionary fo all table types
  59. for t in res:
  60. all_tabletypes.append(t[1])
  61. if not table_types.has_key(t[0]):
  62. table_types[t[0]] = []
  63. table_types[t[0]].append(t[1])
  64. no_search_list = [r[0] for r in conn.sql('SELECT name FROM tabDocType WHERE read_only = 1 ORDER BY name')]
  65. # make the lists
  66. for f in self.can_read:
  67. tl = table_types.get(f, None)
  68. if tl:
  69. for t in tl:
  70. if t and (not t in self.can_get_report) and (not t in no_search_list):
  71. self.can_get_report.append(t)
  72. if f and (not f in self.can_get_report) and (not f in no_search_list):
  73. self.can_get_report.append(f)
  74. return self.can_get_report
  75. def get_write_list(self):
  76. """
  77. Get list of DocTypes the user can write
  78. """
  79. self.can_write = self.get_allow_list('write')
  80. return self.can_write
  81. def get_home_page(self):
  82. """
  83. Get the name of the user's home page from the `Control Panel`
  84. """
  85. hpl = webnotes.conn.sql("""select home_page from `tabDefault Home Page`
  86. where parent='Control Panel'
  87. and role in ('%s') order by idx asc limit 1""" % "', '".join(self.get_roles()))
  88. if hpl:
  89. return hpl[0][0]
  90. else:
  91. return webnotes.conn.get_value('Control Panel',None,'home_page') or 'Login Page'
  92. def get_defaults(self):
  93. """
  94. Get the user's default values based on user and role profile
  95. """
  96. roles = self.get_roles() + [self.name]
  97. res = webnotes.conn.sql('select defkey, defvalue from `tabDefaultValue` where parent in ("%s")' % '", "'.join(roles))
  98. self.defaults = {'owner': [self.name,]}
  99. for rec in res:
  100. if not self.defaults.has_key(rec[0]):
  101. self.defaults[rec[0]] = []
  102. self.defaults[rec[0]].append(rec[1] or '')
  103. return self.defaults
  104. def get_hide_tips(self):
  105. try:
  106. return webnotes.conn.sql("select hide_tips from tabProfile where name=%s", self.name)[0][0] or 0
  107. except:
  108. return 0
  109. # update recent documents
  110. def update_recent(self, dt, dn):
  111. """
  112. Update the user's `Recent` list with the given `dt` and `dn`
  113. """
  114. conn = webnotes.conn
  115. from webnotes.utils import cstr
  116. import json
  117. # get list of child tables, so we know what not to add in the recent list
  118. child_tables = [t[0] for t in conn.sql('select name from tabDocType where ifnull(istable,0) = 1')]
  119. if not (dt in ['Print Format', 'Start Page', 'Event', 'ToDo Item', 'Search Criteria']) \
  120. and not (dt in child_tables):
  121. r = webnotes.conn.sql("select recent_documents from tabProfile where name=%s", \
  122. self.name)[0][0] or ''
  123. if '~~~' in r:
  124. r = '[]'
  125. rdl = json.loads(r or '[]')
  126. new_rd = [dt, dn]
  127. # clear if exists
  128. for i in range(len(rdl)):
  129. rd = rdl[i]
  130. if rd==new_rd:
  131. del rdl[i]
  132. break
  133. if len(rdl) > 19:
  134. rdl = rdl[:19]
  135. rdl = [new_rd] + rdl
  136. self.recent = json.dumps(rdl)
  137. webnotes.conn.sql("update tabProfile set recent_documents=%s where name=%s", (self.recent, self.name))
  138. def load_profile(self):
  139. """
  140. Return a dictionary of user properites to be stored in the session
  141. """
  142. t = webnotes.conn.sql('select email, first_name, last_name, recent_documents from tabProfile where name = %s', self.name)[0]
  143. d = {}
  144. d['name'] = self.name
  145. d['email'] = t[0] or ''
  146. d['first_name'] = t[1] or ''
  147. d['last_name'] = t[2] or ''
  148. d['recent'] = t[3] or ''
  149. d['hide_tips'] = self.get_hide_tips()
  150. d['roles'] = self.get_roles()
  151. d['defaults'] = self.get_defaults()
  152. d['can_create'] = self.get_create_list()
  153. d['can_read'] = self.get_read_list()
  154. d['can_write'] = self.get_write_list()
  155. d['can_get_report'] = self.get_report_list()
  156. return d
  157. def load_from_session(self, d):
  158. """
  159. Setup the user profile from the dictionary saved in the session (generated by `load_profile`)
  160. """
  161. self.can_create = d['can_create']
  162. self.can_read = d['can_read']
  163. self.can_write = d['can_write']
  164. self.can_get_report = d['can_get_report']
  165. self.roles = d['roles']
  166. self.defaults = d['defaults']
  167. @webnotes.whitelist()
  168. def get_user_img():
  169. if not webnotes.form.getvalue('username'):
  170. webnotes.response['message'] = 'no_img_m'
  171. return
  172. f = webnotes.conn.sql("select file_list from tabProfile where name=%s", webnotes.form.getvalue('username',''))
  173. if f:
  174. if f[0][0]:
  175. lst = f[0][0].split('\n')
  176. webnotes.response['message'] = lst[0].split(',')[1]
  177. else:
  178. webnotes.response['message'] = 'no_img_m'
  179. else:
  180. webnotes.response['message'] = 'no_img_m'