5
5
from __future__ import unicode_literals
6
6
7
7
import operator
8
+ import warnings
8
9
from functools import reduce
9
10
10
- from django .conf import settings
11
11
from django .core .exceptions import ImproperlyConfigured
12
12
from django .db import models
13
13
from django .db .models .constants import LOOKUP_SEP
16
16
from django .utils .translation import ugettext_lazy as _
17
17
18
18
from rest_framework .compat import (
19
- coreapi , crispy_forms , distinct , django_filters , guardian , template_render
19
+ coreapi , distinct , django_filters , guardian , template_render
20
20
)
21
21
from rest_framework .settings import api_settings
22
22
23
- if 'crispy_forms' in settings .INSTALLED_APPS and crispy_forms and django_filters :
24
- # If django-crispy-forms is installed, use it to get a bootstrap3 rendering
25
- # of the DjangoFilterBackend controls when displayed as HTML.
26
- from crispy_forms .helper import FormHelper
27
- from crispy_forms .layout import Layout , Submit
28
-
29
- class FilterSet (django_filters .FilterSet ):
30
- def __init__ (self , * args , ** kwargs ):
31
- super (FilterSet , self ).__init__ (* args , ** kwargs )
32
- for field in self .form .fields .values ():
33
- field .help_text = None
34
-
35
- layout_components = list (self .form .fields .keys ()) + [
36
- Submit ('' , _ ('Submit' ), css_class = 'btn-default' ),
37
- ]
38
-
39
- helper = FormHelper ()
40
- helper .form_method = 'GET'
41
- helper .template_pack = 'bootstrap3'
42
- helper .layout = Layout (* layout_components )
43
-
44
- self .form .helper = helper
45
-
46
- filter_template = 'rest_framework/filters/django_filter_crispyforms.html'
47
-
48
- elif django_filters :
49
- # If django-crispy-forms is not installed, use the standard
50
- # 'form.as_p' rendering when DjangoFilterBackend is displayed as HTML.
51
- class FilterSet (django_filters .FilterSet ):
52
- def __init__ (self , * args , ** kwargs ):
53
- super (FilterSet , self ).__init__ (* args , ** kwargs )
54
- for field in self .form .fields .values ():
55
- field .help_text = None
56
-
57
- filter_template = 'rest_framework/filters/django_filter.html'
58
-
59
- else :
60
- FilterSet = None
61
- filter_template = None
62
-
63
23
64
24
class BaseFilterBackend (object ):
65
25
"""
@@ -77,78 +37,34 @@ def get_schema_fields(self, view):
77
37
return []
78
38
79
39
40
+ class FilterSet (object ):
41
+ def __new__ (cls , * args , ** kwargs ):
42
+ warnings .warn (
43
+ "The built in 'rest_framework.filters.FilterSet' is pending deprecation. "
44
+ "You should use 'django_filters.rest_framework.FilterSet' instead." ,
45
+ PendingDeprecationWarning
46
+ )
47
+ from django_filters .rest_framework import FilterSet
48
+ return FilterSet (* args , ** kwargs )
49
+
50
+
80
51
class DjangoFilterBackend (BaseFilterBackend ):
81
52
"""
82
53
A filter backend that uses django-filter.
83
54
"""
84
- default_filter_set = FilterSet
85
- template = filter_template
86
-
87
- def __init__ (self ):
55
+ def __new__ (cls , * args , ** kwargs ):
88
56
assert django_filters , 'Using DjangoFilterBackend, but django-filter is not installed'
57
+ assert django_filters .VERSION >= (0 , 15 , 3 ), 'django-filter 0.15.3 and above is required'
89
58
90
- def get_filter_class (self , view , queryset = None ):
91
- """
92
- Return the django-filters `FilterSet` used to filter the queryset.
93
- """
94
- filter_class = getattr (view , 'filter_class' , None )
95
- filter_fields = getattr (view , 'filter_fields' , None )
96
-
97
- if filter_class :
98
- filter_model = filter_class .Meta .model
99
-
100
- assert issubclass (queryset .model , filter_model ), \
101
- 'FilterSet model %s does not match queryset model %s' % \
102
- (filter_model , queryset .model )
103
-
104
- return filter_class
105
-
106
- if filter_fields :
107
- class AutoFilterSet (self .default_filter_set ):
108
- class Meta :
109
- model = queryset .model
110
- fields = filter_fields
59
+ warnings .warn (
60
+ "The built in 'rest_framework.filters.DjangoFilterBackend' is pending deprecation. "
61
+ "You should use 'django_filters.rest_framework.DjangoFilterBackend' instead." ,
62
+ PendingDeprecationWarning
63
+ )
111
64
112
- return AutoFilterSet
65
+ from django_filters . rest_framework import DjangoFilterBackend
113
66
114
- return None
115
-
116
- def filter_queryset (self , request , queryset , view ):
117
- filter_class = self .get_filter_class (view , queryset )
118
-
119
- if filter_class :
120
- return filter_class (request .query_params , queryset = queryset ).qs
121
-
122
- return queryset
123
-
124
- def to_html (self , request , queryset , view ):
125
- filter_class = self .get_filter_class (view , queryset )
126
- if not filter_class :
127
- return None
128
- filter_instance = filter_class (request .query_params , queryset = queryset )
129
- context = {
130
- 'filter' : filter_instance
131
- }
132
- template = loader .get_template (self .template )
133
- return template_render (template , context )
134
-
135
- def get_schema_fields (self , view ):
136
- assert coreapi is not None , 'coreapi must be installed to use `get_schema_fields()`'
137
- filter_class = getattr (view , 'filter_class' , None )
138
- if filter_class :
139
- return [
140
- coreapi .Field (name = field_name , required = False , location = 'query' )
141
- for field_name in filter_class ().filters .keys ()
142
- ]
143
-
144
- filter_fields = getattr (view , 'filter_fields' , None )
145
- if filter_fields :
146
- return [
147
- coreapi .Field (name = field_name , required = False , location = 'query' )
148
- for field_name in filter_fields
149
- ]
150
-
151
- return []
67
+ return DjangoFilterBackend (* args , ** kwargs )
152
68
153
69
154
70
class SearchFilter (BaseFilterBackend ):
0 commit comments