From b3066f3702c182ea008666696414725bb35d46b0 Mon Sep 17 00:00:00 2001 From: Rucha Mahabal Date: Sun, 4 Apr 2021 17:07:52 +0530 Subject: [PATCH] test: docshare with submit permission --- .../doctype/auto_repeat/test_auto_repeat.py | 8 +++---- frappe/core/doctype/docshare/docshare.py | 8 ++++++- frappe/core/doctype/docshare/test_docshare.py | 22 +++++++++++++++++++ 3 files changed, 33 insertions(+), 5 deletions(-) diff --git a/frappe/automation/doctype/auto_repeat/test_auto_repeat.py b/frappe/automation/doctype/auto_repeat/test_auto_repeat.py index 0d6229cd9e..f41f31f3bb 100644 --- a/frappe/automation/doctype/auto_repeat/test_auto_repeat.py +++ b/frappe/automation/doctype/auto_repeat/test_auto_repeat.py @@ -196,7 +196,7 @@ def make_auto_repeat(**args): return doc -def create_submittable_doctype(doctype): +def create_submittable_doctype(doctype, submit_perms=1): if frappe.db.exists('DocType', doctype): return else: @@ -217,9 +217,9 @@ def create_submittable_doctype(doctype): 'write': 1, 'create': 1, 'delete': 1, - 'submit': 1, - 'cancel': 1, - 'amend': 1 + 'submit': submit_perms, + 'cancel': submit_perms, + 'amend': submit_perms }] }).insert() diff --git a/frappe/core/doctype/docshare/docshare.py b/frappe/core/doctype/docshare/docshare.py index 3111c0d87c..44719a7561 100644 --- a/frappe/core/doctype/docshare/docshare.py +++ b/frappe/core/doctype/docshare/docshare.py @@ -5,7 +5,7 @@ from __future__ import unicode_literals import frappe from frappe.model.document import Document from frappe import _ -from frappe.utils import get_fullname +from frappe.utils import get_fullname, cint exclude_from_linked_with = True @@ -15,6 +15,7 @@ class DocShare(Document): def validate(self): self.validate_user() self.check_share_permission() + self.check_is_submittable() self.cascade_permissions_downwards() self.get_doc().run_method("validate_share", self) @@ -41,6 +42,11 @@ class DocShare(Document): frappe.throw(_('You need to have "Share" permission'), frappe.PermissionError) + def check_is_submittable(self): + if self.submit and not cint(frappe.db.get_value("DocType", self.share_doctype, "is_submittable")): + frappe.throw(_("Cannot share {0} with submit permission as the doctype {1} is not submittable").format( + frappe.bold(self.share_name), frppe.bold(self.share_doctype))) + def after_insert(self): doc = self.get_doc() owner = get_fullname(self.owner) diff --git a/frappe/core/doctype/docshare/test_docshare.py b/frappe/core/doctype/docshare/test_docshare.py index 697930d6b5..d4ef1f92f8 100644 --- a/frappe/core/doctype/docshare/test_docshare.py +++ b/frappe/core/doctype/docshare/test_docshare.py @@ -5,6 +5,7 @@ from __future__ import unicode_literals import frappe import frappe.share import unittest +from frappe.automation.doctype.auto_repeat.test_auto_repeat import create_submittable_doctype class TestDocShare(unittest.TestCase): def setUp(self): @@ -91,3 +92,24 @@ class TestDocShare(unittest.TestCase): self.assertTrue(self.event.name not in frappe.share.get_shared("Event", self.user)) self.assertTrue(self.event.name not in frappe.share.get_shared("Event", "test1@example.com")) self.assertTrue(self.event.name not in frappe.share.get_shared("Event", "Guest")) + + def test_share_with_submit_perm(self): + doctype = "Test DocShare with Submit" + create_submittable_doctype(doctype, submit_perms=0) + + submittable_doc = frappe.get_doc(dict(doctype=doctype, test="test docshare with submit")).insert() + + frappe.set_user(self.user) + self.assertFalse(frappe.has_permission(doctype, "submit", user=self.user)) + + frappe.set_user("Administrator") + frappe.share.add(doctype, submittable_doc.name, self.user, submit=1) + + frappe.set_user(self.user) + self.assertTrue(frappe.has_permission(doctype, "submit", doc=submittable_doc.name, user=self.user)) + + # test cascade + self.assertTrue(frappe.has_permission(doctype, "read", doc=submittable_doc.name, user=self.user)) + self.assertTrue(frappe.has_permission(doctype, "write", doc=submittable_doc.name, user=self.user)) + + frappe.share.remove(doctype, submittable_doc.name, self.user) \ No newline at end of file