fix: Consider Website Item Groups in Item group page product listing
- Passed an argument to query engine to know when query is for item group page - If for item group page, get data with regards to website item group table - This query should be fast since there's one filter and that shortens the table beforehand - This data is merged with the results from the Item master (results only considering item attributes and field filters) - The combined data is then sorted as per weightage Co-authored-by: Gavin D'souza <gavin18d@gmail.com>
This commit is contained in:
parent
44815393b3
commit
d802d73973
@ -91,7 +91,7 @@ class ItemGroup(NestedSet, WebsiteGenerator):
|
|||||||
field_filters['item_group'] = self.name
|
field_filters['item_group'] = self.name
|
||||||
|
|
||||||
engine = ProductQuery()
|
engine = ProductQuery()
|
||||||
context.items = engine.query(attribute_filters, field_filters, search, start)
|
context.items = engine.query(attribute_filters, field_filters, search, start, item_group=self.name)
|
||||||
|
|
||||||
filter_engine = ProductFiltersBuilder(self.name)
|
filter_engine = ProductFiltersBuilder(self.name)
|
||||||
|
|
||||||
|
@ -22,13 +22,14 @@ class ProductQuery:
|
|||||||
self.settings = frappe.get_doc("Products Settings")
|
self.settings = frappe.get_doc("Products Settings")
|
||||||
self.cart_settings = frappe.get_doc("Shopping Cart Settings")
|
self.cart_settings = frappe.get_doc("Shopping Cart Settings")
|
||||||
self.page_length = self.settings.products_per_page or 20
|
self.page_length = self.settings.products_per_page or 20
|
||||||
self.fields = ['name', 'item_name', 'item_code', 'website_image', 'variant_of', 'has_variants', 'item_group', 'image', 'web_long_description', 'description', 'route']
|
self.fields = ['name', 'item_name', 'item_code', 'website_image', 'variant_of', 'has_variants',
|
||||||
|
'item_group', 'image', 'web_long_description', 'description', 'route', 'weightage']
|
||||||
self.filters = []
|
self.filters = []
|
||||||
self.or_filters = [['show_in_website', '=', 1]]
|
self.or_filters = [['show_in_website', '=', 1]]
|
||||||
if not self.settings.get('hide_variants'):
|
if not self.settings.get('hide_variants'):
|
||||||
self.or_filters.append(['show_variant_in_website', '=', 1])
|
self.or_filters.append(['show_variant_in_website', '=', 1])
|
||||||
|
|
||||||
def query(self, attributes=None, fields=None, search_term=None, start=0):
|
def query(self, attributes=None, fields=None, search_term=None, start=0, item_group=None):
|
||||||
"""Summary
|
"""Summary
|
||||||
|
|
||||||
Args:
|
Args:
|
||||||
@ -44,6 +45,15 @@ class ProductQuery:
|
|||||||
if search_term: self.build_search_filters(search_term)
|
if search_term: self.build_search_filters(search_term)
|
||||||
|
|
||||||
result = []
|
result = []
|
||||||
|
website_item_groups = []
|
||||||
|
|
||||||
|
# if from item group page consider website item group table
|
||||||
|
if item_group:
|
||||||
|
website_item_groups = frappe.db.get_all(
|
||||||
|
"Item",
|
||||||
|
fields=self.fields + ["`tabWebsite Item Group`.parent as wig_parent"],
|
||||||
|
filters=[["Website Item Group", "item_group", "=", item_group]]
|
||||||
|
)
|
||||||
|
|
||||||
if attributes:
|
if attributes:
|
||||||
all_items = []
|
all_items = []
|
||||||
@ -61,12 +71,10 @@ class ProductQuery:
|
|||||||
],
|
],
|
||||||
or_filters=self.or_filters,
|
or_filters=self.or_filters,
|
||||||
start=start,
|
start=start,
|
||||||
limit=self.page_length,
|
limit=self.page_length
|
||||||
order_by="weightage desc"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
items_dict = {item.name: item for item in items}
|
items_dict = {item.name: item for item in items}
|
||||||
# TODO: Replace Variants by their parent templates
|
|
||||||
|
|
||||||
all_items.append(set(items_dict.keys()))
|
all_items.append(set(items_dict.keys()))
|
||||||
|
|
||||||
@ -78,14 +86,22 @@ class ProductQuery:
|
|||||||
filters=self.filters,
|
filters=self.filters,
|
||||||
or_filters=self.or_filters,
|
or_filters=self.or_filters,
|
||||||
start=start,
|
start=start,
|
||||||
limit=self.page_length,
|
limit=self.page_length
|
||||||
order_by="weightage desc"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
|
# Combine results having context of website item groups into item results
|
||||||
|
if item_group and website_item_groups:
|
||||||
|
items_list = {row.name for row in result}
|
||||||
|
for row in website_item_groups:
|
||||||
|
if row.wig_parent not in items_list:
|
||||||
|
result.append(row)
|
||||||
|
|
||||||
|
result = sorted(result, key=lambda x: x.get("weightage"), reverse=True)
|
||||||
|
|
||||||
for item in result:
|
for item in result:
|
||||||
product_info = get_product_info_for_website(item.item_code, skip_quotation_creation=True).get('product_info')
|
product_info = get_product_info_for_website(item.item_code, skip_quotation_creation=True).get('product_info')
|
||||||
if product_info:
|
if product_info:
|
||||||
item.formatted_price = product_info['price'].get('formatted_price') if product_info['price'] else None
|
item.formatted_price = product_info.get('price', {}).get('formatted_price')
|
||||||
|
|
||||||
return result
|
return result
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user