diff --git a/products/tests.py b/products/tests.py index d2ac9d3..cc5563e 100644 --- a/products/tests.py +++ b/products/tests.py @@ -194,6 +194,21 @@ class ProductViewSetTest(APITestCase): # Assert number of instnaces in response self.assertEquals(len(expected_instance), len(payload)) + def test_anon_can_get_related_products(self): + # Create instances + instance = self.factory() + # make our user the creator + instance.creator = self.user + instance.save() + + url = f"{self.endpoint}{instance.id}/related/" + + response = self.client.get(url) + + self.assertEquals(response.status_code, 200) + payload= response.json() + self.assertTrue(len(payload) <= 6) + # authenticated user def test_auth_user_can_paginate_instances(self): """authenticated user can paginate instances diff --git a/products/utils.py b/products/utils.py index abb78bd..05ebadf 100644 --- a/products/utils.py +++ b/products/utils.py @@ -85,6 +85,16 @@ def extract_search_filters(result_set): return filter_dict +def find_related_products_v7(description, tags, attributes, category): + products_qs = Product.objects.filter( + description=description, + tags__in=tags, + attributes__in=attributes, + category=category + )[:6] + return products_qs + + def find_related_products_v3(keyword): """ Ranked product search diff --git a/products/views.py b/products/views.py index 763a0c1..8fc511d 100644 --- a/products/views.py +++ b/products/views.py @@ -23,7 +23,7 @@ from products.models import Product, CategoryTag from products.serializers import ProductSerializer, TagFilterSerializer, SearchResultSerializer from companies.models import Company from back_latienda.permissions import IsCreator, IsSiteAdmin, ReadOnly -from .utils import extract_search_filters, find_related_products_v3, find_related_products_v6, product_loader +from .utils import extract_search_filters, find_related_products_v6, product_loader, find_related_products_v7 from utils.tag_serializers import TaggitSerializer from utils.tag_filters import ProductTagFilter, ProductOrderFilter @@ -37,19 +37,24 @@ logging.basicConfig( class ProductViewSet(viewsets.ModelViewSet): - queryset = Product.objects.filter(active=True).order_by('-created') - serializer_class = ProductSerializer - permission_classes = [IsAuthenticatedOrReadOnly, IsCreator] - filter_backends = [DjangoFilterBackend, OrderingFilter] - filterset_class = ProductTagFilter + queryset = Product.objects.filter(active=True).order_by('-created') + serializer_class = ProductSerializer + permission_classes = [IsAuthenticatedOrReadOnly, IsCreator] + filter_backends = [DjangoFilterBackend, OrderingFilter] + filterset_class = ProductTagFilter - def perform_create(self, serializer): - serializer.save(creator=self.request.user, company=self.request.user.company) + def perform_create(self, serializer): + serializer.save(creator=self.request.user, company=self.request.user.company) - @action(detail=True, methods=['GET',]) - def related(request): - # TODO: find the most similar products - return Response(data=[]) + @action(detail=True, methods=['GET',]) + def related(self, request, pk=None): + """Find instances similar to the one referenced + """ + # TODO: find the most similar products + product = self.get_object() + qs = find_related_products_v7(product.description, product.tags.all(), product.attributes.all(), product.category) + serializer = self.serializer_class(qs, many=True) + return Response(data=serializer.data) class MyProductsViewSet(viewsets.ModelViewSet):