Skip to content

Commit 062c092

Browse files
author
Ryan P Kilby
authored
Merge pull request #139 from rpkilby/fix-metaclass-inheritance
Add metaclass inheritance test Thanks @detonavomek
2 parents 7119eaa + a57789f commit 062c092

File tree

2 files changed

+28
-2
lines changed

2 files changed

+28
-2
lines changed

rest_framework_filters/filterset.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -224,7 +224,7 @@ def get_subset(cls, params):
224224
if subset_class is not None:
225225
return subset_class
226226

227-
class FilterSubsetMetaclass(FilterSetMetaclass):
227+
class FilterSubsetMetaclass(type(cls)):
228228
def __new__(cls, name, bases, attrs):
229229
new_class = super(FilterSubsetMetaclass, cls).__new__(cls, name, bases, attrs)
230230
new_class.base_filters = OrderedDict([

tests/test_filterset.py

Lines changed: 27 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,13 +3,15 @@
33
from __future__ import unicode_literals
44

55
from django.test import TestCase
6+
from django.utils import six
67

78
from rest_framework_filters.compat import set_many
9+
from rest_framework_filters.filterset import FilterSetMetaclass
810
from rest_framework_filters import filters, FilterSet
911
from django_filters.filters import BaseInFilter
1012

1113
from .testapp.models import (
12-
Note, Post, Person, Tag, BlogPost,
14+
User, Note, Post, Person, Tag, BlogPost,
1315
)
1416

1517
from .testapp.filters import (
@@ -292,6 +294,30 @@ def test_non_filter_subset(self):
292294
filterset_class = NoteFilterWithRelated.get_subset(['foobar'])
293295
self.assertEqual(len(filterset_class.base_filters), 0)
294296

297+
def test_metaclass_inheritance(self):
298+
# See: https://github.com/philipn/django-rest-framework-filters/issues/132
299+
class SubMetaclass(FilterSetMetaclass):
300+
pass
301+
302+
class SubFilterSet(six.with_metaclass(SubMetaclass, FilterSet)):
303+
pass
304+
305+
class NoteFilter(SubFilterSet):
306+
author = filters.RelatedFilter(UserFilter)
307+
308+
class Meta:
309+
model = Note
310+
fields = ['title', 'content']
311+
312+
# ensure that the class name is useful when debugging
313+
filterset_class = NoteFilter.get_subset(['author', 'content'])
314+
self.assertEqual(filterset_class.__name__, 'NoteFilterSubset')
315+
316+
# ensure that the FilterSet subset only contains the requested fields
317+
self.assertIn('author', filterset_class.base_filters)
318+
self.assertIn('content', filterset_class.base_filters)
319+
self.assertEqual(len(filterset_class.base_filters), 2)
320+
295321

296322
class FilterOverrideTests(TestCase):
297323

0 commit comments

Comments
 (0)