From a8e235116906b7a125c1fa9b45c15e7bcfac042b Mon Sep 17 00:00:00 2001 From: Mihir Kandoi Date: Tue, 11 Aug 2026 16:03:49 +0530 Subject: [PATCH] perf(stock): skip item metadata rewrite when settings unchanged Every Stock Settings save rewrote the Item naming property setters and the barcode visibility property setters. make_property_setter without a doctype fans out to every doctype that has the fieldname and clears each doctype's cache, and set_by_naming_series also backfills tabItem. Gate both on has_value_changed. Item naming behaviour is unaffected: it reads the item_naming_by default, which is still set on every save. --- .../doctype/stock_settings/stock_settings.py | 42 ++++++++++++------- 1 file changed, 26 insertions(+), 16 deletions(-) diff --git a/erpnext/stock/doctype/stock_settings/stock_settings.py b/erpnext/stock/doctype/stock_settings/stock_settings.py index cefb321c791..c986a4fa115 100644 --- a/erpnext/stock/doctype/stock_settings/stock_settings.py +++ b/erpnext/stock/doctype/stock_settings/stock_settings.py @@ -84,22 +84,8 @@ class StockSettings(Document): ]: frappe.db.set_default(key, self.get(key, "")) - from erpnext.utilities.naming import set_by_naming_series - - set_by_naming_series( - "Item", - "item_code", - self.get("item_naming_by") == "Naming Series", - hide_name_field=True, - make_mandatory=0, - ) - - # show/hide barcode field - for name in ["barcode", "barcodes", "scan_barcode"]: - frappe.make_property_setter( - {"fieldname": name, "property": "hidden", "value": 0 if self.show_barcode_field else 1}, - validate_fields_for_doctype=False, - ) + self.update_item_naming_settings() + self.update_barcode_field_visibility() self.validate_over_delivery_receipt_allowance() self.validate_serial_and_batch_no_settings() @@ -113,6 +99,30 @@ class StockSettings(Document): self.change_precision_for_stock_entry() self.validate_do_not_use_batchwise_valuation() + def update_item_naming_settings(self): + if not self.has_value_changed("item_naming_by"): + return + + from erpnext.utilities.naming import set_by_naming_series + + set_by_naming_series( + "Item", + "item_code", + self.get("item_naming_by") == "Naming Series", + hide_name_field=True, + make_mandatory=0, + ) + + def update_barcode_field_visibility(self): + if not self.has_value_changed("show_barcode_field"): + return + + for name in ["barcode", "barcodes", "scan_barcode"]: + frappe.make_property_setter( + {"fieldname": name, "property": "hidden", "value": 0 if self.show_barcode_field else 1}, + validate_fields_for_doctype=False, + ) + def validate_over_delivery_receipt_allowance(self): if not self.over_delivery_receipt_allowance: self.role_allowed_to_over_deliver_receive = None