diff --git a/core/managers.py b/core/managers.py index 3ee4b579..45f5385f 100644 --- a/core/managers.py +++ b/core/managers.py @@ -62,3 +62,19 @@ class AddressManager(models.Manager): user=kwargs.pop("user"), defaults={"api_response": data, "location": location}, )[0] + + +class ProductManager(models.Manager): + def available(self): + return self.filter( + is_active=True, brand__is_active=True, category__is_active=True, stocks__vendor__is_active=True + ) + + def available_in_stock(self): + return self.filter( + is_active=True, + brand__is_active=True, + category__is_active=True, + stocks__vendor__is_active=True, + stocks__quantity__gt=0, + ) diff --git a/core/models.py b/core/models.py index 0d3c5384..4c5a2f97 100644 --- a/core/models.py +++ b/core/models.py @@ -49,7 +49,7 @@ from mptt.models import MPTTModel from core.abstract import NiceModel from core.choices import ORDER_PRODUCT_STATUS_CHOICES, ORDER_STATUS_CHOICES from core.errors import DisabledCommerceError, NotEnoughMoneyError -from core.managers import AddressManager +from core.managers import AddressManager, ProductManager from core.utils import ( generate_human_readable_id, get_product_uuid_as_path, @@ -681,6 +681,8 @@ class Product(ExportModelOperationsMixin("product"), NiceModel): # type: ignore verbose_name=_("Slug"), ) + objects: ProductManager = ProductManager() + class Meta: verbose_name = _("product") verbose_name_plural = _("products") diff --git a/core/viewsets.py b/core/viewsets.py index d213b516..9bbc720a 100644 --- a/core/viewsets.py +++ b/core/viewsets.py @@ -540,12 +540,7 @@ class ProductViewSet(EvibesViewSet): qs = super().get_queryset() if self.request.user.has_perm("core.view_product"): return qs - return qs.filter( - is_active=True, - brand__is_active=True, - category__is_active=True, - stocks__vendor__is_active=True, - ) + return qs.available() def get_object(self): queryset = self.filter_queryset(self.get_queryset())