Вы не можете выбрать более 25 тем Темы должны начинаться с буквы или цифры, могут содержать дефисы(-) и должны содержать не более 35 символов.
 
 
 
 
 
 

137 строки
3.8 KiB

  1. # Copyright (c) 2015, Frappe Technologies Pvt. Ltd. and Contributors
  2. # MIT License. See license.txt
  3. from __future__ import unicode_literals
  4. import frappe
  5. from frappe import _
  6. from frappe.utils import cint
  7. @frappe.whitelist()
  8. def add(doctype, name, user=None, read=1, write=0, share=0, everyone=0, flags=None):
  9. """Share the given document with a user."""
  10. if not user:
  11. user = frappe.session.user
  12. if not (flags or {}).get("ignore_share_permission"):
  13. check_share_permission(doctype, name)
  14. share_name = get_share_name(doctype, name, user, everyone)
  15. if share_name:
  16. doc = frappe.get_doc("DocShare", share_name)
  17. else:
  18. doc = frappe.new_doc("DocShare")
  19. doc.update({
  20. "user": user,
  21. "share_doctype": doctype,
  22. "share_name": name,
  23. "everyone": cint(everyone)
  24. })
  25. if flags:
  26. doc.flags.update(flags)
  27. doc.update({
  28. # always add read, since you are adding!
  29. "read": 1,
  30. "write": cint(write),
  31. "share": cint(share)
  32. })
  33. doc.save(ignore_permissions=True)
  34. return doc
  35. def remove(doctype, name, user, flags=None):
  36. share_name = frappe.db.get_value("DocShare", {"user": user, "share_name": name,
  37. "share_doctype": doctype})
  38. if share_name:
  39. frappe.delete_doc("DocShare", share_name, flags=flags)
  40. @frappe.whitelist()
  41. def set_permission(doctype, name, user, permission_to, value=1, everyone=0):
  42. """Set share permission."""
  43. check_share_permission(doctype, name)
  44. share_name = get_share_name(doctype, name, user, everyone)
  45. value = int(value)
  46. if not share_name:
  47. if value:
  48. share = add(doctype, name, user, everyone=everyone, **{permission_to: 1})
  49. else:
  50. # no share found, nothing to remove
  51. share = {}
  52. pass
  53. else:
  54. share = frappe.get_doc("DocShare", share_name)
  55. share.flags.ignore_permissions = True
  56. share.set(permission_to, value)
  57. if not value:
  58. # un-set higher-order permissions too
  59. if permission_to=="read":
  60. share.read = share.write = share.share = 0
  61. share.save()
  62. if not (share.read or share.write or share.share):
  63. share.delete()
  64. share = {}
  65. return share
  66. @frappe.whitelist()
  67. def get_users(doctype, name):
  68. """Get list of users with which this document is shared"""
  69. return frappe.db.sql("""select
  70. `name`, `user`, `read`, `write`, `share`, `everyone`
  71. from
  72. tabDocShare
  73. where
  74. share_doctype=%s and share_name=%s""",
  75. (doctype, name), as_dict=True)
  76. def get_shared(doctype, user=None, rights=None):
  77. """Get list of shared document names for given user and DocType.
  78. :param doctype: DocType of which shared names are queried.
  79. :param user: User for which shared names are queried.
  80. :param rights: List of rights for which the document is shared. List of `read`, `write`, `share`"""
  81. if not user:
  82. user = frappe.session.user
  83. if not rights:
  84. rights = ["read"]
  85. condition = " and ".join(["`{0}`=1".format(right) for right in rights])
  86. return frappe.db.sql_list("""select share_name from tabDocShare
  87. where (user=%s {everyone}) and share_doctype=%s and {condition}""".format(
  88. condition=condition, everyone="or everyone=1" if user!="Guest" else ""),
  89. (user, doctype))
  90. def get_shared_doctypes(user=None):
  91. """Return list of doctypes in which documents are shared for the given user."""
  92. if not user:
  93. user = frappe.session.user
  94. return frappe.db.sql_list("select distinct share_doctype from tabDocShare where (user=%s or everyone=1)", user)
  95. def get_share_name(doctype, name, user, everyone):
  96. if cint(everyone):
  97. share_name = frappe.db.get_value("DocShare", {"everyone": 1, "share_name": name,
  98. "share_doctype": doctype})
  99. else:
  100. share_name = frappe.db.get_value("DocShare", {"user": user, "share_name": name,
  101. "share_doctype": doctype})
  102. return share_name
  103. def check_share_permission(doctype, name):
  104. """Check if the user can share with other users"""
  105. if not frappe.has_permission(doctype, ptype="share", doc=name):
  106. frappe.throw(_("No permission to {0} {1} {2}".format("share", doctype, name)), frappe.PermissionError)