From cb4d825c565f1f8fef340b4676b657d7e408f54f Mon Sep 17 00:00:00 2001 From: "mergify[bot]" <37929162+mergify[bot]@users.noreply.github.com> Date: Wed, 19 Oct 2022 17:05:39 +0530 Subject: [PATCH] fix: delete custom tables when doctype is deleted (#18433) (#18471) * fix: delete custom tables when doctype is deleted (cherry picked from commit 20593f155dae8a9e19deeb8879fe9c275b1fb931) Co-authored-by: Ankush Menat --- frappe/cache_manager.py | 8 +++++++- frappe/core/doctype/doctype/test_doctype.py | 12 ++++++++++++ frappe/model/delete_doc.py | 4 ++++ 3 files changed, 23 insertions(+), 1 deletion(-) diff --git a/frappe/cache_manager.py b/frappe/cache_manager.py index 2585e4c512..086e8b5a8c 100644 --- a/frappe/cache_manager.py +++ b/frappe/cache_manager.py @@ -130,12 +130,18 @@ def clear_doctype_cache(doctype=None): clear_single(doctype) # clear all parent doctypes - for dt in frappe.get_all( "DocField", "parent", dict(fieldtype=["in", frappe.model.table_fields], options=doctype) ): 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 delete_notification_count_for(doctype) diff --git a/frappe/core/doctype/doctype/test_doctype.py b/frappe/core/doctype/doctype/test_doctype.py index 44f2877e2b..3722e5d1fa 100644 --- a/frappe/core/doctype/doctype/test_doctype.py +++ b/frappe/core/doctype/doctype/test_doctype.py @@ -670,6 +670,18 @@ class TestDocType(FrappeTestCase): 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}) def test_delete_doctype_with_customization(self): from frappe.custom.doctype.property_setter.property_setter import make_property_setter diff --git a/frappe/model/delete_doc.py b/frappe/model/delete_doc.py index 072b9a1d66..d1120cc22d 100644 --- a/frappe/model/delete_doc.py +++ b/frappe/model/delete_doc.py @@ -95,6 +95,10 @@ def delete_doc( update_flags(doc, flags, ignore_permissions) 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}) delete_from_table(doctype, name, ignore_doctypes, None)