| # -*- coding: utf-8 -*- |
| # Copyright (c) 2021, Frappe Technologies Pvt. Ltd. and contributors |
| # For license information, please see license.txt |
| |
| import json |
| |
| import frappe |
| from frappe.utils import cint |
| |
| from erpnext.e_commerce.product_data_engine.filters import ProductFiltersBuilder |
| from erpnext.e_commerce.product_data_engine.query import ProductQuery |
| from erpnext.setup.doctype.item_group.item_group import get_child_groups_for_website |
| |
| |
| @frappe.whitelist(allow_guest=True) |
| def get_product_filter_data(query_args=None): |
| """ |
| Returns filtered products and discount filters. |
| :param query_args (dict): contains filters to get products list |
| |
| Query Args filters: |
| search (str): Search Term. |
| field_filters (dict): Keys include item_group, brand, etc. |
| attribute_filters(dict): Keys include Color, Size, etc. |
| start (int): Offset items by |
| item_group (str): Valid Item Group |
| from_filters (bool): Set as True to jump to page 1 |
| """ |
| if isinstance(query_args, str): |
| query_args = json.loads(query_args) |
| |
| query_args = frappe._dict(query_args) |
| if query_args: |
| search = query_args.get("search") |
| field_filters = query_args.get("field_filters", {}) |
| attribute_filters = query_args.get("attribute_filters", {}) |
| start = cint(query_args.start) if query_args.get("start") else 0 |
| item_group = query_args.get("item_group") |
| from_filters = query_args.get("from_filters") |
| else: |
| search, attribute_filters, item_group, from_filters = None, None, None, None |
| field_filters = {} |
| start = 0 |
| |
| # if new filter is checked, reset start to show filtered items from page 1 |
| if from_filters: |
| start = 0 |
| |
| sub_categories = [] |
| if item_group: |
| sub_categories = get_child_groups_for_website(item_group, immediate=True) |
| |
| engine = ProductQuery() |
| try: |
| result = engine.query( |
| attribute_filters, |
| field_filters, |
| search_term=search, |
| start=start, |
| item_group=item_group |
| ) |
| except Exception: |
| traceback = frappe.get_traceback() |
| frappe.log_error(traceback, frappe._("Product Engine Error")) |
| return {"exc": "Something went wrong!"} |
| |
| # discount filter data |
| filters = {} |
| discounts = result["discounts"] |
| |
| if discounts: |
| filter_engine = ProductFiltersBuilder() |
| filters["discount_filters"] = filter_engine.get_discount_filters(discounts) |
| |
| return { |
| "items": result["items"] or [], |
| "filters": filters, |
| "settings": engine.settings, |
| "sub_categories": sub_categories, |
| "items_count": result["items_count"] |
| } |
| |
| @frappe.whitelist(allow_guest=True) |
| def get_guest_redirect_on_action(): |
| return frappe.db.get_single_value("E Commerce Settings", "redirect_on_action") |