encapsulated search functionality

This commit is contained in:
Sam
2021-02-18 10:52:50 +00:00
parent 8c9fbfd77a
commit c9a4513dd8
2 changed files with 25 additions and 15 deletions

View File

@@ -1,5 +1,10 @@
import logging
from django.db.models import Q
from products.models import Product
def extract_search_filters(result_set):
"""
@@ -49,3 +54,21 @@ def extract_search_filters(result_set):
except Exception as e:
logging.error(f'Extacting filters for {item}')
return filter_dict
def find_related_products(keyword):
# search in tags
tags = Product.tags.tag_model.objects.filter(name__icontains=keyword)
# search in category
categories = Product.category.tag_model.objects.filter(name__icontains=keyword)
# search in attributes
attributes = Product.attributes.tag_model.objects.filter(name__icontains=keyword)
# unified tag search
products_qs = Product.objects.filter(
Q(name__icontains=keyword)|
Q(description__icontains=keyword)|
Q(tags__in=tags)|
Q(category__in=categories)|
Q(attributes__in=attributes)
)
return products_qs

View File

@@ -23,7 +23,7 @@ from companies.models import Company
from history.models import HistorySync
from back_latienda.permissions import IsCreator
from .utils import extract_search_filters
from .utils import extract_search_filters, find_related_products
from utils.tag_serializers import TaggitSerializer
from utils.tag_filters import ProductTagFilter
@@ -155,20 +155,7 @@ def product_search(request):
chunks = query_string.split(' ')
for chunk in chunks:
# search in tags
tags = Product.tags.tag_model.objects.filter(name__icontains=chunk)
# search in category
categories = Product.category.tag_model.objects.filter(name__icontains=chunk)
# search in attributes
attributes = Product.attributes.tag_model.objects.filter(name__icontains=chunk)
# unified tag search
products_qs = Product.objects.filter(
Q(name__icontains=chunk)|
Q(description__icontains=chunk)|
Q(tags__in=tags)|
Q(category__in=categories)|
Q(attributes__in=attributes)
)
products_qs = find_related_products(chunk)
for instance in products_qs:
result_set.add(instance)