From e2920e2536786b9a19fde30798b0c8aee86739e4 Mon Sep 17 00:00:00 2001 From: Ankush Menat Date: Wed, 28 May 2025 15:27:37 +0530 Subject: [PATCH] perf: Fix incorrect cache implementation `if not {}` results to `True` so if someone doesn't have inventory dimensions, this gets called again and again. --- .../inventory_dimension.py | 34 ++++++++----------- .../test_inventory_dimension.py | 5 +-- 2 files changed, 17 insertions(+), 22 deletions(-) diff --git a/erpnext/stock/doctype/inventory_dimension/inventory_dimension.py b/erpnext/stock/doctype/inventory_dimension/inventory_dimension.py index 778a32aaab3..3eca690538a 100644 --- a/erpnext/stock/doctype/inventory_dimension/inventory_dimension.py +++ b/erpnext/stock/doctype/inventory_dimension/inventory_dimension.py @@ -5,6 +5,7 @@ import frappe from frappe import _, bold, scrub from frappe.custom.doctype.custom_field.custom_field import create_custom_fields from frappe.model.document import Document +from frappe.utils.caching import request_cache class DoNotChangeError(frappe.ValidationError): @@ -388,27 +389,20 @@ def get_document_wise_inventory_dimensions(doctype) -> dict: @frappe.whitelist() +@request_cache def get_inventory_dimensions(): - if not hasattr(frappe.local, "inventory_dimensions"): - frappe.local.inventory_dimensions = {} - - if not frappe.local.inventory_dimensions: - dimensions = frappe.get_all( - "Inventory Dimension", - fields=[ - "distinct target_fieldname as fieldname", - "source_fieldname", - "reference_document as doctype", - "validate_negative_stock", - "name as dimension_name", - ], - filters={"disabled": 0}, - order_by="creation", - ) - - frappe.local.inventory_dimensions = dimensions - - return frappe.local.inventory_dimensions + return frappe.get_all( + "Inventory Dimension", + fields=[ + "distinct target_fieldname as fieldname", + "source_fieldname", + "reference_document as doctype", + "validate_negative_stock", + "name as dimension_name", + ], + filters={"disabled": 0}, + order_by="creation", + ) @frappe.whitelist() diff --git a/erpnext/stock/doctype/inventory_dimension/test_inventory_dimension.py b/erpnext/stock/doctype/inventory_dimension/test_inventory_dimension.py index cf477492eae..ac66eca497a 100644 --- a/erpnext/stock/doctype/inventory_dimension/test_inventory_dimension.py +++ b/erpnext/stock/doctype/inventory_dimension/test_inventory_dimension.py @@ -12,6 +12,7 @@ from erpnext.stock.doctype.inventory_dimension.inventory_dimension import ( CanNotBeDefaultDimension, DoNotChangeError, delete_dimension, + get_inventory_dimensions, ) from erpnext.stock.doctype.item.test_item import create_item from erpnext.stock.doctype.purchase_receipt.test_purchase_receipt import make_purchase_receipt @@ -447,7 +448,7 @@ class TestInventoryDimension(IntegrationTestCase): self.assertEqual(d.store, "Inter Transfer Store 2") def test_validate_negative_stock_for_inventory_dimension(self): - frappe.local.inventory_dimensions = {} + get_inventory_dimensions.clear_cache() item_code = "Test Negative Inventory Dimension Item" frappe.db.set_single_value("Stock Settings", "allow_negative_stock", 1) create_item(item_code) @@ -496,7 +497,7 @@ class TestInventoryDimension(IntegrationTestCase): # disable validate_negative_stock for inventory dimension inv_dimension.reload() inv_dimension.db_set("validate_negative_stock", 0) - frappe.local.inventory_dimensions = {} + get_inventory_dimensions.clear_cache() # Try issuing 100 qty, more than available stock against inventory dimension doc = make_stock_entry(item_code=item_code, source=warehouse, qty=100, do_not_submit=True)