From c9a4513dd8deb2fbf1c665487e34b8cfa57cfce7 Mon Sep 17 00:00:00 2001 From: Sam Date: Thu, 18 Feb 2021 10:52:50 +0000 Subject: [PATCH] encapsulated search functionality --- products/utils.py | 23 +++++++++++++++++++++++ products/views.py | 17 ++--------------- 2 files changed, 25 insertions(+), 15 deletions(-) diff --git a/products/utils.py b/products/utils.py index 7a08a70..a3bef8a 100644 --- a/products/utils.py +++ b/products/utils.py @@ -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 diff --git a/products/views.py b/products/views.py index 61a332e..685e748 100644 --- a/products/views.py +++ b/products/views.py @@ -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)