Skip to content

Commit 490aa93

Browse files
author
Ryan P Kilby
committed
Refactor get_declared_fields and move to metaclass
1 parent 62516ad commit 490aa93

File tree

1 file changed

+23
-23
lines changed

1 file changed

+23
-23
lines changed

django_filters/filterset.py

Lines changed: 23 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -20,28 +20,6 @@
2020
from .utils import try_dbfield, get_all_model_fields, get_model_field, resolve_field
2121

2222

23-
def get_declared_filters(bases, attrs, with_base_filters=True):
24-
filters = []
25-
for filter_name, obj in list(attrs.items()):
26-
if isinstance(obj, Filter):
27-
obj = attrs.pop(filter_name)
28-
if getattr(obj, 'name', None) is None:
29-
obj.name = filter_name
30-
filters.append((filter_name, obj))
31-
filters.sort(key=lambda x: x[1].creation_counter)
32-
33-
if with_base_filters:
34-
for base in bases[::-1]:
35-
if hasattr(base, 'base_filters'):
36-
filters = list(base.base_filters.items()) + filters
37-
else:
38-
for base in bases[::-1]:
39-
if hasattr(base, 'declared_filters'):
40-
filters = list(base.declared_filters.items()) + filters
41-
42-
return OrderedDict(filters)
43-
44-
4523
def filters_for_model(model, fields=None, exclude=None, filter_for_field=None,
4624
filter_for_reverse_field=None):
4725
field_dict = OrderedDict()
@@ -138,7 +116,7 @@ def __new__(cls, name, bases, attrs):
138116
except NameError:
139117
# We are defining FilterSet itself here
140118
parents = None
141-
declared_filters = get_declared_filters(bases, attrs, False)
119+
declared_filters = cls.get_declared_filters(bases, attrs)
142120
new_class = super(
143121
FilterSetMetaclass, cls).__new__(cls, name, bases, attrs)
144122

@@ -163,6 +141,28 @@ def __new__(cls, name, bases, attrs):
163141
new_class.base_filters = filters
164142
return new_class
165143

144+
@classmethod
145+
def get_declared_filters(cls, bases, attrs):
146+
filters = [
147+
(filter_name, attrs.pop(filter_name))
148+
for filter_name, obj in list(attrs.items())
149+
if isinstance(obj, Filter)
150+
]
151+
152+
# Default the `filter.name` to the attribute name on the filterset
153+
for filter_name, f in filters:
154+
if getattr(f, 'name', None) is None:
155+
f.name = filter_name
156+
157+
filters.sort(key=lambda x: x[1].creation_counter)
158+
159+
# merge declared filters from base classes
160+
for base in reversed(bases):
161+
if hasattr(base, 'declared_filters'):
162+
filters = list(base.declared_filters.items()) + filters
163+
164+
return OrderedDict(filters)
165+
166166

167167
FILTER_FOR_DBFIELD_DEFAULTS = {
168168
models.AutoField: {'filter_class': NumberFilter},

0 commit comments

Comments
 (0)