示例#1
0
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")
示例#2
0
 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()
示例#3
0
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")
示例#4
0
 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()
示例#5
0
 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()
示例#6
0
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)
示例#7
0
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)
示例#8
0
文件: matching.py 项目: ruqaiya/shuup
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)
示例#9
0
 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()