diff --git a/frappe/client.py b/frappe/client.py index 29127424cc..0bebd93092 100644 --- a/frappe/client.py +++ b/frappe/client.py @@ -406,7 +406,9 @@ def validate_link(doctype: str, docname: str, fields=None): frappe.throw(_("Document Name must be a string")) if doctype != "DocType": - parent_doctype = frappe.db.get_value(doctype, docname, "parenttype") # needed for links to child rows + parent_doctype = None + if frappe.get_meta(doctype).istable: # needed for links to child rows + parent_doctype = frappe.db.get_value(doctype, docname, "parenttype") if not ( frappe.has_permission(doctype, "select", parent_doctype=parent_doctype) or frappe.has_permission(doctype, "read", parent_doctype=parent_doctype) diff --git a/frappe/tests/test_client.py b/frappe/tests/test_client.py index 588b9fa628..908c16e4b1 100644 --- a/frappe/tests/test_client.py +++ b/frappe/tests/test_client.py @@ -155,6 +155,25 @@ class TestClient(IntegrationTestCase): self.assertEqual(get("ToDo", filters={}), get("ToDo", filters="{}")) todo.delete() + def test_client_validatate_link(self): + from frappe.client import validate_link + + # Basic test + self.assertTrue(validate_link("User", "Guest")) + + # fixes capitalization + if frappe.db.db_type == "mariadb": + self.assertEqual(validate_link("User", "GueSt"), {"name": "Guest"}) + + # Fetch + self.assertEqual(validate_link("User", "Guest", fields=["enabled"]), {"name": "Guest", "enabled": 1}) + + # Permissions + with self.set_user("Guest"), self.assertRaises(frappe.PermissionError): + self.assertEqual( + validate_link("User", "Guest", fields=["enabled"]), {"name": "Guest", "enabled": 1} + ) + def test_client_insert(self): from frappe.client import insert