From ea8cd97baf3000b59aef7d26b408f1578d3e59e2 Mon Sep 17 00:00:00 2001 From: Sam Date: Wed, 3 Feb 2021 14:20:55 +0000 Subject: [PATCH] search function basics --- back_latienda/urls.py | 1 + products/tests.py | 34 ++++++++++++++++++++++++++++++++++ products/views.py | 39 +++++++++++++++++++++++++++++++++++++++ 3 files changed, 74 insertions(+) diff --git a/back_latienda/urls.py b/back_latienda/urls.py index 5541f26..a61f814 100644 --- a/back_latienda/urls.py +++ b/back_latienda/urls.py @@ -34,5 +34,6 @@ urlpatterns = [ path('api/v1/user/update//', core_views.UpdateUserView.as_view(), name="update-user"), path('api/v1/load_coops/', core_views.load_coop_managers, name='coop-loader'), path('api/v1/load_products/', product_views.load_coop_products, name='product-loader'), + path('api/v1/search_products/', product_views.product_search, name='product-search'), path('api/v1/', include(router.urls)), ] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT) diff --git a/products/tests.py b/products/tests.py index 85940ae..2361bfa 100644 --- a/products/tests.py +++ b/products/tests.py @@ -2,8 +2,10 @@ import random import string import json import datetime +from urllib.parse import quote from django.utils import timezone +from django.test import TestCase from rest_framework.test import APITestCase from rest_framework import status @@ -334,3 +336,35 @@ class LoadCoopProductsTestCase(APITestCase): # check for object creation self.assertEqual(0, self.model.objects.count()) + +class ProductSearchTest(TestCase): + + def setUp(self): + """Tests setup + """ + self.endpoint = '/api/v1/search_products/' + self.model = Product + self.factory = ProductFactory + # create admin user + self.admin_email = f"admin_user@mail.com" + self.password = ''.join(random.choices(string.ascii_uppercase, k = 10)) + self.admin_user = CustomUserFactory(email=self.admin_email, password=self.password, is_staff=True, is_active=True) + # create regular user + self.reg_email = f"user@mail.com" + self.user = CustomUserFactory(email=self.reg_email, is_active=True) + self.user.set_password(self.password) + self.user.save() + + def test_anon_user_can_search(self): + query_string = quote("zapatos rojos") + + url = f"{self.endpoint}?query_string={query_string}" + # send in request + response = self.client.get(url) + import ipdb; ipdb.set_trace() + + # check re sponse + self.assertEqual(response.status_code, 200) + # check for object creation + self.assertEquals(5, self.model.objects.count()) + diff --git a/products/views.py b/products/views.py index d4af09b..49026e2 100644 --- a/products/views.py +++ b/products/views.py @@ -100,3 +100,42 @@ def load_coop_products(request): return Response({"errors": {"details": str(type(e))}}) +@api_view(['GET',]) # include allowed methods +def product_search(request): + """ + Takes a string of data, return relevant products + """ + query_string = request.GET.get('query_string', None) + if query_string is None: + return Response({"errors": {"details": "No query string to parse"}}) + try: + chunks = query_string.split(' ') + + result_set = set() + import ipdb; ipdb.set_trace() + for chunk in chunks: + import ipdb; ipdb.set_trace() + # search in name + products = Product.objects.filter(name__in=chunk) + for item in products: + result_set.add(item) + # search in description + products = Product.objects.filter(description__in=chunk) + for item in products: + result_set.add(item) + # search in tags + products = Product.objects.filter(tags__in=chunk) + for item in products: + result_set.add(item) + # search in category + products = Product.objects.filter(category__in=chunk) + for item in products: + result_set.add(item) + # search in attributes + products = Product.objects.filter(attributes__in=chunk) + for item in products: + result_set.add(item) + + return Response(data=result_set) + except Exception as e: + return Response({"errors": {"details": str(type(e))}})