def test_provides(): shop = get_default_shop() product = create_product("test", shop, default_price=20) shop_product = product.get_shop_instance(shop) with override_provides("campaign_catalog_filter", [__name__ + ":UltraFilter"]): uf = UltraFilter.objects.create() uf.products.add(product) assert get_matching_for_product(shop_product, provide_category="campaign_catalog_filter") assert not get_matching_for_product(shop_product, provide_category="test_test_test")
def get_for_product(cls, shop_product): matching_filters = get_matching_for_product( shop_product, provide_category="campaign_catalog_filter") matching_conditions = get_matching_for_product( shop_product, provide_category="campaign_context_condition") query_filter = Q( Q(filters__in=matching_filters) | Q(conditions__in=matching_conditions)) return cls.objects.available( shop=shop_product.shop).filter(query_filter).distinct()
def get_for_product(cls, shop_product): matching_conditions = get_matching_for_product( shop_product, provide_category="campaign_basket_condition") matching_effects = get_matching_for_product( shop_product, provide_category="campaign_basket_discount_effect_form") matching_line_effects = get_matching_for_product( shop_product, provide_category="campaign_basket_line_effect_form") effects_q = Q(Q(line_effects__id__in=matching_line_effects) | Q(discount_effects__id__in=matching_effects)) matching_q = Q(Q(conditions__in=matching_conditions) | effects_q) return cls.objects.available(shop=shop_product.shop).filter(matching_q).distinct()
def update_filter_cache(sender, instance, **kwargs): invalidate_context_filter_cache(sender, instance=instance, **kwargs) if isinstance(instance, CatalogFilter): update_matching_catalog_filters(instance) elif isinstance(instance, ShopProduct): for filter_id in get_matching_for_product(instance, provide_category="campaign_catalog_filter"): filter = CatalogFilter.objects.get(pk=filter_id) update_matching_catalog_filters(filter) elif isinstance(instance, Category): for shop_product in instance.shop_products.all(): for filter_id in get_matching_for_product(shop_product, provide_category="campaign_catalog_filter"): filter = CatalogFilter.objects.get(pk=filter_id) update_matching_catalog_filters(filter)
def update_matching_catalog_filters(shop_product_or_filter): if isinstance(shop_product_or_filter, CatalogFilter): CatalogFilterCachedShopProduct.objects.filter( filter=shop_product_or_filter).delete() for matching_product in shop_product_or_filter.get_matching_shop_products( ): CatalogFilterCachedShopProduct.objects.create( filter=shop_product_or_filter, shop_product=matching_product) context_cache.bump_cache_for_shop_product(matching_product) return shop_product = shop_product_or_filter from shuup.campaigns.utils.matcher import get_matching_for_product q = _get_filter_query(shop_product) all_shop_products = [shop_product] + list(ShopProduct.objects.filter(q)) all_ids = [sp.pk for sp in all_shop_products] ids = get_matching_for_product( shop_product_or_filter, provide_category="campaign_catalog_filter", skippable_classes=[ CatalogFilter ] # these will be handled separately in update_matching_category_filters ) CatalogFilterCachedShopProduct.objects.filter( filter__id__in=ids, shop_product__id__in=all_ids).delete() for filter in CatalogFilter.objects.filter(id__in=ids): for sp in all_shop_products: if filter.matches(sp): CatalogFilterCachedShopProduct.objects.create(filter=filter, shop_product=sp) context_cache.bump_cache_for_shop_product(sp)
def update_matching_catalog_filters(shop_product_or_filter): if isinstance(shop_product_or_filter, CatalogFilter): CatalogFilterCachedShopProduct.objects.filter(filter=shop_product_or_filter).delete() for matching_product in shop_product_or_filter.get_matching_shop_products(): CatalogFilterCachedShopProduct.objects.create(filter=shop_product_or_filter, shop_product=matching_product) context_cache.bump_cache_for_shop_product(matching_product) return shop_product = shop_product_or_filter from shuup.campaigns.utils.matcher import get_matching_for_product q = _get_filter_query(shop_product) all_shop_products = [shop_product] + list(ShopProduct.objects.filter(q)) all_ids = [sp.pk for sp in all_shop_products] ids = get_matching_for_product( shop_product_or_filter, provide_category="campaign_catalog_filter", skippable_classes=[CatalogFilter] # these will be handled separately in update_matching_category_filters ) CatalogFilterCachedShopProduct.objects.filter(filter__id__in=ids, shop_product__id__in=all_ids).delete() for filter in CatalogFilter.objects.filter(id__in=ids): for sp in all_shop_products: if filter.matches(sp): CatalogFilterCachedShopProduct.objects.create(filter=filter, shop_product=sp) context_cache.bump_cache_for_shop_product(sp)
def get_for_product(cls, shop_product): matching_filters = get_matching_for_product(shop_product, provide_category="campaign_catalog_filter") matching_conditions = get_matching_for_product(shop_product, provide_category="campaign_context_condition") query_filter = Q(Q(filters__in=matching_filters) | Q(conditions__in=matching_conditions)) return cls.objects.available(shop=shop_product.shop).filter(query_filter).distinct()