From 2de9ecc0333086dd730d3730949543aa48750627 Mon Sep 17 00:00:00 2001 From: Abdeali Chharchhoda Date: Fri, 24 Apr 2026 18:32:41 +0530 Subject: [PATCH] refactor: Add bulk delete utility for property setters --- .../property_setter/property_setter.py | 44 +++++++++++++++++++ 1 file changed, 44 insertions(+) diff --git a/frappe/custom/doctype/property_setter/property_setter.py b/frappe/custom/doctype/property_setter/property_setter.py index 0a38a16128..1559734504 100644 --- a/frappe/custom/doctype/property_setter/property_setter.py +++ b/frappe/custom/doctype/property_setter/property_setter.py @@ -114,3 +114,47 @@ def delete_property_setter(doc_type, property=None, field_name=None, row_name=No 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) + + +def bulk_delete_property_setters(property_setters: list[dict], bypass_hooks: bool = False): + """ + Delete property setters. + + :param property_setters: List of filters for Property Setter rows. + :param bypass_hooks: If `True`, raw delete without doc hooks. + + Example of `property_setters`: + ``` + [ + {"doctype": "ToDo", "fieldname": "status", "property": "hidden"}, + {"doctype": "ToDo", "fieldname": "status", "property": "read_only"}, + ] + ``` + """ + field_map = { + "doctype": "doc_type", + "fieldname": "field_name", + } + + for property_setter in property_setters: + filters = property_setter.copy() + + for key, fieldname in field_map.items(): + if key in filters: + filters[fieldname] = filters.pop(key) + + if not filters: + continue + + if bypass_hooks: + frappe.db.delete("Property Setter", filters) + + if filters.get("doc_type"): + frappe.clear_cache(doctype=filters["doc_type"]) + else: + property_setter_names = frappe.get_all("Property Setter", filters=filters, pluck="name") + + for property_setter_name in property_setter_names: + frappe.get_doc("Property Setter", property_setter_name).delete( + ignore_permissions=True, force=True + )