You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

share.py 4.4 KiB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154
  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, notify=0):
  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. notify_assignment(user, doctype, name, description=None, notify=notify)
  35. return doc
  36. def remove(doctype, name, user, flags=None):
  37. share_name = frappe.db.get_value("DocShare", {"user": user, "share_name": name,
  38. "share_doctype": doctype})
  39. if share_name:
  40. frappe.delete_doc("DocShare", share_name, flags=flags)
  41. @frappe.whitelist()
  42. def set_permission(doctype, name, user, permission_to, value=1, everyone=0):
  43. """Set share permission."""
  44. check_share_permission(doctype, name)
  45. share_name = get_share_name(doctype, name, user, everyone)
  46. value = int(value)
  47. if not share_name:
  48. if value:
  49. share = add(doctype, name, user, everyone=everyone, **{permission_to: 1})
  50. else:
  51. # no share found, nothing to remove
  52. share = {}
  53. pass
  54. else:
  55. share = frappe.get_doc("DocShare", share_name)
  56. share.flags.ignore_permissions = True
  57. share.set(permission_to, value)
  58. if not value:
  59. # un-set higher-order permissions too
  60. if permission_to=="read":
  61. share.read = share.write = share.share = 0
  62. share.save()
  63. if not (share.read or share.write or share.share):
  64. share.delete()
  65. share = {}
  66. return share
  67. @frappe.whitelist()
  68. def get_users(doctype, name):
  69. """Get list of users with which this document is shared"""
  70. return frappe.db.sql("""select
  71. `name`, `user`, `read`, `write`, `share`, `everyone`
  72. from
  73. tabDocShare
  74. where
  75. share_doctype=%s and share_name=%s""",
  76. (doctype, name), as_dict=True)
  77. def get_shared(doctype, user=None, rights=None):
  78. """Get list of shared document names for given user and DocType.
  79. :param doctype: DocType of which shared names are queried.
  80. :param user: User for which shared names are queried.
  81. :param rights: List of rights for which the document is shared. List of `read`, `write`, `share`"""
  82. if not user:
  83. user = frappe.session.user
  84. if not rights:
  85. rights = ["read"]
  86. condition = " and ".join(["`{0}`=1".format(right) for right in rights])
  87. return frappe.db.sql_list("""select share_name from tabDocShare
  88. where (user=%s {everyone}) and share_doctype=%s and {condition}""".format(
  89. condition=condition, everyone="or everyone=1" if user!="Guest" else ""),
  90. (user, doctype))
  91. def get_shared_doctypes(user=None):
  92. """Return list of doctypes in which documents are shared for the given user."""
  93. if not user:
  94. user = frappe.session.user
  95. return frappe.db.sql_list("select distinct share_doctype from tabDocShare where (user=%s or everyone=1)", user)
  96. def get_share_name(doctype, name, user, everyone):
  97. if cint(everyone):
  98. share_name = frappe.db.get_value("DocShare", {"everyone": 1, "share_name": name,
  99. "share_doctype": doctype})
  100. else:
  101. share_name = frappe.db.get_value("DocShare", {"user": user, "share_name": name,
  102. "share_doctype": doctype})
  103. return share_name
  104. def check_share_permission(doctype, name):
  105. """Check if the user can share with other users"""
  106. if not frappe.has_permission(doctype, ptype="share", doc=name):
  107. frappe.throw(_("No permission to {0} {1} {2}".format("share", doctype, name)), frappe.PermissionError)
  108. def notify_assignment(shared_by, doc_type, doc_name, description=None, notify=0):
  109. if not (shared_by and doc_type and doc_name): return
  110. from frappe.utils import get_link_to_form
  111. document = get_link_to_form(doc_type, doc_name, label="%s: %s" % (doc_type, doc_name))
  112. arg = {
  113. 'contact': shared_by,
  114. 'txt': _("A new document {0} has been shared by with you {1}.").format(document,
  115. shared_by),
  116. 'notify': notify
  117. }
  118. from frappe.desk.page.chat import chat
  119. chat.post(**arg)