* fix: delete custom tables when doctype is deleted
(cherry picked from commit 20593f155d
)
Co-authored-by: Ankush Menat <ankush@frappe.io>
version-14
@@ -130,12 +130,18 @@ def clear_doctype_cache(doctype=None): | |||||
clear_single(doctype) | clear_single(doctype) | ||||
# clear all parent doctypes | # clear all parent doctypes | ||||
for dt in frappe.get_all( | for dt in frappe.get_all( | ||||
"DocField", "parent", dict(fieldtype=["in", frappe.model.table_fields], options=doctype) | "DocField", "parent", dict(fieldtype=["in", frappe.model.table_fields], options=doctype) | ||||
): | ): | ||||
clear_single(dt.parent) | clear_single(dt.parent) | ||||
# clear all parent doctypes | |||||
if not frappe.flags.in_install: | |||||
for dt in frappe.get_all( | |||||
"Custom Field", "dt", dict(fieldtype=["in", frappe.model.table_fields], options=doctype) | |||||
): | |||||
clear_single(dt.dt) | |||||
# clear all notifications | # clear all notifications | ||||
delete_notification_count_for(doctype) | delete_notification_count_for(doctype) | ||||
@@ -670,6 +670,18 @@ class TestDocType(FrappeTestCase): | |||||
self.assertEqual(test_json.test_json_field["hello"], "world") | self.assertEqual(test_json.test_json_field["hello"], "world") | ||||
@patch.dict(frappe.conf, {"developer_mode": 1}) | |||||
def test_custom_field_deletion(self): | |||||
"""Custom child tables whose doctype doesn't exist should be auto deleted.""" | |||||
doctype = new_doctype(custom=0).insert().name | |||||
child = new_doctype(custom=0, istable=1).insert().name | |||||
field = "abc" | |||||
create_custom_fields({doctype: [{"fieldname": field, "fieldtype": "Table", "options": child}]}) | |||||
frappe.delete_doc("DocType", child) | |||||
self.assertFalse(frappe.get_meta(doctype).get_field(field)) | |||||
@patch.dict(frappe.conf, {"developer_mode": 1}) | @patch.dict(frappe.conf, {"developer_mode": 1}) | ||||
def test_delete_doctype_with_customization(self): | def test_delete_doctype_with_customization(self): | ||||
from frappe.custom.doctype.property_setter.property_setter import make_property_setter | from frappe.custom.doctype.property_setter.property_setter import make_property_setter | ||||
@@ -95,6 +95,10 @@ def delete_doc( | |||||
update_flags(doc, flags, ignore_permissions) | update_flags(doc, flags, ignore_permissions) | ||||
check_permission_and_not_submitted(doc) | check_permission_and_not_submitted(doc) | ||||
# delete custom table fields using this doctype. | |||||
frappe.db.delete( | |||||
"Custom Field", {"options": name, "fieldtype": ("in", frappe.model.table_fields)} | |||||
) | |||||
frappe.db.delete("__global_search", {"doctype": name}) | frappe.db.delete("__global_search", {"doctype": name}) | ||||
delete_from_table(doctype, name, ignore_doctypes, None) | delete_from_table(doctype, name, ignore_doctypes, None) | ||||