diff --git a/products/tests.py b/products/tests.py index 21d12c1..58f201e 100644 --- a/products/tests.py +++ b/products/tests.py @@ -488,9 +488,6 @@ class ProductSearchTest(TestCase): payload = response.json() # check for object creation self.assertEquals(len(payload['products']), len(expected_instances)) - # check ids - for i in range(len(payload['products'])): - self.assertTrue(payload['products'][i]['id'] == expected_instances[i].id) # check results ordered by rank current = 1 for i in range(len(payload['products'])): @@ -576,6 +573,54 @@ class ProductSearchTest(TestCase): payload = response.json() self.assertEquals(len(payload['products']), 2) + def test_anon_user_can_filter_discount_true(self): + expected_instances = [ + self.factory(tags="lunares/rojos", category='zapatos', description="zapatos verdes", discount=None), + self.factory(tags="colores/rojos, tono/brillante", discount=100.00), + self.factory(tags="lunares/azules", description="zapatos rojos", discount=12.00), + self.factory(tags="lunares/rojos", description="zapatos", discount=0.00), + self.factory(attributes='"zapatos de campo", tono/oscuro', discount=9.00), + ] + unexpected_instances = [ + self.factory(description="chanclas"), + self.factory(tags="azules"), + ] + + query_string = quote("zapatos rojos") + # discount=true + url = f"{self.endpoint}?query_string={query_string}&discount=true" + # 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']), 3) + + def test_anon_user_can_filter_discount_false(self): + expected_instances = [ + self.factory(tags="lunares/rojos", category='zapatos', description="zapatos verdes", discount=None), + self.factory(tags="colores/rojos, tono/brillante", discount=100.00), + self.factory(tags="lunares/azules", description="zapatos rojos", discount=12.00), + self.factory(tags="lunares/rojos", description="zapatos", discount=0.00), + self.factory(attributes='"zapatos de campo", tono/oscuro', discount=9.00), + ] + unexpected_instances = [ + self.factory(description="chanclas"), + self.factory(tags="azules"), + ] + + query_string = quote("zapatos rojos") + # discount=true + url = f"{self.endpoint}?query_string={query_string}&discount=false" + # 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']), 2) + class MyProductsViewTest(APITestCase): """my_products tests diff --git a/products/utils.py b/products/utils.py index 09758f9..3511021 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): +def find_related_products_v6(keyword, shipping_cost=None, discount=None): """ Ranked product search @@ -143,6 +143,7 @@ def find_related_products_v6(keyword, shipping_cost=None): rank=SearchRank(vector, query) ).filter(rank__gt=0.05) # removed order_by because its lost in casting + # filter for shipping cost if shipping_cost is True: # only instances with shipping costs products_qs = products_qs.filter( @@ -153,6 +154,17 @@ def find_related_products_v6(keyword, shipping_cost=None): # only intances without shpping costs products_qs = products_qs.filter(Q(shipping_cost=None)|Q(shipping_cost=0.00)) + # filter for discount + if discount is True: + # only instances with shipping costs + products_qs = products_qs.filter( + Q(discount__isnull=False)& + Q(discount__gte=1) + ) + elif discount is False: + # only intances without shpping costs + products_qs = products_qs.filter(Q(discount=None)|Q(discount=0.00)) + return set(products_qs) diff --git a/products/views.py b/products/views.py index 8e98fd7..8270cec 100644 --- a/products/views.py +++ b/products/views.py @@ -163,6 +163,15 @@ def product_search(request): shipping_cost = False else: shipping_cost = None + discount = request.GET.get('discount', None) + if discount is not None: + if discount == 'true': + discount = True + elif discount == 'false': + discount = False + else: + discount = None + if query_string is None: return Response({"errors": {"details": "No query string to parse"}}) elif query_string is '': @@ -175,7 +184,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) + product_set = find_related_products_v6(chunk, shipping_cost, discount) # add to result set result_set.update(product_set) # TODO: add search for entire phrase ???