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.
This commit is contained in:
Mihir Kandoi
2026-08-11 16:03:49 +05:30
parent 575f34e7c6
commit a8e2351169

View File

@@ -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