From 9be0971fb82b7464ef51ba6fd06c2ff2d544f651 Mon Sep 17 00:00:00 2001 From: Sam Date: Tue, 9 Feb 2021 13:07:56 +0000 Subject: [PATCH] implemented basic filter creation during product search --- products/serializers.py | 11 +++++++++-- products/tests.py | 4 ++-- products/utils.py | 9 +++++++++ products/views.py | 10 ++++++---- 4 files changed, 26 insertions(+), 8 deletions(-) create mode 100644 products/utils.py diff --git a/products/serializers.py b/products/serializers.py index e7d2fcf..c20e5b7 100644 --- a/products/serializers.py +++ b/products/serializers.py @@ -2,8 +2,7 @@ from rest_framework import serializers from products.models import Product -from utils.tag_serializers import TagListSerializerField, TaggitSerializer, SingleTagSerializerField - +from utils.tag_serializers import TagListSerializerField, TaggitSerializer, SingleTagSerializerField, SingleTag, TagList class ProductSerializer(TaggitSerializer, serializers.ModelSerializer): @@ -14,3 +13,11 @@ class ProductSerializer(TaggitSerializer, serializers.ModelSerializer): class Meta: model = Product exclude = ['created', 'updated', 'creator'] + + +class TagFilterSerializer(TaggitSerializer, serializers.ModelSerializer): + tags = TagListSerializerField(required=False) + + class Meta: + model = TagList + fields = '__all__' diff --git a/products/tests.py b/products/tests.py index 0b39a8c..3189596 100644 --- a/products/tests.py +++ b/products/tests.py @@ -390,11 +390,11 @@ class ProductSearchTest(TestCase): url = f"{self.endpoint}?query_string={query_string}" # send in request response = self.client.get(url) - # import ipdb; ipdb.set_trace() + import ipdb; ipdb.set_trace() # check re sponse self.assertEqual(response.status_code, 200) # check for object creation - self.assertEquals(len(response.data), len(expected_instances)) + self.assertEquals(len(response.data['products']), len(expected_instances)) class MyProductsViewTest(APITestCase): diff --git a/products/utils.py b/products/utils.py new file mode 100644 index 0000000..3f5eeb1 --- /dev/null +++ b/products/utils.py @@ -0,0 +1,9 @@ + +def extract_search_filters(result_set): + filters = set() + + for item in result_set: + tags = item.tags.all() + for tag in tags: + filters.add(tag.name) + return list(filters) diff --git a/products/views.py b/products/views.py index 9a3898c..a318bcb 100644 --- a/products/views.py +++ b/products/views.py @@ -17,12 +17,13 @@ from rest_framework.decorators import api_view, permission_classes import requests from products.models import Product -from products.serializers import ProductSerializer +from products.serializers import ProductSerializer, TagFilterSerializer from companies.models import Company from history.models import HistorySync from back_latienda.permissions import IsCreator - +from .utils import extract_search_filters +from utils.tag_serializers import TaggitSerializer logging.basicConfig( filename='logs/product-load.log', @@ -142,7 +143,6 @@ def product_search(request): result_set = set() # split query string into single words chunks = query_string.split(' ') - # import ipdb; ipdb.set_trace() for chunk in chunks: # search inside name and description @@ -162,8 +162,10 @@ def product_search(request): products = Product.objects.filter(attributes=chunk) for item in products: result_set.add(item) + # extract filters from result_set + filters = extract_search_filters(result_set) # serialize and respond product_serializer = ProductSerializer(result_set, many=True) - return Response(data=product_serializer.data) + return Response(data={"filters": filters, "products": product_serializer.data}) except Exception as e: return Response({"errors": {"details": str(type(e))}})