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.
 
 
 
 
 
 

262 wiersze
7.9 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. try:
  86. hpl = webnotes.conn.sql("select role, home_page from `tabDefault Home Page` where parent='Control Panel' order by idx asc")
  87. for h in hpl:
  88. if h[0] in self.get_roles():
  89. return h[1]
  90. except:
  91. pass
  92. return webnotes.conn.get_value('Control Panel',None,'home_page') or 'Login Page'
  93. def get_defaults(self):
  94. """
  95. Get the user's default values based on user and role profile
  96. """
  97. roles = self.get_roles() + [self.name]
  98. res = webnotes.conn.sql('select defkey, defvalue from `tabDefaultValue` where parent in ("%s")' % '", "'.join(roles))
  99. self.defaults = {'owner': [self.name,]}
  100. for rec in res:
  101. if not self.defaults.has_key(rec[0]):
  102. self.defaults[rec[0]] = []
  103. self.defaults[rec[0]].append(rec[1] or '')
  104. return self.defaults
  105. def get_hide_tips(self):
  106. try:
  107. return webnotes.conn.sql("select hide_tips from tabProfile where name=%s", self.name)[0][0] or 0
  108. except:
  109. return 0
  110. def get_random_password(self):
  111. """
  112. Generate a random password
  113. """
  114. import string
  115. from random import choice
  116. size = 9
  117. pwd = ''.join([choice(string.letters + string.digits) for i in range(size)])
  118. return pwd
  119. def reset_password(self):
  120. """
  121. Reset the user's password and send an email
  122. """
  123. pwd = self.get_random_password()
  124. # get profile
  125. profile = webnotes.conn.sql("SELECT name, email, first_name, last_name FROM tabProfile WHERE name=%s OR email=%s",(self.name, self.name))
  126. profile_cols = [desc[0] for desc in webnotes.conn.sql("DESCRIBE tabProfile")]
  127. if not profile:
  128. raise Exception, "Profile %s not found" % self.name
  129. elif 'registered' in profile_cols:
  130. if not webnotes.conn.sql("SELECT registered FROM tabProfile WHERE name=%s", self.name)[0][0]:
  131. # if an unregistered user tries to reset password
  132. raise Exception, "You cannot reset your password as you have not completed registration. You need to complete registration using the link provided in the email."
  133. # update tab Profile
  134. webnotes.conn.sql("UPDATE tabProfile SET password=password(%s) WHERE name=%s", (pwd, profile[0][0]))
  135. self.send_email("Password Reset", "<p>Dear %s%s,</p><p>your password has been changed to %s</p><p>[Automatically Generated]</p>" % (profile[0][2], (profile[0][3] and (' ' + profile[0][3]) or ''), pwd), profile[0][1])
  136. def send_email(self, subj, mess, email):
  137. import webnotes.utils.email_lib
  138. webnotes.utils.email_lib.sendmail(email, msg=mess, subject=subj)
  139. # update recent documents
  140. def update_recent(self, dt, dn):
  141. """
  142. Update the user's `Recent` list with the given `dt` and `dn`
  143. """
  144. conn = webnotes.conn
  145. from webnotes.utils import cstr
  146. import json
  147. # get list of child tables, so we know what not to add in the recent list
  148. child_tables = [t[0] for t in conn.sql('select name from tabDocType where istable = 1')]
  149. if not (dt in ['Print Format', 'Start Page', 'Event', 'ToDo Item', 'Search Criteria']) and not webnotes.is_testing and not (dt in child_tables):
  150. r = webnotes.conn.sql("select recent_documents from tabProfile where name=%s", self.name)[0][0] or ''
  151. # clear old style (to be removed)
  152. if '~~' in r: r = ''
  153. rdl = json.loads(r or '[]')
  154. new_rd = [dt, dn]
  155. # clear if exists
  156. for i in range(len(rdl)):
  157. rd = rdl[i]
  158. if rd==new_rd:
  159. del rdl[i]
  160. break
  161. rdl.append(new_rd)
  162. if len(rdl) > 20:
  163. rdl = rdl[:20]
  164. self.recent = json.dumps(rdl)
  165. webnotes.conn.sql("update tabProfile set recent_documents=%s where name=%s", (self.recent, self.name))
  166. def load_profile(self):
  167. """
  168. Return a dictionary of user properites to be stored in the session
  169. """
  170. t = webnotes.conn.sql('select email, first_name, last_name, recent_documents from tabProfile where name = %s', self.name)[0]
  171. d = {}
  172. d['name'] = self.name
  173. d['email'] = t[0] or ''
  174. d['first_name'] = t[1] or ''
  175. d['last_name'] = t[2] or ''
  176. d['recent'] = t[3] or ''
  177. d['hide_tips'] = self.get_hide_tips()
  178. d['roles'] = self.get_roles()
  179. d['defaults'] = self.get_defaults()
  180. d['can_create'] = self.get_create_list()
  181. d['can_read'] = self.get_read_list()
  182. d['can_write'] = self.get_write_list()
  183. d['can_get_report'] = self.get_report_list()
  184. return d
  185. def load_from_session(self, d):
  186. """
  187. Setup the user profile from the dictionary saved in the session (generated by `load_profile`)
  188. """
  189. self.can_create = d['can_create']
  190. self.can_read = d['can_read']
  191. self.can_write = d['can_write']
  192. self.can_get_report = d['can_get_report']
  193. self.roles = d['roles']
  194. self.defaults = d['defaults']
  195. def get_user_img():
  196. if not webnotes.form.getvalue('username'):
  197. webnotes.response['message'] = 'no_img_m'
  198. return
  199. f = webnotes.conn.sql("select file_list from tabProfile where name=%s", webnotes.form.getvalue('username',''))
  200. if f:
  201. if f[0][0]:
  202. lst = f[0][0].split('\n')
  203. webnotes.response['message'] = lst[0].split(',')[1]
  204. else:
  205. webnotes.response['message'] = 'no_img_m'
  206. else:
  207. webnotes.response['message'] = 'no_img_m'