diff --git a/frappe/model/delete_doc.py b/frappe/model/delete_doc.py index e64c50af91..3d83af16b7 100644 --- a/frappe/model/delete_doc.py +++ b/frappe/model/delete_doc.py @@ -338,7 +338,7 @@ def check_if_doc_is_dynamically_linked(doc, method="Delete"): df["table"] = ", `parent`, `parenttype`, `idx`" if meta.istable else "" for refdoc in frappe.db.sql( """select `name`, `docstatus` {table} from `tab{parent}` where - {options}=%s and {fieldname}=%s""".format(**df), + `{options}`=%s and `{fieldname}`=%s""".format(**df), (doc.doctype, doc.name), as_dict=True, ): diff --git a/frappe/model/document.py b/frappe/model/document.py index 3a1b375ce6..c0a6047f98 100644 --- a/frappe/model/document.py +++ b/frappe/model/document.py @@ -202,9 +202,11 @@ class Document(BaseDocument): if hasattr(self, "__setup__"): self.__setup__() + return self + def reload(self): """Reload document from database""" - self.load_from_db() + return self.load_from_db() def get_latest(self): if not getattr(self, "_doc_before_save", None): diff --git a/frappe/model/dynamic_links.py b/frappe/model/dynamic_links.py index e4b86ac145..ccd6baacc3 100644 --- a/frappe/model/dynamic_links.py +++ b/frappe/model/dynamic_links.py @@ -43,7 +43,7 @@ def get_dynamic_link_map(for_delete=False): else: try: links = frappe.db.sql_list( - """select distinct {options} from `tab{parent}`""".format(**df) + """select distinct `{options}` from `tab{parent}`""".format(**df) ) for doctype in links: dynamic_link_map.setdefault(doctype, []).append(df) diff --git a/frappe/tests/test_linked_with.py b/frappe/tests/test_linked_with.py index d47d3fd18a..bab775b8cb 100644 --- a/frappe/tests/test_linked_with.py +++ b/frappe/tests/test_linked_with.py @@ -1,5 +1,9 @@ +import random +import string + import frappe from frappe.core.doctype.doctype.test_doctype import new_doctype +from frappe.database import savepoint from frappe.desk.form import linked_with from frappe.tests.utils import FrappeTestCase @@ -148,3 +152,36 @@ class TestLinkedWith(FrappeTestCase): amendment.submit() self.assertRaises(frappe.LinkExistsError, doc.delete) + + def test_reserved_keywords(self): + dt_name = "Test " + "".join(random.sample(string.ascii_lowercase, 10)) + new_doctype( + dt_name, + fields=[ + { + "fieldname": "from", + "fieldtype": "Link", + "options": "DocType", + }, + { + "fieldname": "order", + "fieldtype": "Dynamic Link", + "options": "from", + }, + ], + is_submittable=True, + ).insert() + + linked_doc = frappe.new_doc(dt_name).insert().submit() + + second_doc = ( + frappe.new_doc(dt_name, **{"from": linked_doc.doctype, "order": linked_doc.name}) + .insert() + .submit() + ) + + with savepoint(frappe.LinkExistsError): + linked_doc.cancel() and self.fail("Cancellation shouldn't have worked") + + second_doc.cancel() + linked_doc.reload().cancel()