From 3dbef9de74636f034629273f2875c498c4d027a0 Mon Sep 17 00:00:00 2001 From: marination Date: Mon, 28 Oct 2019 15:48:10 +0530 Subject: [PATCH 1/2] fix: Search field entries included in Item Link field query --- erpnext/controllers/queries.py | 22 ++++++++++++++++------ 1 file changed, 16 insertions(+), 6 deletions(-) diff --git a/erpnext/controllers/queries.py b/erpnext/controllers/queries.py index 2f6b59f0fbe..ac89588978d 100644 --- a/erpnext/controllers/queries.py +++ b/erpnext/controllers/queries.py @@ -152,6 +152,17 @@ def tax_account_query(doctype, txt, searchfield, start, page_len, filters): def item_query(doctype, txt, searchfield, start, page_len, filters, as_dict=False): conditions = [] + #Get searchfields from meta and use in Item Link field query + meta = frappe.get_meta("Item") + searchfields = meta.get_search_fields() + + fields = [f for f in searchfields if not f in ["name", "item_group", "description"]] + fields = ", ".join(fields) + + searchfields = searchfields + [f for f in [searchfield or "name", "item_code", "item_group", "item_name"] + if not f in searchfields] + searchfields = " or ".join([field + " like %(txt)s" for field in searchfields]) + description_cond = '' if frappe.db.count('Item', cache=True) < 50000: # scan description only if items are less than 50000 @@ -162,17 +173,14 @@ def item_query(doctype, txt, searchfield, start, page_len, filters, as_dict=Fals concat(substr(tabItem.item_name, 1, 40), "..."), item_name) as item_name, tabItem.item_group, if(length(tabItem.description) > 40, \ - concat(substr(tabItem.description, 1, 40), "..."), description) as decription + concat(substr(tabItem.description, 1, 40), "..."), description) as description, + {fields} from tabItem where tabItem.docstatus < 2 and tabItem.has_variants=0 and tabItem.disabled=0 and (tabItem.end_of_life > %(today)s or ifnull(tabItem.end_of_life, '0000-00-00')='0000-00-00') - and (tabItem.`{key}` LIKE %(txt)s - or tabItem.item_code LIKE %(txt)s - or tabItem.item_group LIKE %(txt)s - or tabItem.item_name LIKE %(txt)s - or tabItem.item_code IN (select parent from `tabItem Barcode` where barcode LIKE %(txt)s) + and ({scond} or tabItem.item_code IN (select parent from `tabItem Barcode` where barcode LIKE %(txt)s) {description_cond}) {fcond} {mcond} order by @@ -182,6 +190,8 @@ def item_query(doctype, txt, searchfield, start, page_len, filters, as_dict=Fals name, item_name limit %(start)s, %(page_len)s """.format( key=searchfield, + fields=fields, + scond=searchfields, fcond=get_filters_cond(doctype, filters, conditions).replace('%', '%%'), mcond=get_match_cond(doctype).replace('%', '%%'), description_cond = description_cond), From 1e754b161c3c091579fcb74716434bdbb2460674 Mon Sep 17 00:00:00 2001 From: marination Date: Wed, 30 Oct 2019 18:33:44 +0530 Subject: [PATCH 2/2] fix: Fetching catched meta and removed description fetch from Search Fields Description is conditionally fetched and also used in WHERE clause, that is maintained. Improved naming --- erpnext/controllers/queries.py | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/erpnext/controllers/queries.py b/erpnext/controllers/queries.py index ac89588978d..a9e50bab5a4 100644 --- a/erpnext/controllers/queries.py +++ b/erpnext/controllers/queries.py @@ -153,14 +153,17 @@ def item_query(doctype, txt, searchfield, start, page_len, filters, as_dict=Fals conditions = [] #Get searchfields from meta and use in Item Link field query - meta = frappe.get_meta("Item") + meta = frappe.get_meta("Item", cached=True) searchfields = meta.get_search_fields() - fields = [f for f in searchfields if not f in ["name", "item_group", "description"]] - fields = ", ".join(fields) + if "description" in searchfields: + searchfields.remove("description") - searchfields = searchfields + [f for f in [searchfield or "name", "item_code", "item_group", "item_name"] - if not f in searchfields] + columns = [field for field in searchfields if not field in ["name", "item_group", "description"]] + columns = ", ".join(columns) + + searchfields = searchfields + [field for field in[searchfield or "name", "item_code", "item_group", "item_name"] + if not field in searchfields] searchfields = " or ".join([field + " like %(txt)s" for field in searchfields]) description_cond = '' @@ -174,7 +177,7 @@ def item_query(doctype, txt, searchfield, start, page_len, filters, as_dict=Fals tabItem.item_group, if(length(tabItem.description) > 40, \ concat(substr(tabItem.description, 1, 40), "..."), description) as description, - {fields} + {columns} from tabItem where tabItem.docstatus < 2 and tabItem.has_variants=0 @@ -190,7 +193,7 @@ def item_query(doctype, txt, searchfield, start, page_len, filters, as_dict=Fals name, item_name limit %(start)s, %(page_len)s """.format( key=searchfield, - fields=fields, + columns=columns, scond=searchfields, fcond=get_filters_cond(doctype, filters, conditions).replace('%', '%%'), mcond=get_match_cond(doctype).replace('%', '%%'),