From a52b2d8eb56da34d948d2bfa453c7faf1ec30c4c Mon Sep 17 00:00:00 2001 From: Ankush Menat Date: Mon, 26 May 2025 14:46:27 +0530 Subject: [PATCH 1/5] perf: don't update price of newly inserted item --- erpnext/stock/doctype/item/item.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/erpnext/stock/doctype/item/item.py b/erpnext/stock/doctype/item/item.py index fe40f748646..a8e36c533bc 100644 --- a/erpnext/stock/doctype/item/item.py +++ b/erpnext/stock/doctype/item/item.py @@ -526,6 +526,9 @@ class Item(Document): return self._stock_ledger_created def update_item_price(self): + if self.is_new(): + return + frappe.db.sql( """ UPDATE `tabItem Price` From a54d965d6dae0b9b0e043e6a1dedbfdc447571a6 Mon Sep 17 00:00:00 2001 From: Ankush Menat Date: Mon, 26 May 2025 14:57:11 +0530 Subject: [PATCH 2/5] perf: validate variant change only if value changed --- erpnext/stock/doctype/item/item.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/erpnext/stock/doctype/item/item.py b/erpnext/stock/doctype/item/item.py index a8e36c533bc..7400a34b3f2 100644 --- a/erpnext/stock/doctype/item/item.py +++ b/erpnext/stock/doctype/item/item.py @@ -793,7 +793,10 @@ class Item(Document): ) def validate_has_variants(self): - if not self.has_variants and frappe.db.get_value("Item", self.name, "has_variants"): + if self.is_new(): + return + + if not self.has_variants and self.has_value_changed("has_variants"): if frappe.db.exists("Item", {"variant_of": self.name}): frappe.throw(_("Item has variants.")) From 31b8eb4922b4debe8efdc467583591bf800c36b2 Mon Sep 17 00:00:00 2001 From: Ankush Menat Date: Mon, 26 May 2025 14:59:02 +0530 Subject: [PATCH 3/5] perf: don't validate for change on new documents --- erpnext/stock/doctype/item/item.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/erpnext/stock/doctype/item/item.py b/erpnext/stock/doctype/item/item.py index 7400a34b3f2..ffb6953122f 100644 --- a/erpnext/stock/doctype/item/item.py +++ b/erpnext/stock/doctype/item/item.py @@ -306,7 +306,7 @@ class Item(Document): if self.stock_ledger_created(): frappe.throw(_("Cannot be a fixed asset item as Stock Ledger is created.")) - if not self.is_fixed_asset: + if not self.is_fixed_asset and not self.is_new(): asset = frappe.db.get_all("Asset", filters={"item_code": self.name, "docstatus": 1}, limit=1) if asset: frappe.throw( From 41d56c8e3acbb12f2e2ed9821da4a3801657cd40 Mon Sep 17 00:00:00 2001 From: Ankush Menat Date: Mon, 26 May 2025 15:03:55 +0530 Subject: [PATCH 4/5] perf: fetch cached item group defaults, avoid query --- erpnext/stock/doctype/item/item.py | 25 +++++-------------------- 1 file changed, 5 insertions(+), 20 deletions(-) diff --git a/erpnext/stock/doctype/item/item.py b/erpnext/stock/doctype/item/item.py index ffb6953122f..3fe0cc852d4 100644 --- a/erpnext/stock/doctype/item/item.py +++ b/erpnext/stock/doctype/item/item.py @@ -725,23 +725,9 @@ class Item(Document): if self.item_defaults or not self.item_group: return - item_defaults = frappe.db.get_values( - "Item Default", - {"parent": self.item_group}, - [ - "company", - "default_warehouse", - "default_price_list", - "buying_cost_center", - "default_supplier", - "expense_account", - "selling_cost_center", - "income_account", - ], - as_dict=1, - ) - if item_defaults: - for item in item_defaults: + item_group = frappe.get_cached_doc("Item Group", self.item_group) + if item_group.item_group_defaults: + for item in item_group.item_group_defaults: self.append( "item_defaults", { @@ -762,9 +748,8 @@ class Item(Document): if ( defaults.get("default_warehouse") and defaults.company - and frappe.db.exists( - "Warehouse", {"name": defaults.default_warehouse, "company": defaults.company} - ) + and defaults.company + == frappe.get_cached_value("Warehouse", defaults.default_warehouse, "company") ): self.append( "item_defaults", From 7b811a93b41454eb91e3721d194c46fda2ac095d Mon Sep 17 00:00:00 2001 From: Ankush Menat Date: Mon, 26 May 2025 15:21:56 +0530 Subject: [PATCH 5/5] perf: don't cleanup plaintext fallback --- erpnext/stock/doctype/item/item.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/erpnext/stock/doctype/item/item.py b/erpnext/stock/doctype/item/item.py index 3fe0cc852d4..c41c0528834 100644 --- a/erpnext/stock/doctype/item/item.py +++ b/erpnext/stock/doctype/item/item.py @@ -226,7 +226,10 @@ class Item(Document): def validate_description(self): """Clean HTML description if set""" - if cint(frappe.db.get_single_value("Stock Settings", "clean_description_html")): + if ( + cint(frappe.db.get_single_value("Stock Settings", "clean_description_html")) + and self.description != self.item_name # perf: Avoid cleaning up a fallback + ): self.description = clean_html(self.description) def validate_customer_provided_part(self):