diff --git a/frappe/core/doctype/docshare/docshare.json b/frappe/core/doctype/docshare/docshare.json index a4efb6bd4d..ca10b05dac 100644 --- a/frappe/core/doctype/docshare/docshare.json +++ b/frappe/core/doctype/docshare/docshare.json @@ -1,293 +1,110 @@ { - "allow_copy": 0, + "actions": [], "allow_import": 1, - "allow_rename": 0, "autoname": "hash", - "beta": 0, "creation": "2015-02-04 04:33:36.330477", - "custom": 0, "description": "Internal record of document shares", - "docstatus": 0, "doctype": "DocType", "document_type": "System", - "editable_grid": 0, + "engine": "InnoDB", + "field_order": [ + "user", + "share_doctype", + "share_name", + "read", + "write", + "share", + "submit", + "everyone", + "notify_by_email" + ], "fields": [ { - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, "fieldname": "user", "fieldtype": "Link", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, "in_list_view": 1, - "in_standard_filter": 0, "label": "User", - "length": 0, - "no_copy": 0, "options": "User", - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 1, - "set_only_once": 0, - "unique": 0 + "search_index": 1 }, { - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, "fieldname": "share_doctype", "fieldtype": "Link", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, "in_list_view": 1, - "in_standard_filter": 0, "label": "Document Type", - "length": 0, - "no_copy": 0, "options": "DocType", - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, "reqd": 1, - "search_index": 1, - "set_only_once": 0, - "unique": 0 + "search_index": 1 }, { - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, "fieldname": "share_name", "fieldtype": "Dynamic Link", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, "in_list_view": 1, - "in_standard_filter": 0, "label": "Document Name", - "length": 0, - "no_copy": 0, "options": "share_doctype", - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, "reqd": 1, - "search_index": 1, - "set_only_once": 0, - "unique": 0 + "search_index": 1 }, { - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, "default": "0", "fieldname": "read", "fieldtype": "Check", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Read", - "length": 0, - "no_copy": 0, - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "unique": 0 + "label": "Read" }, { - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, "default": "0", "fieldname": "write", "fieldtype": "Check", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Write", - "length": 0, - "no_copy": 0, - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "unique": 0 + "label": "Write" }, { - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, "default": "0", "fieldname": "share", "fieldtype": "Check", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Share", - "length": 0, - "no_copy": 0, - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "unique": 0 + "label": "Share" }, { - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, + "default": "0", "fieldname": "everyone", "fieldtype": "Check", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Everyone", - "length": 0, - "no_copy": 0, - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "unique": 0 + "label": "Everyone" }, { - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, "default": "1", "fieldname": "notify_by_email", "fieldtype": "Check", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_list_view": 0, - "in_standard_filter": 0, "label": "Notify by email", - "length": 0, - "no_copy": 0, - "permlevel": 0, - "precision": "", - "print_hide": 1, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "unique": 0 + "print_hide": 1 + }, + { + "default": "0", + "fieldname": "submit", + "fieldtype": "Check", + "label": "Submit" } ], - "has_web_view": 0, - "hide_heading": 0, - "hide_toolbar": 0, - "idx": 0, - "image_view": 0, "in_create": 1, - "is_submittable": 0, - "issingle": 0, - "istable": 0, - "max_attachments": 0, - "modified": "2017-09-15 15:58:34.126438", + "links": [], + "modified": "2021-04-04 11:38:50.813312", "modified_by": "Administrator", "module": "Core", "name": "DocShare", - "name_case": "", "owner": "Administrator", "permissions": [ { - "amend": 0, - "apply_user_permissions": 0, - "cancel": 0, "create": 1, "delete": 1, - "email": 0, "export": 1, - "if_owner": 0, "import": 1, - "permlevel": 0, - "print": 0, "read": 1, "report": 1, "role": "System Manager", - "set_user_permissions": 0, "share": 1, - "submit": 0, "write": 1 } ], - "quick_entry": 0, "read_only": 1, - "read_only_onload": 0, - "show_name_in_global_search": 0, "sort_field": "modified", "sort_order": "DESC", - "track_changes": 1, - "track_seen": 0 -} + "track_changes": 1 +} \ No newline at end of file diff --git a/frappe/core/doctype/docshare/docshare.py b/frappe/core/doctype/docshare/docshare.py index 28304fb636..3111c0d87c 100644 --- a/frappe/core/doctype/docshare/docshare.py +++ b/frappe/core/doctype/docshare/docshare.py @@ -19,8 +19,10 @@ class DocShare(Document): self.get_doc().run_method("validate_share", self) def cascade_permissions_downwards(self): - if self.share or self.write: + if self.share or self.write or self.submit: self.read = 1 + if self.submit: + self.write = 1 def get_doc(self): if not getattr(self, "_doc", None): diff --git a/frappe/permissions.py b/frappe/permissions.py index e597402c38..97f9d19c89 100644 --- a/frappe/permissions.py +++ b/frappe/permissions.py @@ -78,14 +78,14 @@ def has_permission(doctype, ptype="read", doc=None, verbose=False, user=None, ra push_perm_check_log(_('User {0} does not have doctype access via role permission for document {1}').format(frappe.bold(user), frappe.bold(doctype))) def false_if_not_shared(): - if ptype in ("read", "write", "share", "email", "print"): + if ptype in ("read", "write", "share", "submit", "email", "print"): shared = frappe.share.get_shared(doctype, user, ["read" if ptype in ("email", "print") else ptype]) if doc: doc_name = get_doc_name(doc) if doc_name in shared: - if ptype in ("read", "write", "share") or meta.permissions[0].get(ptype): + if ptype in ("read", "write", "share", "submit") or meta.permissions[0].get(ptype): return True elif shared: diff --git a/frappe/public/js/frappe/form/sidebar/share.js b/frappe/public/js/frappe/form/sidebar/share.js index 2a3b652372..c3995ea65e 100644 --- a/frappe/public/js/frappe/form/sidebar/share.js +++ b/frappe/public/js/frappe/form/sidebar/share.js @@ -123,6 +123,7 @@ frappe.ui.form.Share = Class.extend({ user: user, read: $(d.body).find(".add-share-read").prop("checked") ? 1 : 0, write: $(d.body).find(".add-share-write").prop("checked") ? 1 : 0, + submit: $(d.body).find(".add-share-submit").prop("checked") ? 1 : 0, share: $(d.body).find(".add-share-share").prop("checked") ? 1 : 0, notify: 1, }, diff --git a/frappe/public/js/frappe/form/templates/set_sharing.html b/frappe/public/js/frappe/form/templates/set_sharing.html index 04b7946e76..5b748f5f3c 100644 --- a/frappe/public/js/frappe/form/templates/set_sharing.html +++ b/frappe/public/js/frappe/form/templates/set_sharing.html @@ -1,13 +1,14 @@
-
{%= __("User") %}
+
{%= __("User") %}
{%= __("Can Read") %}
{%= __("Can Write") %}
+
{%= __("Can Submit") %}
{%= __("Can Share") %}
- +
+
+
@@ -23,11 +29,13 @@ var s = shared[i]; %} {% if(s && !s.everyone) { %}
-
{%= s.user %}
+
{%= s.user %}
+
@@ -38,22 +46,26 @@
-
{%= __("Share this document with") %}
+
{%= __("Share this document with") %}
{%= __("Can Read") %}
{%= __("Can Write") %}
+
{%= __("Can Submit") %}
{%= __("Can Share") %}
-
+
+
+
- +
{% endif %}
\ No newline at end of file diff --git a/frappe/public/js/frappe/model/perm.js b/frappe/public/js/frappe/model/perm.js index 2a1f52fbfb..ed2ec8a783 100644 --- a/frappe/public/js/frappe/model/perm.js +++ b/frappe/public/js/frappe/model/perm.js @@ -85,6 +85,7 @@ $.extend(frappe.perm, { if (s.user === user) { perm[0]["read"] = perm[0]["read"] || s.read; perm[0]["write"] = perm[0]["write"] || s.write; + perm[0]["submit"] = perm[0]["submit"] || s.submit; perm[0]["share"] = perm[0]["share"] || s.share; if (s.read) { diff --git a/frappe/share.py b/frappe/share.py index 83c3529db7..63c6ce2f35 100644 --- a/frappe/share.py +++ b/frappe/share.py @@ -10,7 +10,7 @@ from frappe.desk.doctype.notification_log.notification_log import enqueue_create from frappe.utils import cint @frappe.whitelist() -def add(doctype, name, user=None, read=1, write=0, share=0, everyone=0, flags=None, notify=0): +def add(doctype, name, user=None, read=1, write=0, submit=0, share=0, everyone=0, flags=None, notify=0): """Share the given document with a user.""" if not user: user = frappe.session.user @@ -38,6 +38,7 @@ def add(doctype, name, user=None, read=1, write=0, share=0, everyone=0, flags=No # always add read, since you are adding! "read": 1, "write": cint(write), + "submit": cint(submit), "share": cint(share) }) @@ -78,11 +79,11 @@ def set_permission(doctype, name, user, permission_to, value=1, everyone=0): if not value: # un-set higher-order permissions too if permission_to=="read": - share.read = share.write = share.share = 0 + share.read = share.write = share.submit = share.share = 0 share.save() - if not (share.read or share.write or share.share): + if not (share.read or share.write or share.submit or share.share): share.delete() share = {} @@ -92,7 +93,7 @@ def set_permission(doctype, name, user, permission_to, value=1, everyone=0): def get_users(doctype, name): """Get list of users with which this document is shared""" return frappe.db.get_all("DocShare", - fields=["`name`", "`user`", "`read`", "`write`", "`share`", "everyone", "owner", "creation"], + fields=["`name`", "`user`", "`read`", "`write`", "`submit`", "`share`", "everyone", "owner", "creation"], filters=dict( share_doctype=doctype, share_name=name