From e5fdeb7cdb1979de4fcba5096b900a626fef9765 Mon Sep 17 00:00:00 2001 From: Sam Date: Fri, 12 Feb 2021 12:18:06 +0000 Subject: [PATCH] added tag filtering for companies --- companies/tests.py | 33 ++++++++++++++++++++++++++++----- companies/views.py | 3 ++- utils/tag_filters.py | 17 +++++++++++++++++ 3 files changed, 47 insertions(+), 6 deletions(-) diff --git a/companies/tests.py b/companies/tests.py index 51596ac..a247b4b 100644 --- a/companies/tests.py +++ b/companies/tests.py @@ -29,8 +29,8 @@ class CompanyViewSetTest(APITestCase): self.password = ''.join(random.choices(string.ascii_uppercase, k = 10)) self.user = CustomUserFactory(email="test@mail.com", password=self.password, is_active=True) - # user not authenticated - def test_not_logged_user_cannot_create_instance(self): + # anonymous user + def test_anon_user_cannot_create_instance(self): """Not logged-in user cannot create new instance """ instances = [self.factory() for n in range(random.randint(1,5))] @@ -40,7 +40,7 @@ class CompanyViewSetTest(APITestCase): # Assert access is forbidden self.assertEqual(response.status_code, status.HTTP_401_UNAUTHORIZED) - def test_not_logged_user_cannot_modify_existing_instance(self): + def test_anon_user_cannot_modify_existing_instance(self): """Not logged-in user cannot modify existing instance """ # Create instance @@ -53,7 +53,7 @@ class CompanyViewSetTest(APITestCase): # Assert forbidden code self.assertEqual(response.status_code, status.HTTP_401_UNAUTHORIZED) - def test_not_logged_user_cannot_delete_existing_instance(self): + def test_anon_user_cannot_delete_existing_instance(self): """Not logged-in user cannot delete existing instance """ # Create instances @@ -67,7 +67,7 @@ class CompanyViewSetTest(APITestCase): # Assert instance still exists on db self.assertTrue(self.model.objects.get(id=instance.pk)) - def test_not_logged_user_can_list_instance(self): + def test_anon_user_can_list_instance(self): """Not logged-in user can list instance """ # Request list @@ -76,6 +76,28 @@ class CompanyViewSetTest(APITestCase): # Assert access is forbidden self.assertEqual(response.status_code, status.HTTP_200_OK) + def test_anon_user_can_filter_tags(self): + # create instances + expected_instance = [ + self.factory(tags='ropa'), + self.factory(tags='tejidos, ropa') + ] + unexpected_instance = [ + self.factory(tags="zapatos, azules"), + self.factory(tags="xxl") + ] + # prepare url + url = f"{self.endpoint}?tags=ropa" + + # 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(len(expected_instance), len(payload)) + # authenticated user def test_logged_user_can_list_instance(self): """Regular logged-in user can list instance @@ -241,6 +263,7 @@ class CompanyViewSetTest(APITestCase): self.assertFalse(self.model.objects.filter(id=instance.pk).exists()) + class MyCompanyViewTest(APITestCase): """CompanyViewset tests """ diff --git a/companies/views.py b/companies/views.py index 2460b0e..a2114ae 100644 --- a/companies/views.py +++ b/companies/views.py @@ -16,7 +16,7 @@ from ipware import get_client_ip from stats.models import StatsLog from companies.models import Company from companies.serializers import CompanySerializer - +from utils.tag_filters import CompanyTagFilter from back_latienda.permissions import IsCreator @@ -24,6 +24,7 @@ class CompanyViewSet(viewsets.ModelViewSet): queryset = Company.objects.all() serializer_class = CompanySerializer permission_classes = [IsAuthenticatedOrReadOnly, IsCreator] + filterset_class = CompanyTagFilter def perform_create(self, serializer): serializer.save(creator=self.request.user) diff --git a/utils/tag_filters.py b/utils/tag_filters.py index 7394ac0..3cc8502 100644 --- a/utils/tag_filters.py +++ b/utils/tag_filters.py @@ -1,7 +1,23 @@ import django_filters + +from companies.models import Company from products.models import Product +class CompanyTagFilter(django_filters.FilterSet): + + tags = django_filters.CharFilter(method='tag_filter') + + class Meta: + model = Company + fields = ['tags', 'city',] + + def tag_filter(self, queryset, name, value): + return queryset.filter(**{ + name: value, + }) + + class ProductTagFilter(django_filters.FilterSet): tags = django_filters.CharFilter(method='tag_filter') @@ -16,3 +32,4 @@ class ProductTagFilter(django_filters.FilterSet): return queryset.filter(**{ name: value, }) +