Skip to content

Commit 2a193dd

Browse files
authored
Merge pull request #3706 from webkom/ivarnakken/aba-1203-implement-filtering-on-companies
2 parents b8247bb + fdd9acc commit 2a193dd

File tree

3 files changed

+84
-2
lines changed

3 files changed

+84
-2
lines changed

lego/apps/companies/filters.py

Lines changed: 23 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,28 @@
1+
from django.db.models import Q
12
from django_filters import BooleanFilter, CharFilter, FilterSet
23

3-
from lego.apps.companies.models import CompanyInterest, Semester
4+
from lego.apps.companies.models import Company, CompanyInterest, Semester
5+
6+
7+
class CompanyFilterSet(FilterSet):
8+
search = CharFilter(method="filter_search")
9+
show_inactive = BooleanFilter(method="filter_inactive")
10+
11+
def filter_search(self, queryset, name, value):
12+
if not value:
13+
return queryset
14+
return queryset.filter(
15+
Q(name__icontains=value) | Q(description__icontains=value)
16+
)
17+
18+
def filter_inactive(self, queryset, name, value):
19+
if not value:
20+
return queryset.filter(active=True)
21+
return queryset
22+
23+
class Meta:
24+
model = Company
25+
fields = ["search", "show_inactive"]
426

527

628
class SemesterFilterSet(FilterSet):
Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
from django.test import TestCase
2+
3+
from lego.apps.companies.filters import CompanyFilterSet
4+
from lego.apps.companies.models import Company
5+
6+
7+
class CompanyFilterSetTestCase(TestCase):
8+
fixtures = ["test_abakus_groups.yaml", "test_users.yaml", "test_companies.yaml"]
9+
10+
def setUp(self):
11+
self.filter_set = CompanyFilterSet
12+
self.queryset = Company.objects.all()
13+
14+
def test_filter_search_empty(self):
15+
"""Test that empty search returns full queryset"""
16+
filtered = self.filter_set({"search": ""}, queryset=self.queryset).qs
17+
self.assertEqual(filtered.count(), self.queryset.count())
18+
19+
def test_filter_search_name(self):
20+
"""Test search filtering by company name"""
21+
filtered = self.filter_set({"search": "Facebook"}, queryset=self.queryset).qs
22+
self.assertEqual(filtered.count(), 1)
23+
self.assertEqual(filtered.first().name, "Facebook")
24+
25+
def test_filter_search_description(self):
26+
"""Test search filtering by company description"""
27+
filtered = self.filter_set(
28+
{"search": "webkom er webkom"}, queryset=self.queryset
29+
).qs
30+
self.assertEqual(filtered.count(), 1)
31+
self.assertEqual(filtered.first().name, "Webkom")
32+
33+
def test_filter_search_case_insensitive(self):
34+
"""Test that search is case insensitive"""
35+
filtered = self.filter_set({"search": "facebook"}, queryset=self.queryset).qs
36+
self.assertEqual(filtered.count(), 1)
37+
self.assertEqual(filtered.first().name, "Facebook")
38+
39+
def test_filter_inactive_default(self):
40+
"""Test that by default only active companies are shown"""
41+
company = Company.objects.get(name="Facebook")
42+
company.active = False
43+
company.save()
44+
45+
filtered = self.filter_set({"show_inactive": False}, queryset=self.queryset).qs
46+
self.assertNotIn(company, filtered)
47+
48+
def test_filter_show_inactive(self):
49+
"""Test that inactive companies can be shown when requested"""
50+
company = Company.objects.get(name="Facebook")
51+
company.active = False
52+
company.save()
53+
54+
filtered = self.filter_set({"show_inactive": True}, queryset=self.queryset).qs
55+
self.assertIn(company, filtered)

lego/apps/companies/views.py

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,11 @@
77
from rest_framework.mixins import ListModelMixin, RetrieveModelMixin
88
from rest_framework.response import Response
99

10-
from lego.apps.companies.filters import CompanyInterestFilterSet, SemesterFilterSet
10+
from lego.apps.companies.filters import (
11+
CompanyFilterSet,
12+
CompanyInterestFilterSet,
13+
SemesterFilterSet,
14+
)
1115
from lego.apps.companies.models import (
1216
Company,
1317
CompanyContact,
@@ -72,6 +76,7 @@ class CompanyViewSet(
7276
viewsets.GenericViewSet,
7377
):
7478
queryset = Company.objects.all().filter(active=True)
79+
filterset_class = CompanyFilterSet
7580
ordering = "name"
7681

7782
def get_serializer_class(self):

0 commit comments

Comments
 (0)