diff --git a/core/management/commands/delete_products_by_description.py b/core/management/commands/delete_products_by_description.py new file mode 100644 index 00000000..ffa66f54 --- /dev/null +++ b/core/management/commands/delete_products_by_description.py @@ -0,0 +1,35 @@ +from django.core.management.base import BaseCommand + +from core.models import AttributeValue, Product, ProductImage + + +class Command(BaseCommand): + help = "Delete Product rows with special description, in batches" + + def add_arguments(self, parser): + parser.add_argument( + "-s", + "--size", + required=False, + default=5000, + help="Chunk size to delete", + ) + + def handle(self, *args, **options): + size = options["size"] + while True: + batch_ids = list( + Product.objects.filter(description__iexact="EVIBES_DELETED_PRODUCT").values_list("pk", flat=True)[:size] + ) + if not batch_ids: + break + try: + AttributeValue.objects.filter(product_id__in=batch_ids).delete() + ProductImage.objects.filter(product_id__in=batch_ids).delete() + Product.objects.filter(pk__in=batch_ids).delete() + except Exception as e: + self.stdout.write("Couldn't delete some of the products(will retry later): %s" % str(e)) + continue + self.stdout.write(f"Deleted {len(batch_ids)} products…") + + self.stdout.write("✅ All unordered products removed.") diff --git a/core/signals.py b/core/signals.py index 2fd94ab0..8e60b6a5 100644 --- a/core/signals.py +++ b/core/signals.py @@ -86,9 +86,11 @@ def process_order_changes(instance, created, **_kwargs): break if instance.status in ["CREATED", "PAYMENT"]: - logger.debug("Processing order changes: %s\nWith orderproducts: %s", - str(instance.__dict__), - str(OrderProductSimpleSerializer(instance.order_products.all(), many=True).data)) + logger.debug( + "Processing order changes: %s\nWith orderproducts: %s", + str(instance.__dict__), + str(OrderProductSimpleSerializer(instance.order_products.all(), many=True).data), + ) if not instance.is_whole_digital: send_order_created_email.delay(instance.uuid) diff --git a/core/views.py b/core/views.py index 91705759..79505358 100644 --- a/core/views.py +++ b/core/views.py @@ -74,6 +74,7 @@ def sitemap_index(request, *args, **kwargs): response["Content-Type"] = "application/xml; charset=utf-8" return response + @cache_page(60 * 60 * 24) @vary_on_headers("Host") def sitemap_detail(request, *args, **kwargs): diff --git a/core/viewsets.py b/core/viewsets.py index e7228cf7..2db093ae 100644 --- a/core/viewsets.py +++ b/core/viewsets.py @@ -316,12 +316,11 @@ class BrandViewSet(EvibesViewSet): else: queryset = queryset.prefetch_related( Prefetch("categories", queryset=Category.objects.filter(is_active=True)) - ) + ) return queryset - @extend_schema_view(**PRODUCT_SCHEMA) class ProductViewSet(EvibesViewSet): """ @@ -363,12 +362,12 @@ class ProductViewSet(EvibesViewSet): 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__isnull=False, - stocks__vendor__is_active=True, - ) + is_active=True, + brand__is_active=True, + category__is_active=True, + stocks__isnull=False, + stocks__vendor__is_active=True, + ) def get_object(self): queryset = self.filter_queryset(self.get_queryset())