@@ -196,7 +196,7 @@ def make_auto_repeat(**args): | |||||
return doc | return doc | ||||
def create_submittable_doctype(doctype): | |||||
def create_submittable_doctype(doctype, submit_perms=1): | |||||
if frappe.db.exists('DocType', doctype): | if frappe.db.exists('DocType', doctype): | ||||
return | return | ||||
else: | else: | ||||
@@ -217,9 +217,9 @@ def create_submittable_doctype(doctype): | |||||
'write': 1, | 'write': 1, | ||||
'create': 1, | 'create': 1, | ||||
'delete': 1, | 'delete': 1, | ||||
'submit': 1, | |||||
'cancel': 1, | |||||
'amend': 1 | |||||
'submit': submit_perms, | |||||
'cancel': submit_perms, | |||||
'amend': submit_perms | |||||
}] | }] | ||||
}).insert() | }).insert() | ||||
@@ -5,7 +5,7 @@ from __future__ import unicode_literals | |||||
import frappe | import frappe | ||||
from frappe.model.document import Document | from frappe.model.document import Document | ||||
from frappe import _ | from frappe import _ | ||||
from frappe.utils import get_fullname | |||||
from frappe.utils import get_fullname, cint | |||||
exclude_from_linked_with = True | exclude_from_linked_with = True | ||||
@@ -15,6 +15,7 @@ class DocShare(Document): | |||||
def validate(self): | def validate(self): | ||||
self.validate_user() | self.validate_user() | ||||
self.check_share_permission() | self.check_share_permission() | ||||
self.check_is_submittable() | |||||
self.cascade_permissions_downwards() | self.cascade_permissions_downwards() | ||||
self.get_doc().run_method("validate_share", self) | 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) | 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): | def after_insert(self): | ||||
doc = self.get_doc() | doc = self.get_doc() | ||||
owner = get_fullname(self.owner) | owner = get_fullname(self.owner) | ||||
@@ -5,6 +5,7 @@ from __future__ import unicode_literals | |||||
import frappe | import frappe | ||||
import frappe.share | import frappe.share | ||||
import unittest | import unittest | ||||
from frappe.automation.doctype.auto_repeat.test_auto_repeat import create_submittable_doctype | |||||
class TestDocShare(unittest.TestCase): | class TestDocShare(unittest.TestCase): | ||||
def setUp(self): | 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", 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", "test1@example.com")) | ||||
self.assertTrue(self.event.name not in frappe.share.get_shared("Event", "Guest")) | 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) |