Each new doc inserts a version, this contains nothing but creator and
creation time.. which is already immutable information on the original
document.
This was added for cases like data import to track from where document
got created, ref: b7dfe7969d
Fix: only add a version on creation IF creation info is present on flags
200 lines
5.6 KiB
Python
200 lines
5.6 KiB
Python
# Copyright (c) 2015, Frappe Technologies Pvt. Ltd. and Contributors
|
|
# License: MIT. See LICENSE
|
|
import unittest
|
|
|
|
import frappe
|
|
from frappe.core.page.permission_manager.permission_manager import add, reset, update
|
|
from frappe.custom.doctype.property_setter.property_setter import make_property_setter
|
|
from frappe.desk.form.load import get_docinfo, getdoc, getdoctype
|
|
from frappe.utils.file_manager import save_file
|
|
|
|
test_dependencies = ["Blog Category", "Blogger"]
|
|
|
|
|
|
class TestFormLoad(unittest.TestCase):
|
|
def test_load(self):
|
|
getdoctype("DocType")
|
|
meta = list(filter(lambda d: d.name == "DocType", frappe.response.docs))[0]
|
|
self.assertEqual(meta.name, "DocType")
|
|
self.assertTrue(meta.get("__js"))
|
|
|
|
frappe.response.docs = []
|
|
getdoctype("Event")
|
|
meta = list(filter(lambda d: d.name == "Event", frappe.response.docs))[0]
|
|
self.assertTrue(meta.get("__calendar_js"))
|
|
|
|
def test_fieldlevel_permissions_in_load(self):
|
|
blog = frappe.get_doc(
|
|
{
|
|
"doctype": "Blog Post",
|
|
"blog_category": "-test-blog-category-1",
|
|
"blog_intro": "Test Blog Intro",
|
|
"blogger": "_Test Blogger 1",
|
|
"content": "Test Blog Content",
|
|
"title": "_Test Blog Post {}".format(frappe.utils.now()),
|
|
"published": 0,
|
|
}
|
|
)
|
|
|
|
blog.insert()
|
|
|
|
user = frappe.get_doc("User", "test@example.com")
|
|
|
|
user_roles = frappe.get_roles()
|
|
user.remove_roles(*user_roles)
|
|
user.add_roles("Blogger")
|
|
|
|
blog_post_property_setter = make_property_setter("Blog Post", "published", "permlevel", 1, "Int")
|
|
reset("Blog Post")
|
|
|
|
# test field level permission before role level permissions are defined
|
|
frappe.set_user(user.name)
|
|
blog_doc = get_blog(blog.name)
|
|
|
|
self.assertEqual(blog_doc.published, None)
|
|
|
|
# this will be ignored because user does not
|
|
# have write access on `published` field (or on permlevel 1 fields)
|
|
blog_doc.published = 1
|
|
blog_doc.save()
|
|
|
|
# since published field has higher permlevel
|
|
self.assertEqual(blog_doc.published, 0)
|
|
|
|
# test field level permission after role level permissions are defined
|
|
frappe.set_user("Administrator")
|
|
add("Blog Post", "Website Manager", 1)
|
|
update("Blog Post", "Website Manager", 1, "write", 1)
|
|
|
|
frappe.set_user(user.name)
|
|
blog_doc = get_blog(blog.name)
|
|
|
|
self.assertEqual(blog_doc.name, blog.name)
|
|
# since published field has higher permlevel
|
|
self.assertEqual(blog_doc.published, None)
|
|
|
|
# this will be ignored because user does not
|
|
# have write access on `published` field (or on permlevel 1 fields)
|
|
blog_doc.published = 1
|
|
blog_doc.save()
|
|
|
|
# since published field has higher permlevel
|
|
self.assertEqual(blog_doc.published, 0)
|
|
|
|
frappe.set_user("Administrator")
|
|
user.add_roles("Website Manager")
|
|
frappe.set_user(user.name)
|
|
|
|
doc = frappe.get_doc("Blog Post", blog.name)
|
|
doc.published = 1
|
|
doc.save()
|
|
|
|
blog_doc = get_blog(blog.name)
|
|
# now user should be allowed to read field with higher permlevel
|
|
# (after adding Website Manager role)
|
|
self.assertEqual(blog_doc.published, 1)
|
|
|
|
frappe.set_user("Administrator")
|
|
|
|
# reset user roles
|
|
user.remove_roles("Blogger", "Website Manager")
|
|
user.add_roles(*user_roles)
|
|
|
|
blog_doc.delete()
|
|
frappe.delete_doc(blog_post_property_setter.doctype, blog_post_property_setter.name)
|
|
|
|
def test_fieldlevel_permissions_in_load_for_child_table(self):
|
|
contact = frappe.new_doc("Contact")
|
|
contact.first_name = "_Test Contact 1"
|
|
contact.append("phone_nos", {"phone": "123456"})
|
|
contact.insert()
|
|
|
|
user = frappe.get_doc("User", "test@example.com")
|
|
|
|
user_roles = frappe.get_roles()
|
|
user.remove_roles(*user_roles)
|
|
user.add_roles("Accounts User")
|
|
|
|
make_property_setter("Contact Phone", "phone", "permlevel", 1, "Int")
|
|
reset("Contact Phone")
|
|
add("Contact", "Sales User", 1)
|
|
update("Contact", "Sales User", 1, "write", 1)
|
|
|
|
frappe.set_user(user.name)
|
|
|
|
contact = frappe.get_doc("Contact", "_Test Contact 1")
|
|
|
|
contact.phone_nos[0].phone = "654321"
|
|
contact.save()
|
|
|
|
self.assertEqual(contact.phone_nos[0].phone, "123456")
|
|
|
|
frappe.set_user("Administrator")
|
|
user.add_roles("Sales User")
|
|
frappe.set_user(user.name)
|
|
|
|
contact.phone_nos[0].phone = "654321"
|
|
contact.save()
|
|
|
|
contact = frappe.get_doc("Contact", "_Test Contact 1")
|
|
self.assertEqual(contact.phone_nos[0].phone, "654321")
|
|
|
|
frappe.set_user("Administrator")
|
|
|
|
# reset user roles
|
|
user.remove_roles("Accounts User", "Sales User")
|
|
user.add_roles(*user_roles)
|
|
|
|
contact.delete()
|
|
|
|
def test_get_doc_info(self):
|
|
note = frappe.new_doc("Note")
|
|
note.content = "some content"
|
|
note.title = frappe.generate_hash(length=20)
|
|
note.insert()
|
|
|
|
note.content = "new content"
|
|
# trigger a version
|
|
note.save(ignore_version=False)
|
|
|
|
note.add_comment(text="test")
|
|
|
|
note.add_tag("test_tag")
|
|
note.add_tag("more_tag")
|
|
|
|
# empty attachment
|
|
save_file("test_file", b"", note.doctype, note.name, decode=True)
|
|
|
|
frappe.get_doc(
|
|
{
|
|
"doctype": "Communication",
|
|
"communication_type": "Communication",
|
|
"content": "test email",
|
|
"reference_doctype": note.doctype,
|
|
"reference_name": note.name,
|
|
}
|
|
).insert()
|
|
|
|
get_docinfo(note)
|
|
docinfo = frappe.response["docinfo"]
|
|
|
|
self.assertEqual(len(docinfo.comments), 1)
|
|
self.assertIn("test", docinfo.comments[0].content)
|
|
|
|
self.assertGreaterEqual(len(docinfo.versions), 1)
|
|
|
|
self.assertEqual(set(docinfo.tags.split(",")), {"more_tag", "test_tag"})
|
|
|
|
self.assertEqual(len(docinfo.attachments), 1)
|
|
self.assertIn("test_file", docinfo.attachments[0].file_name)
|
|
|
|
self.assertEqual(len(docinfo.communications), 1)
|
|
self.assertIn("email", docinfo.communications[0].content)
|
|
note.delete()
|
|
|
|
|
|
def get_blog(blog_name):
|
|
frappe.response.docs = []
|
|
getdoc("Blog Post", blog_name)
|
|
doc = frappe.response.docs[0]
|
|
return doc
|