Ejemplo n.º 1
0
    def update_stock(self, product_id):
        """
        Supplier module update stock should always bump product
        cache and send `shuup.core.signals.stocks_updated` signal.
        """
        supplier_id = self.supplier.pk
        sv, _ = StockCount.objects.get_or_create(supplier_id=supplier_id, product_id=product_id)
        if not sv.stock_managed:
            # item doesn't manage stocks
            return

        # TODO: Consider whether this should be done without a cache table
        values = get_current_stock_value(supplier_id=supplier_id, product_id=product_id)
        sv.logical_count = values["logical_count"]
        sv.physical_count = values["physical_count"]
        latest_event = (
            StockAdjustment.objects
            .filter(supplier=supplier_id, product=product_id, type=StockAdjustmentType.INVENTORY)
            .last())
        if latest_event:
            sv.stock_value_value = latest_event.purchase_price_value * sv.logical_count

        if self.supplier.stock_managed and has_installed("shuup.notify"):
            if sv.alert_limit and sv.physical_count < sv.alert_limit:
                product = Product.objects.filter(id=product_id).first()
                if product:
                    from .notify_events import AlertLimitReached
                    for shop in self.supplier.shops.all():
                        AlertLimitReached(supplier=self.supplier, product=product).run(shop=shop)

        sv.save(update_fields=("logical_count", "physical_count", "stock_value_value"))
        context_cache.bump_cache_for_product(Product.objects.get(id=product_id))
        stocks_updated.send(
            type(self), shops=self.supplier.shops.all(), product_ids=[product_id], supplier=self.supplier)
Ejemplo n.º 2
0
    def update_stock(self, product_id):
        supplier_id = self.supplier.pk
        # TODO: Consider whether this should be done without a cache table
        values = get_current_stock_value(supplier_id=supplier_id,
                                         product_id=product_id)
        sv, _ = StockCount.objects.get_or_create(supplier_id=supplier_id,
                                                 product_id=product_id)
        sv.logical_count = values["logical_count"]
        sv.physical_count = values["physical_count"]
        latest_event = (StockAdjustment.objects.filter(
            supplier=supplier_id,
            product=product_id,
            type=StockAdjustmentType.INVENTORY).last())
        if latest_event:
            sv.stock_value_value = latest_event.purchase_price_value * sv.logical_count

        if "shuup.notify" in settings.INSTALLED_APPS:
            if sv.alert_limit and sv.physical_count < sv.alert_limit:
                product = Product.objects.filter(id=product_id).first()
                if product and product.stock_behavior == StockBehavior.STOCKED:
                    from .notify_events import AlertLimitReached
                    for shop in self.supplier.shops.all():
                        AlertLimitReached(supplier=self.supplier,
                                          product=product).run(shop=shop)

        sv.save(update_fields=("logical_count", "physical_count",
                               "stock_value_value"))
        context_cache.bump_cache_for_product(
            Product.objects.get(id=product_id))
Ejemplo n.º 3
0
    def update_stock(self, product_id, *args, **kwargs):
        """
        Supplier module update stock should always bump product
        cache and send `shuup.core.signals.stocks_updated` signal.
        """
        supplier_id = self.supplier.pk
        sv, _ = StockCount.objects.select_related("product").get_or_create(
            supplier_id=supplier_id, product_id=product_id)

        # kind not supported
        if sv.product.kind not in self.get_supported_product_kinds_values():
            return

        # item doesn't manage stocks
        if not sv.stock_managed:
            # make sure to index products either way
            run_task("shuup.simple_supplier.tasks.index_product",
                     product=product_id,
                     supplier=self.supplier.pk)
            return

        values = get_current_stock_value(supplier_id=supplier_id,
                                         product_id=product_id)
        sv.logical_count = values["logical_count"]
        sv.physical_count = values["physical_count"]
        latest_event = StockAdjustment.objects.filter(
            supplier=supplier_id,
            product=product_id,
            type=StockAdjustmentType.INVENTORY).last()
        if latest_event:
            sv.stock_value_value = latest_event.purchase_price_value * sv.logical_count

        # TODO: get rid of this and move to shuup.notify app instead, through signals
        if self.supplier.stock_managed and has_installed("shuup.notify"):
            if sv.alert_limit and sv.physical_count < sv.alert_limit:
                product = Product.objects.filter(id=product_id).first()
                if product:
                    from .notify_events import AlertLimitReached

                    for shop in self.supplier.shops.all():
                        supplier_email = self.supplier.contact_address.email if self.supplier.contact_address else ""
                        shop_email = shop.contact_address.email if shop.contact_address else ""
                        AlertLimitReached(
                            supplier=self.supplier,
                            product=product,
                            shop_email=shop_email,
                            supplier_email=supplier_email,
                        ).run(shop=shop)

        sv.save(update_fields=("logical_count", "physical_count",
                               "stock_value_value"))
        context_cache.bump_cache_for_product(product_id)
        stocks_updated.send(type(self),
                            shops=self.supplier.shops.all(),
                            product_ids=[product_id],
                            supplier=self.supplier)
        run_task("shuup.simple_supplier.tasks.index_product",
                 product=product_id,
                 supplier=self.supplier.pk)
Ejemplo n.º 4
0
 def update_stock(self, product_id):
     supplier_id = self.supplier.pk
     # TODO: Consider whether this should be done without a cache table
     values = get_current_stock_value(supplier_id=supplier_id, product_id=product_id)
     sv, _ = StockCount.objects.get_or_create(supplier_id=supplier_id, product_id=product_id)
     sv.logical_count = values["logical_count"]
     sv.physical_count = values["physical_count"]
     latest_event = StockAdjustment.objects.filter(
         supplier=supplier_id, product=product_id).order_by("-created_on").first()
     if latest_event:
         sv.stock_value_value = latest_event.purchase_price_value * sv.logical_count
     sv.save(update_fields=("logical_count", "physical_count", "stock_value_value"))
Ejemplo n.º 5
0
 def update_stock(self, product_id):
     supplier_id = self.supplier.pk
     # TODO: Consider whether this should be done without a cache table
     values = get_current_stock_value(supplier_id=supplier_id, product_id=product_id)
     sv, _ = StockCount.objects.get_or_create(supplier_id=supplier_id, product_id=product_id)
     sv.logical_count = values["logical_count"]
     sv.physical_count = values["physical_count"]
     latest_event = StockAdjustment.objects.filter(
         supplier=supplier_id, product=product_id).order_by("-created_on").first()
     if latest_event:
         sv.stock_value_value = latest_event.purchase_price_value * sv.logical_count
     sv.save(update_fields=("logical_count", "physical_count", "stock_value_value"))
Ejemplo n.º 6
0
    def update_stock(self, product_id):
        """
        Supplier module update stock should always bump product
        cache and send `shuup.core.signals.stocks_updated` signal.
        """
        supplier_id = self.supplier.pk
        sv, _ = StockCount.objects.get_or_create(supplier_id=supplier_id, product_id=product_id)
        if not sv.stock_managed:
            # item doesn't manage stocks
            return

        # TODO: Consider whether this should be done without a cache table
        values = get_current_stock_value(supplier_id=supplier_id, product_id=product_id)
        sv.logical_count = values["logical_count"]
        sv.physical_count = values["physical_count"]
        latest_event = (
            StockAdjustment.objects
            .filter(supplier=supplier_id, product=product_id, type=StockAdjustmentType.INVENTORY)
            .last())
        if latest_event:
            sv.stock_value_value = latest_event.purchase_price_value * sv.logical_count

        if self.supplier.stock_managed and has_installed("shuup.notify"):
            if sv.alert_limit and sv.physical_count < sv.alert_limit:
                product = Product.objects.filter(id=product_id).first()
                if product:
                    from .notify_events import AlertLimitReached
                    for shop in self.supplier.shops.all():
                        supplier_email = self.supplier.contact_address.email if self.supplier.contact_address else ""
                        shop_email = shop.contact_address.email if shop.contact_address else ""
                        AlertLimitReached(
                            supplier=self.supplier,
                            product=product,
                            shop_email=shop_email,
                            supplier_email=supplier_email
                        ).run(shop=shop)

        sv.save(update_fields=("logical_count", "physical_count", "stock_value_value"))
        context_cache.bump_cache_for_product(Product.objects.get(id=product_id))
        stocks_updated.send(
            type(self), shops=self.supplier.shops.all(), product_ids=[product_id], supplier=self.supplier)
Ejemplo n.º 7
0
    def update_stock(self, product_id):
        supplier_id = self.supplier.pk
        # TODO: Consider whether this should be done without a cache table
        values = get_current_stock_value(supplier_id=supplier_id, product_id=product_id)
        sv, _ = StockCount.objects.get_or_create(supplier_id=supplier_id, product_id=product_id)
        sv.logical_count = values["logical_count"]
        sv.physical_count = values["physical_count"]
        latest_event = (
            StockAdjustment.objects
            .filter(supplier=supplier_id, product=product_id, type=StockAdjustmentType.INVENTORY)
            .last())
        if latest_event:
            sv.stock_value_value = latest_event.purchase_price_value * sv.logical_count

        if "shuup.notify" in settings.INSTALLED_APPS:
            if sv.alert_limit and sv.physical_count < sv.alert_limit:
                product = Product.objects.filter(id=product_id).first()
                if product and product.stock_behavior == StockBehavior.STOCKED:
                    from .notify_events import AlertLimitReached
                    AlertLimitReached(supplier=self.supplier, product=product).run()
        sv.save(update_fields=("logical_count", "physical_count", "stock_value_value"))