Beispiel #1
0
	def build_item_group_filters(self, item_group):
		"Add filters for Item group page and include Website Item Groups."
		from erpnext.setup.doctype.item_group.item_group import get_child_groups_for_website

		item_group_filters = []

		item_group_filters.append(["Website Item", "item_group", "=", item_group])
		# Consider Website Item Groups
		item_group_filters.append(["Website Item Group", "item_group", "=", item_group])

		if frappe.db.get_value("Item Group", item_group, "include_descendants"):
			# include child item group's items as well
			# eg. Group Node A, will show items of child 1 and child 2 as well
			# on it's web page
			include_groups = get_child_groups_for_website(item_group, include_self=True)
			include_groups = [x.name for x in include_groups]
			item_group_filters.append(["Website Item", "item_group", "in", include_groups])

		self.or_filters.extend(item_group_filters)
Beispiel #2
0
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:
		field_filters['item_group'] = 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"]
	}
Beispiel #3
0
    def get_field_filters(self):
        from erpnext.setup.doctype.item_group.item_group import get_child_groups_for_website

        if not self.item_group and not self.doc.enable_field_filters:
            return

        fields, filter_data = [], []
        filter_fields = [row.fieldname for row in self.doc.filter_fields
                         ]  # fields in settings

        # filter valid field filters i.e. those that exist in Website Item
        web_item_meta = frappe.get_meta("Website Item", cached=True)
        fields = [
            web_item_meta.get_field(field) for field in filter_fields
            if web_item_meta.has_field(field)
        ]

        for df in fields:
            item_filters, item_or_filters = {"published": 1}, []
            link_doctype_values = self.get_filtered_link_doctype_records(df)

            if df.fieldtype == "Link":
                if self.item_group:
                    include_child = frappe.db.get_value(
                        "Item Group", self.item_group, "include_descendants")
                    if include_child:
                        include_groups = get_child_groups_for_website(
                            self.item_group, include_self=True)
                        include_groups = [x.name for x in include_groups]
                        item_or_filters.extend([
                            ["item_group", "in", include_groups],
                            [
                                "Website Item Group", "item_group", "=",
                                self.item_group
                            ],  # consider website item groups
                        ])
                    else:
                        item_or_filters.extend([
                            ["item_group", "=", self.item_group],
                            [
                                "Website Item Group", "item_group", "=",
                                self.item_group
                            ],  # consider website item groups
                        ])

                # exclude variants if mentioned in settings
                if frappe.db.get_single_value("E Commerce Settings",
                                              "hide_variants"):
                    item_filters["variant_of"] = ["is", "not set"]

                # Get link field values attached to published items
                item_values = frappe.get_all(
                    "Website Item",
                    fields=[df.fieldname],
                    filters=item_filters,
                    or_filters=item_or_filters,
                    distinct="True",
                    pluck=df.fieldname,
                )

                values = list(set(item_values)
                              & link_doctype_values)  # intersection of both
            else:
                # table multiselect
                values = list(link_doctype_values)

            # Remove None
            if None in values:
                values.remove(None)

            if values:
                filter_data.append([df, values])

        return filter_data