diff --git a/products/serializers.py b/products/serializers.py index c20e5b7..0f09d36 100644 --- a/products/serializers.py +++ b/products/serializers.py @@ -1,4 +1,5 @@ from rest_framework import serializers +from tagulous.serializers.json import Serializer from products.models import Product diff --git a/products/tests.py b/products/tests.py index 12eee20..07339f2 100644 --- a/products/tests.py +++ b/products/tests.py @@ -80,6 +80,41 @@ class ProductViewSetTest(APITestCase): # Assert access is forbidden self.assertEqual(response.status_code, status.HTTP_200_OK) + def test_anon_user_can_filter_name(self): + # create instances + self.factory(name='product1', tags="zapatos, verdes") + self.factory(name='product2', tags="rojos") + + url = f"{self.endpoint}?name=product1" + + # Request list + response = self.client.get(url) + payload = response.json() + + # Assert access is granted + self.assertEqual(response.status_code, status.HTTP_200_OK) + # Assert number of instnaces in response + self.assertEquals(1, len(payload)) + + def test_anon_user_can_filter_tags(self): + # create instances + self.factory(name='product1', tags="zapatos, verdes") + self.factory(name='product2', tags="rojos") + + url = f"{self.endpoint}?tags=rojos" + + # Request list + response = self.client.get(url) + payload = response.json() + + # import ipdb; ipdb.set_trace() + + # Assert access is granted + self.assertEqual(response.status_code, status.HTTP_200_OK) + # Assert number of instnaces in response + self.assertEquals(1, len(payload)) + + # authenticated user def test_auth_user_can_list_instances(self): """Regular logged-in user can list instance diff --git a/products/views.py b/products/views.py index 947d1c8..2b82e88 100644 --- a/products/views.py +++ b/products/views.py @@ -14,6 +14,7 @@ from rest_framework import viewsets from rest_framework.response import Response from rest_framework.permissions import IsAuthenticatedOrReadOnly, IsAdminUser, IsAuthenticated from rest_framework.decorators import api_view, permission_classes, action +import django_filters.rest_framework import requests @@ -25,6 +26,8 @@ from history.models import HistorySync from back_latienda.permissions import IsCreator from .utils import extract_search_filters from utils.tag_serializers import TaggitSerializer +from utils.tag_filters import ProductTagFilter + logging.basicConfig( filename='logs/product-load.log', @@ -38,6 +41,8 @@ class ProductViewSet(viewsets.ModelViewSet): queryset = Product.objects.all() serializer_class = ProductSerializer permission_classes = [IsAuthenticatedOrReadOnly, IsCreator] + filter_backends = ProductTagFilter + filterset_fields = ['name', 'tags'] def perform_create(self, serializer): serializer.save(creator=self.request.user) diff --git a/utils/tag_filters.py b/utils/tag_filters.py new file mode 100644 index 0000000..f1f7abd --- /dev/null +++ b/utils/tag_filters.py @@ -0,0 +1,11 @@ +import django_filters +from products.models import Product + + +class ProductTagFilter(django_filters.FilterSet): + tags = django_filters.CharFilter(field_name='tags.name', lookup_expr='iexact') + + class Meta: + model = Product + fields = ['name',] +