Skip to content

Commit f446077

Browse files
author
Ryan P Kilby
committed
Patch 'filter_class' to avoid code duplication
1 parent d99e6ed commit f446077

File tree

1 file changed

+20
-24
lines changed

1 file changed

+20
-24
lines changed

rest_framework_filters/backends.py

Lines changed: 20 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11

2-
from django.template import Template, TemplateDoesNotExist, loader
3-
from rest_framework import compat
2+
from contextlib import contextmanager
43
from django_filters.rest_framework import backends
54

65
from .filterset import FilterSet
@@ -9,30 +8,27 @@
98
class DjangoFilterBackend(backends.DjangoFilterBackend):
109
default_filter_set = FilterSet
1110

12-
def filter_queryset(self, request, queryset, view):
13-
filter_class = self.get_filter_class(view, queryset)
14-
15-
if filter_class:
16-
if hasattr(filter_class, 'get_subset'):
17-
filter_class = filter_class.get_subset(request.query_params)
18-
return filter_class(request.query_params, queryset=queryset).qs
11+
@contextmanager
12+
def patched_filter_class(self, request):
13+
"""
14+
Patch `get_filter_class()` to get the subset based on the request params
15+
"""
16+
original = self.get_filter_class
1917

20-
return queryset
18+
def get_subset_class(view, queryset=None):
19+
filter_class = original(view, queryset)
2120

22-
def to_html(self, request, queryset, view):
23-
filter_class = self.get_filter_class(view, queryset)
24-
if not filter_class:
25-
return None
26-
filter_instance = filter_class(request.query_params, queryset=queryset)
21+
if filter_class and hasattr(filter_class, 'get_subset'):
22+
filter_class = filter_class.get_subset(request.query_params)
2723

28-
# forces `form` evaluation before `qs` is called. This prevents an empty form from being cached.
29-
filter_instance.form
24+
return filter_class
3025

31-
try:
32-
template = loader.get_template(self.template)
33-
except TemplateDoesNotExist:
34-
template = Template(backends.template_default)
26+
self.get_filter_class = get_subset_class
27+
yield
28+
self.get_filter_class = original
3529

36-
return compat.template_render(template, context={
37-
'filter': filter_instance
38-
})
30+
def filter_queryset(self, request, queryset, view):
31+
# patching the behavior of `get_filter_class()` in this method allows
32+
# us to avoid maintenance issues with code duplication.
33+
with self.patched_filter_class(request):
34+
return super(DjangoFilterBackend, self).filter_queryset(request, queryset, view)

0 commit comments

Comments
 (0)