From e94e0c2dd582233e336c28ce7f446fc8640b33d4 Mon Sep 17 00:00:00 2001 From: Sam Date: Tue, 23 Feb 2021 12:55:02 +0000 Subject: [PATCH] added search filter by min and max price --- products/tests.py | 48 +++++++++++++++++++++++++++++++++++++++++++++++ products/utils.py | 12 +++++++++--- products/views.py | 4 +++- 3 files changed, 60 insertions(+), 4 deletions(-) diff --git a/products/tests.py b/products/tests.py index 92a95a3..d32e1f6 100644 --- a/products/tests.py +++ b/products/tests.py @@ -680,6 +680,54 @@ class ProductSearchTest(TestCase): payload = response.json() self.assertEquals(len(payload['products']), len(expected_instances)) + def test_anon_user_can_filter_by_min_price(self): + expected_instances = [ + self.factory(tags="colores/rojos, tono/brillante", price=100.00), + self.factory(tags="lunares/azules", description="zapatos rojos", price=12.00), + self.factory(attributes='"zapatos de campo", tono/oscuro', price=9.00), + ] + unexpected_instances = [ + self.factory(description="zapatos", price=4.00), + self.factory(tags="lunares/rojos", category='zapatos', description="zapatos verdes", price=None), + ] + price_min = 5.00 + query_string = quote("zapatos rojos") + url = f"{self.endpoint}?query_string={query_string}&price_min={price_min}" + # send in request + response = self.client.get(url) + + # check response + self.assertEqual(response.status_code, 200) + # load response data + payload = response.json() + self.assertEquals(len(payload['products']), len(expected_instances)) + for product in payload['products']: + self.assertTrue(float(product['price']) >= price_min) + + def test_anon_user_can_filter_by_max_price(self): + expected_instances = [ + self.factory(tags="colores/rojos, tono/brillante", price=10.00), + self.factory(tags="lunares/azules", description="zapatos rojos", price=12.00), + self.factory(attributes='"zapatos de campo", tono/oscuro', price=49.00), + ] + unexpected_instances = [ + self.factory(description="zapatos", price=60.00), + self.factory(tags="lunares/rojos", category='zapatos', description="zapatos verdes", price=100.00), + ] + price_max = 50.00 + query_string = quote("zapatos rojos") + url = f"{self.endpoint}?query_string={query_string}&price_max={price_max}" + # send in request + response = self.client.get(url) + + # check response + self.assertEqual(response.status_code, 200) + # load response data + payload = response.json() + self.assertEquals(len(payload['products']), len(expected_instances)) + for product in payload['products']: + self.assertTrue(float(product['price']) <= price_max) + class MyProductsViewTest(APITestCase): """my_products tests diff --git a/products/utils.py b/products/utils.py index a294df2..a647c6c 100644 --- a/products/utils.py +++ b/products/utils.py @@ -125,7 +125,7 @@ def find_related_products_v3(keyword): return set(products_qs) -def find_related_products_v6(keyword, shipping_cost=None, discount=None, category=None, tags=None): +def find_related_products_v6(keyword, shipping_cost=None, discount=None, category=None, tags=None, price_min=None,price_max=None): """ Ranked product search @@ -151,7 +151,7 @@ def find_related_products_v6(keyword, shipping_cost=None, discount=None, categor if tags is not None: products_qs = products_qs.filter(tags=tags) - # filter for shipping cost + # filter by shipping cost if shipping_cost is True: # only instances with shipping costs products_qs = products_qs.filter( @@ -162,7 +162,7 @@ def find_related_products_v6(keyword, shipping_cost=None, discount=None, categor # only intances without shpping costs products_qs = products_qs.filter(Q(shipping_cost=None)|Q(shipping_cost=0.00)) - # filter for discount + # filter by discount if discount is True: # only instances with shipping costs products_qs = products_qs.filter( @@ -173,6 +173,12 @@ def find_related_products_v6(keyword, shipping_cost=None, discount=None, categor # only intances without shpping costs products_qs = products_qs.filter(Q(discount=None)|Q(discount=0.00)) + # filter by price + if price_min is not None: + products_qs = products_qs.filter(price__gt=price_min) + if price_max is not None: + products_qs = products_qs.filter(price__lt=price_max) + return set(products_qs) diff --git a/products/views.py b/products/views.py index d23416b..fd69c1b 100644 --- a/products/views.py +++ b/products/views.py @@ -177,6 +177,8 @@ def product_search(request): discount = None category = request.GET.get('category', None) tags = request.GET.get('tags', None) + price_min = request.GET.get('price_min', None) + price_max = request.GET.get('price_max', None) if query_string is None: return Response({"errors": {"details": "No query string to parse"}}) @@ -193,7 +195,7 @@ def product_search(request): # split query string into single words chunks = query_string.split(' ') for chunk in chunks: - product_set = find_related_products_v6(chunk, shipping_cost, discount, category, tags) + product_set = find_related_products_v6(chunk, shipping_cost, discount, category, tags, price_min, price_max) # add to result set result_set.update(product_set) # TODO: add search for entire phrase ???