Source code for shoop.core.utils.product_bought_with_relations

# This file is part of Shoop.
#
# Copyright (c) 2012-2016, Shoop Ltd. All rights reserved.
#
# This source code is licensed under the AGPLv3 license found in the
# LICENSE file in the root directory of this source tree.

from django.db.models import Sum

from shoop.core.models import (
    OrderLine, OrderLineType, ProductCrossSell, ProductCrossSellType
)


[docs]def add_bought_with_relations_for_product(product_id, max_quantity=10): """ Add ``ProductCrossSell`` objects with type ``ProductCrossSellType.BOUGHT_WITH`` based on other products ordered with product_id. Ordered amount is used as relation weight. :param product_id: product_id to add relations to :type product_id: int :param max_quantity: maximum amount of relations created :type max_quantity: int """ order_ids_to_check = OrderLine.objects.filter( product_id=product_id ).values_list( "order_id", flat=True ) # Group all order lines related to given product_id # with product_id and calculate Sum of purchased quantities related_product_ids_and_quantities = OrderLine.objects.exclude( product_id=product_id ).filter( type=OrderLineType.PRODUCT, order_id__in=set(order_ids_to_check) ).values( "product_id" ).annotate( total_quantity=Sum("quantity") ).order_by( "-total_quantity" )[:max_quantity] # Add the actual cross-sells products for product_data in related_product_ids_and_quantities: ProductCrossSell.objects.create( product1_id=product_id, product2_id=product_data["product_id"], weight=product_data["total_quantity"], type=ProductCrossSellType.BOUGHT_WITH )