def matches(self, basket, lines):
     product_id_to_qty = get_product_ids_and_quantities(basket)
     product_ids = self.products.filter(id__in=product_id_to_qty.keys()).values_list("id", flat=True)
     for product_id in product_ids:
         if self.operator == ComparisonOperator.GTE:
             return product_id_to_qty[product_id] >= self.quantity
         elif self.operator == ComparisonOperator.EQUALS:
             return product_id_to_qty[product_id] == self.quantity
     return False
 def matches(self, basket, lines):
     product_id_to_qty = get_product_ids_and_quantities(basket)
     product_ids = self.products.filter(id__in=product_id_to_qty.keys()).values_list("id", flat=True)
     for product_id in product_ids:
         if self.operator == ComparisonOperator.GTE:
             return product_id_to_qty[product_id] >= self.quantity
         elif self.operator == ComparisonOperator.EQUALS:
             return product_id_to_qty[product_id] == self.quantity
     return False
 def matches(self, basket, lines):
     product_id_to_qty = get_product_ids_and_quantities(basket)
     category_product_ids = self.category.shop_products.filter(product_id__in=product_id_to_qty.keys()).values_list(
         "product_id", flat=True
     )
     product_count = sum(product_id_to_qty[product_id] for product_id in category_product_ids)
     if self.operator == ComparisonOperator.EQUALS:
         return bool(product_count == self.quantity)
     else:
         return bool(product_count >= self.quantity)
Exemple #4
0
 def matches(self, basket, lines):
     campaign = self.campaign.first()
     supplier = campaign.supplier if hasattr(campaign, "supplier") and campaign.supplier else None
     product_id_to_qty = get_product_ids_and_quantities(basket, supplier)
     product_ids = self.products.filter(id__in=product_id_to_qty.keys()).values_list("id", flat=True)
     for product_id in product_ids:
         if self.operator == ComparisonOperator.GTE:
             return product_id_to_qty[product_id] >= self.quantity
         elif self.operator == ComparisonOperator.EQUALS:
             return product_id_to_qty[product_id] == self.quantity
     return False
Exemple #5
0
 def matches(self, basket, lines):
     product_id_to_qty = get_product_ids_and_quantities(basket)
     category_product_ids = self.category.shop_products.filter(
         product_id__in=product_id_to_qty.keys()).values_list("product_id",
                                                              flat=True)
     product_count = sum(product_id_to_qty[product_id]
                         for product_id in category_product_ids)
     if self.operator == ComparisonOperator.EQUALS:
         return bool(product_count == self.quantity)
     else:
         return bool(product_count >= self.quantity)
Exemple #6
0
 def matches(self, basket, lines):
     campaign = self.campaign.first()
     supplier = campaign.supplier if hasattr(
         campaign, "supplier") and campaign.supplier else None
     product_id_to_qty = get_product_ids_and_quantities(basket, supplier)
     product_ids = self.products.filter(
         id__in=product_id_to_qty.keys()).values_list("id", flat=True)
     for product_id in product_ids:
         if self.operator == ComparisonOperator.GTE:
             return product_id_to_qty[product_id] >= self.quantity
         elif self.operator == ComparisonOperator.EQUALS:
             return product_id_to_qty[product_id] == self.quantity
     return False
Exemple #7
0
    def matches(self, basket, lines):
        product_id_to_qty = get_product_ids_and_quantities(basket)
        if ShopProduct.objects.filter(
                product_id__in=product_id_to_qty.keys(), categories__in=self.excluded_categories.all()).exists():
            return False

        product_ids = ShopProduct.objects.filter(
            categories__in=self.categories.all(), product_id__in=product_id_to_qty.keys()
        ).values_list("product_id", flat=True)
        product_count = sum(product_id_to_qty[product_id] for product_id in product_ids)
        if self.operator == ComparisonOperator.EQUALS:
            return bool(product_count == self.quantity)
        else:
            return bool(product_count >= self.quantity)
Exemple #8
0
    def get_matching(cls, basket, lines):
        matching = []
        exclude_condition_ids = set()
        product_id_to_qty = get_product_ids_and_quantities(basket)
        lines_suppliers = get_lines_suppliers(basket)

        # Get ProductsInBasketCondition's that can't match with the basket
        products_in_basket_conditions_to_check = set(
            ProductsInBasketCondition.objects.filter(
                products__id__in=product_id_to_qty.keys()
            ).values_list("id", flat=True)
        )
        exclude_condition_ids |= set(
            ProductsInBasketCondition.objects.exclude(
                id__in=products_in_basket_conditions_to_check
            ).values_list("id", flat=True)
        )

        # Get CategoryProductsBasketCondition's that can't match with the basket
        categories = set(Category.objects.filter(
            shop_products__product_id__in=product_id_to_qty.keys()).values_list("id", flat=True))
        category_products_in_basket_to_check = set(
            CategoryProductsBasketCondition.objects.filter(categories__in=categories).values_list("id", flat=True)
        )
        exclude_condition_ids |= set(
            CategoryProductsBasketCondition.objects.exclude(
                id__in=category_products_in_basket_to_check
            ).values_list("id", flat=True)
        )

        queryset = cls.objects.filter(active=True, shop=basket.shop)

        if exclude_condition_ids:
            queryset = queryset.exclude(conditions__id__in=exclude_condition_ids)

        # exclude the campaigns that have supplier set and are not included the supplier list
        if lines_suppliers:
            queryset = queryset.filter(
                Q(supplier__isnull=True) | Q(supplier__in=lines_suppliers)
            )

        for campaign in queryset.prefetch_related("conditions").distinct():
            if campaign.rules_match(basket, lines):
                matching.append(campaign)

        return matching
Exemple #9
0
    def get_matching(cls, basket, lines):
        matching = []
        exclude_condition_ids = set()
        product_id_to_qty = get_product_ids_and_quantities(basket)

        # Get ProductsInBasketCondition's that can't match with the basket
        products_in_basket_conditions_to_check = set(
            ProductsInBasketCondition.objects.filter(
                products__id__in=product_id_to_qty.keys()
            ).values_list("id", flat=True)
        )
        exclude_condition_ids |= set(
            ProductsInBasketCondition.objects.exclude(
                id__in=products_in_basket_conditions_to_check
            ).values_list("id", flat=True)
        )

        # Get CategoryProductsBasketCondition's that can't match with the basket
        categories = set(Category.objects.filter(
            shop_products__product_id__in=product_id_to_qty.keys()).values_list("id", flat=True))
        category_products_in_basket_to_check = set(
            CategoryProductsBasketCondition.objects.filter(categories__in=categories).values_list("id", flat=True)
        )
        exclude_condition_ids |= set(
            CategoryProductsBasketCondition.objects.exclude(
                id__in=category_products_in_basket_to_check
            ).values_list("id", flat=True)
        )

        queryset = cls.objects.filter(active=True, shop=basket.shop)
        if exclude_condition_ids:
            queryset = queryset.exclude(conditions__id__in=exclude_condition_ids)
        for campaign in queryset.prefetch_related("conditions"):
            if campaign.rules_match(basket, lines):
                matching.append(campaign)
        return matching
Exemple #10
0
    def get_matching(cls, basket, lines):
        matching = []
        exclude_condition_ids = set()
        product_id_to_qty = get_product_ids_and_quantities(basket)

        # Get ProductsInBasketCondition's that can't match with the basket
        products_in_basket_conditions_to_check = set(
            ProductsInBasketCondition.objects.filter(
                products__id__in=product_id_to_qty.keys()
            ).values_list("id", flat=True)
        )
        exclude_condition_ids |= set(
            ProductsInBasketCondition.objects.exclude(
                id__in=products_in_basket_conditions_to_check
            ).values_list("id", flat=True)
        )

        # Get CategoryProductsBasketCondition's that can't match with the basket
        category_products_in_basket_to_check = set(
            CategoryProductsBasketCondition.objects.filter(
                category__shop_products__product_id__in=product_id_to_qty.keys()
            ).values_list("id", flat=True)
        )
        exclude_condition_ids |= set(
            CategoryProductsBasketCondition.objects.exclude(
                id__in=category_products_in_basket_to_check
            ).values_list("id", flat=True)
        )

        queryset = cls.objects.filter(active=True, shop=basket.shop)
        if exclude_condition_ids:
            queryset = queryset.exclude(conditions__id__in=exclude_condition_ids)
        for campaign in queryset.prefetch_related("conditions"):
            if campaign.rules_match(basket, lines):
                matching.append(campaign)
        return matching