Skip to content

Commit 0b1e61b

Browse files
committed
🐛 Return 400 error on invalid filter values
1 parent 0ad10a7 commit 0b1e61b

File tree

2 files changed

+4
-24
lines changed

2 files changed

+4
-24
lines changed

froide/publicbody/filters.py

Lines changed: 2 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -74,25 +74,6 @@ class Meta:
7474
class PublicBodyAPIFilterSet(PublicBodySearchMixin, BaseSearchFilterSet):
7575
"""FilterSet for the PublicBody API search (ID-based lookups)."""
7676

77-
def is_valid(self):
78-
# Trigger form validation to populate cleaned_data and errors,
79-
# but always return True to prevent DjangoFilterBackend from
80-
# raising a 400 response for invalid filter values.
81-
self.form.is_valid()
82-
83-
return True
84-
85-
def filter_queryset(self, queryset):
86-
# Apply all valid filters normally.
87-
for name, value in self.form.cleaned_data.items():
88-
queryset = self.filters[name].filter(queryset, value)
89-
90-
# For invalid filter values, filter by a non-existent PK to return empty results.
91-
for name in self.form.errors:
92-
queryset = queryset.filter(**{name: 0})
93-
94-
return queryset
95-
9677
q = django_filters.CharFilter(
9778
method="auto_query",
9879
)
@@ -113,7 +94,8 @@ def filter_queryset(self, queryset):
11394
queryset=GeoRegion.objects.all(),
11495
method="filter_regions",
11596
)
116-
regions_kind = django_filters.CharFilter(
97+
regions_kind = django_filters.ChoiceFilter(
98+
choices=GeoRegion.KIND_CHOICES,
11799
method="filter_regions_kind",
118100
)
119101

froide/publicbody/tests.py

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -574,13 +574,11 @@ def test_search_filters(
574574
],
575575
)
576576
def test_invalid_input(self, client, publicbody_data, api_params):
577-
"""Invalid filter values should return 200 with empty results."""
577+
"""Invalid filter values should return 400."""
578578
url = reverse("api:publicbody-search")
579579
response = client.get(url, api_params)
580580

581-
assert response.status_code == 200
582-
data = response.json()
583-
assert data["objects"] == []
581+
assert response.status_code == 400
584582

585583
@pytest.mark.django_db
586584
@pytest.mark.parametrize(

0 commit comments

Comments
 (0)