diff --git a/core/elasticsearch/__init__.py b/core/elasticsearch/__init__.py index a99190db..ee281d00 100644 --- a/core/elasticsearch/__init__.py +++ b/core/elasticsearch/__init__.py @@ -3,6 +3,7 @@ from django.http import Http404 from django.utils.text import slugify from django.utils.translation import gettext_lazy as _ from django_elasticsearch_dsl import fields +from django_elasticsearch_dsl.registries import registry from elasticsearch import NotFoundError from elasticsearch.dsl import Q, Search @@ -184,3 +185,9 @@ def _add_multilang_fields(cls): ), ) setattr(cls, f"prepare_{desc_field}", make_prepare(desc_field)) + + +def populate_index(): + for doc in registry.get_documents(set(registry.get_models())): + qs = doc().get_indexing_queryset() + doc().update(qs, parallel=True, refresh=True) diff --git a/core/tasks.py b/core/tasks.py index 03691f3d..90f0b808 100644 --- a/core/tasks.py +++ b/core/tasks.py @@ -11,6 +11,7 @@ from celery.utils.log import get_task_logger from constance import config from django.core.cache import cache +from core.elasticsearch import populate_index from core.models import Product, Promotion from core.utils.caching import set_default_cache from core.vendors import delete_stale @@ -38,6 +39,7 @@ def update_products_task(): if not update_products_task_running: cache.set("update_products_task_running", True, 86400) + populate_index() vendors_classes = [] for vendor_class in vendors_classes: @@ -48,6 +50,7 @@ def update_products_task(): logger.warning(f"Skipping {vendor_class} due to error: {e!s}") delete_stale() + populate_index() cache.delete("update_products_task_running") diff --git a/core/vendors/__init__.py b/core/vendors/__init__.py index 86abaf54..63188494 100644 --- a/core/vendors/__init__.py +++ b/core/vendors/__init__.py @@ -114,8 +114,10 @@ class AbstractVendor: categories = Category.objects.filter(name=category_name) if not categories.exists(): return Category.objects.create(name=category_name, is_active=False) - elif categories.count() > 1: + elif categories.filter(is_active=True).count() > 1: categories = categories.filter(is_active=True) + elif categories.filter(is_active=False).count() > 1: + categories = categories.filter(is_active=False) chosen = categories.first() categories.exclude(uuid=chosen.uuid) categories.delete() @@ -137,8 +139,10 @@ class AbstractVendor: brands = Brand.objects.filter(name=brand_name) if not brands.exists(): return Brand.objects.create(name=brand_name, is_active=False) - elif brands.count() > 1: + elif brands.filter(is_active=True).count() > 1: brands = brands.filter(is_active=True) + elif brands.filter(is_active=False).count() > 1: + brands = brands.filter(is_active=False) chosen = brands.first() brands.exclude(uuid=chosen.uuid) brands.delete() diff --git a/core/viewsets.py b/core/viewsets.py index cad40b64..567a9a2a 100644 --- a/core/viewsets.py +++ b/core/viewsets.py @@ -127,7 +127,7 @@ class AttributeValueViewSet(EvibesViewSet): @extend_schema_view(**CATEGORY_SCHEMA) class CategoryViewSet(EvibesViewSet): - queryset = Category.objects.all().prefetch_related() + queryset = Category.objects.all().prefetch_related("parent", "children") filter_backends = [DjangoFilterBackend] filterset_class = CategoryFilter serializer_class = CategoryDetailSerializer