From 8d328e2f9494351687ce3ade85d185f2c54d55b0 Mon Sep 17 00:00:00 2001 From: Abdeali Chharchhoda Date: Mon, 27 Apr 2026 10:43:24 +0530 Subject: [PATCH] refactor: Simplify property setter deletion logic and enforce required fields --- .../property_setter/property_setter.py | 32 ++++++++++++------- 1 file changed, 21 insertions(+), 11 deletions(-) diff --git a/frappe/custom/doctype/property_setter/property_setter.py b/frappe/custom/doctype/property_setter/property_setter.py index 1559734504..394faf0771 100644 --- a/frappe/custom/doctype/property_setter/property_setter.py +++ b/frappe/custom/doctype/property_setter/property_setter.py @@ -111,9 +111,7 @@ def delete_property_setter(doc_type, property=None, field_name=None, row_name=No if row_name: filters["row_name"] = row_name - property_setters = frappe.db.get_values("Property Setter", filters) - for ps in property_setters: - frappe.get_doc("Property Setter", ps).delete(ignore_permissions=True, force=True) + _delete_property_setters(filters) def bulk_delete_property_setters(property_setters: list[dict], bypass_hooks: bool = False): @@ -130,12 +128,18 @@ def bulk_delete_property_setters(property_setters: list[dict], bypass_hooks: boo {"doctype": "ToDo", "fieldname": "status", "property": "read_only"}, ] ``` + + --- + + Note: `doctype` and `fieldname` are mandatory. """ field_map = { "doctype": "doc_type", "fieldname": "field_name", } + doctypes_to_clear = set() + for property_setter in property_setters: filters = property_setter.copy() @@ -146,15 +150,21 @@ def bulk_delete_property_setters(property_setters: list[dict], bypass_hooks: boo if not filters: continue + if not filters.get("doc_type") or not filters.get("field_name"): + frappe.throw(_("`doctype` and `fieldname` are required for deleting property setters.")) + if bypass_hooks: frappe.db.delete("Property Setter", filters) - - if filters.get("doc_type"): - frappe.clear_cache(doctype=filters["doc_type"]) + doctypes_to_clear.add(filters["doc_type"]) else: - property_setter_names = frappe.get_all("Property Setter", filters=filters, pluck="name") + _delete_property_setters(filters) - for property_setter_name in property_setter_names: - frappe.get_doc("Property Setter", property_setter_name).delete( - ignore_permissions=True, force=True - ) + for doctype in doctypes_to_clear: + frappe.clear_cache(doctype=doctype) + + +def _delete_property_setters(filters: dict): + property_setters = frappe.get_all("Property Setter", filters=filters, pluck="name") + + for ps in property_setters: + frappe.get_doc("Property Setter", ps).delete(ignore_permissions=True, force=True)