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

137 рядки
3.9 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. elif permission_to=="write":
  62. share.write = share.share = 0
  63. share.save()
  64. if not (share.read or share.write or share.share):
  65. share.delete()
  66. share = {}
  67. return share
  68. @frappe.whitelist()
  69. def get_users(doctype, name, fields="*"):
  70. """Get list of users with which this document is shared"""
  71. if isinstance(fields, (tuple, list)):
  72. fields = "`{0}`".format("`, `".join(fields))
  73. return frappe.db.sql("select {0} from tabDocShare where share_doctype=%s and share_name=%s".format(fields),
  74. (doctype, name), as_dict=True)
  75. def get_shared(doctype, user=None, rights=None):
  76. """Get list of shared document names for given user and DocType.
  77. :param doctype: DocType of which shared names are queried.
  78. :param user: User for which shared names are queried.
  79. :param rights: List of rights for which the document is shared. List of `read`, `write`, `share`"""
  80. if not user:
  81. user = frappe.session.user
  82. if not rights:
  83. rights = ["read"]
  84. condition = " and ".join(["`{0}`=1".format(right) for right in rights])
  85. return frappe.db.sql_list("""select share_name from tabDocShare
  86. where (user=%s {everyone}) and share_doctype=%s and {condition}""".format(
  87. condition=condition, everyone="or everyone=1" if user!="Guest" else ""),
  88. (user, doctype))
  89. def get_shared_doctypes(user=None):
  90. """Return list of doctypes in which documents are shared for the given user."""
  91. if not user:
  92. user = frappe.session.user
  93. return frappe.db.sql_list("select distinct share_doctype from tabDocShare where (user=%s or everyone=1)", user)
  94. def get_share_name(doctype, name, user, everyone):
  95. if cint(everyone):
  96. share_name = frappe.db.get_value("DocShare", {"everyone": 1, "share_name": name,
  97. "share_doctype": doctype})
  98. else:
  99. share_name = frappe.db.get_value("DocShare", {"user": user, "share_name": name,
  100. "share_doctype": doctype})
  101. return share_name
  102. def check_share_permission(doctype, name):
  103. """Check if the user can share with other users"""
  104. if not frappe.has_permission(doctype, ptype="share", doc=name):
  105. frappe.throw(_("No permission to {0} {1} {2}".format("share", doctype, name)), frappe.PermissionError)