Features: 1) Add populate_index function for Elasticsearch indexing and integrate it into update_products; 2) Enhance CategoryViewSet queryset with prefetching of "parent" and "children";
Fixes: 1) Refine logic in vendor category and brand handling to correctly handle multiple active/inactive entries; Extra: 1) Add missing import for `registry` in Elasticsearch module; 2) Minor cleanup and spacing adjustments in Elasticsearch and vendor modules.
This commit is contained in:
parent
c9d2881f99
commit
ae17cc1371
4 changed files with 17 additions and 3 deletions
|
|
@ -3,6 +3,7 @@ from django.http import Http404
|
||||||
from django.utils.text import slugify
|
from django.utils.text import slugify
|
||||||
from django.utils.translation import gettext_lazy as _
|
from django.utils.translation import gettext_lazy as _
|
||||||
from django_elasticsearch_dsl import fields
|
from django_elasticsearch_dsl import fields
|
||||||
|
from django_elasticsearch_dsl.registries import registry
|
||||||
from elasticsearch import NotFoundError
|
from elasticsearch import NotFoundError
|
||||||
from elasticsearch.dsl import Q, Search
|
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))
|
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)
|
||||||
|
|
|
||||||
|
|
@ -11,6 +11,7 @@ from celery.utils.log import get_task_logger
|
||||||
from constance import config
|
from constance import config
|
||||||
from django.core.cache import cache
|
from django.core.cache import cache
|
||||||
|
|
||||||
|
from core.elasticsearch import populate_index
|
||||||
from core.models import Product, Promotion
|
from core.models import Product, Promotion
|
||||||
from core.utils.caching import set_default_cache
|
from core.utils.caching import set_default_cache
|
||||||
from core.vendors import delete_stale
|
from core.vendors import delete_stale
|
||||||
|
|
@ -38,6 +39,7 @@ def update_products_task():
|
||||||
|
|
||||||
if not update_products_task_running:
|
if not update_products_task_running:
|
||||||
cache.set("update_products_task_running", True, 86400)
|
cache.set("update_products_task_running", True, 86400)
|
||||||
|
populate_index()
|
||||||
vendors_classes = []
|
vendors_classes = []
|
||||||
|
|
||||||
for vendor_class in 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}")
|
logger.warning(f"Skipping {vendor_class} due to error: {e!s}")
|
||||||
|
|
||||||
delete_stale()
|
delete_stale()
|
||||||
|
populate_index()
|
||||||
|
|
||||||
cache.delete("update_products_task_running")
|
cache.delete("update_products_task_running")
|
||||||
|
|
||||||
|
|
|
||||||
8
core/vendors/__init__.py
vendored
8
core/vendors/__init__.py
vendored
|
|
@ -114,8 +114,10 @@ class AbstractVendor:
|
||||||
categories = Category.objects.filter(name=category_name)
|
categories = Category.objects.filter(name=category_name)
|
||||||
if not categories.exists():
|
if not categories.exists():
|
||||||
return Category.objects.create(name=category_name, is_active=False)
|
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)
|
categories = categories.filter(is_active=True)
|
||||||
|
elif categories.filter(is_active=False).count() > 1:
|
||||||
|
categories = categories.filter(is_active=False)
|
||||||
chosen = categories.first()
|
chosen = categories.first()
|
||||||
categories.exclude(uuid=chosen.uuid)
|
categories.exclude(uuid=chosen.uuid)
|
||||||
categories.delete()
|
categories.delete()
|
||||||
|
|
@ -137,8 +139,10 @@ class AbstractVendor:
|
||||||
brands = Brand.objects.filter(name=brand_name)
|
brands = Brand.objects.filter(name=brand_name)
|
||||||
if not brands.exists():
|
if not brands.exists():
|
||||||
return Brand.objects.create(name=brand_name, is_active=False)
|
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)
|
brands = brands.filter(is_active=True)
|
||||||
|
elif brands.filter(is_active=False).count() > 1:
|
||||||
|
brands = brands.filter(is_active=False)
|
||||||
chosen = brands.first()
|
chosen = brands.first()
|
||||||
brands.exclude(uuid=chosen.uuid)
|
brands.exclude(uuid=chosen.uuid)
|
||||||
brands.delete()
|
brands.delete()
|
||||||
|
|
|
||||||
|
|
@ -127,7 +127,7 @@ class AttributeValueViewSet(EvibesViewSet):
|
||||||
|
|
||||||
@extend_schema_view(**CATEGORY_SCHEMA)
|
@extend_schema_view(**CATEGORY_SCHEMA)
|
||||||
class CategoryViewSet(EvibesViewSet):
|
class CategoryViewSet(EvibesViewSet):
|
||||||
queryset = Category.objects.all().prefetch_related()
|
queryset = Category.objects.all().prefetch_related("parent", "children")
|
||||||
filter_backends = [DjangoFilterBackend]
|
filter_backends = [DjangoFilterBackend]
|
||||||
filterset_class = CategoryFilter
|
filterset_class = CategoryFilter
|
||||||
serializer_class = CategoryDetailSerializer
|
serializer_class = CategoryDetailSerializer
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue