Ви не можете вибрати більше 25 тем Теми мають розпочинатися з літери або цифри, можуть містити дефіси (-) і не повинні перевищувати 35 символів.

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