added tag filtering for companies

This commit is contained in:
Sam
2021-02-12 12:18:06 +00:00
parent c4faa89a99
commit e5fdeb7cdb
3 changed files with 47 additions and 6 deletions

View File

@@ -29,8 +29,8 @@ class CompanyViewSetTest(APITestCase):
self.password = ''.join(random.choices(string.ascii_uppercase, k = 10)) self.password = ''.join(random.choices(string.ascii_uppercase, k = 10))
self.user = CustomUserFactory(email="test@mail.com", password=self.password, is_active=True) self.user = CustomUserFactory(email="test@mail.com", password=self.password, is_active=True)
# user not authenticated # anonymous user
def test_not_logged_user_cannot_create_instance(self): def test_anon_user_cannot_create_instance(self):
"""Not logged-in user cannot create new instance """Not logged-in user cannot create new instance
""" """
instances = [self.factory() for n in range(random.randint(1,5))] instances = [self.factory() for n in range(random.randint(1,5))]
@@ -40,7 +40,7 @@ class CompanyViewSetTest(APITestCase):
# Assert access is forbidden # Assert access is forbidden
self.assertEqual(response.status_code, status.HTTP_401_UNAUTHORIZED) 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 """Not logged-in user cannot modify existing instance
""" """
# Create instance # Create instance
@@ -53,7 +53,7 @@ class CompanyViewSetTest(APITestCase):
# Assert forbidden code # Assert forbidden code
self.assertEqual(response.status_code, status.HTTP_401_UNAUTHORIZED) 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 """Not logged-in user cannot delete existing instance
""" """
# Create instances # Create instances
@@ -67,7 +67,7 @@ class CompanyViewSetTest(APITestCase):
# Assert instance still exists on db # Assert instance still exists on db
self.assertTrue(self.model.objects.get(id=instance.pk)) 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 """Not logged-in user can list instance
""" """
# Request list # Request list
@@ -76,6 +76,28 @@ class CompanyViewSetTest(APITestCase):
# Assert access is forbidden # Assert access is forbidden
self.assertEqual(response.status_code, status.HTTP_200_OK) 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 # authenticated user
def test_logged_user_can_list_instance(self): def test_logged_user_can_list_instance(self):
"""Regular logged-in user can list instance """Regular logged-in user can list instance
@@ -241,6 +263,7 @@ class CompanyViewSetTest(APITestCase):
self.assertFalse(self.model.objects.filter(id=instance.pk).exists()) self.assertFalse(self.model.objects.filter(id=instance.pk).exists())
class MyCompanyViewTest(APITestCase): class MyCompanyViewTest(APITestCase):
"""CompanyViewset tests """CompanyViewset tests
""" """

View File

@@ -16,7 +16,7 @@ from ipware import get_client_ip
from stats.models import StatsLog from stats.models import StatsLog
from companies.models import Company from companies.models import Company
from companies.serializers import CompanySerializer from companies.serializers import CompanySerializer
from utils.tag_filters import CompanyTagFilter
from back_latienda.permissions import IsCreator from back_latienda.permissions import IsCreator
@@ -24,6 +24,7 @@ class CompanyViewSet(viewsets.ModelViewSet):
queryset = Company.objects.all() queryset = Company.objects.all()
serializer_class = CompanySerializer serializer_class = CompanySerializer
permission_classes = [IsAuthenticatedOrReadOnly, IsCreator] permission_classes = [IsAuthenticatedOrReadOnly, IsCreator]
filterset_class = CompanyTagFilter
def perform_create(self, serializer): def perform_create(self, serializer):
serializer.save(creator=self.request.user) serializer.save(creator=self.request.user)

View File

@@ -1,7 +1,23 @@
import django_filters import django_filters
from companies.models import Company
from products.models import Product 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): class ProductTagFilter(django_filters.FilterSet):
tags = django_filters.CharFilter(method='tag_filter') tags = django_filters.CharFilter(method='tag_filter')
@@ -16,3 +32,4 @@ class ProductTagFilter(django_filters.FilterSet):
return queryset.filter(**{ return queryset.filter(**{
name: value, name: value,
}) })