|
3 | 3 | from __future__ import unicode_literals |
4 | 4 |
|
5 | 5 | from django.test import TestCase |
| 6 | +from django.utils import six |
6 | 7 |
|
7 | 8 | from rest_framework_filters.compat import set_many |
| 9 | +from rest_framework_filters.filterset import FilterSetMetaclass |
8 | 10 | from rest_framework_filters import filters, FilterSet |
9 | 11 | from django_filters.filters import BaseInFilter |
10 | 12 |
|
11 | 13 | from .testapp.models import ( |
12 | | - Note, Post, Person, Tag, BlogPost, |
| 14 | + User, Note, Post, Person, Tag, BlogPost, |
13 | 15 | ) |
14 | 16 |
|
15 | 17 | from .testapp.filters import ( |
@@ -292,6 +294,30 @@ def test_non_filter_subset(self): |
292 | 294 | filterset_class = NoteFilterWithRelated.get_subset(['foobar']) |
293 | 295 | self.assertEqual(len(filterset_class.base_filters), 0) |
294 | 296 |
|
| 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 | + |
295 | 321 |
|
296 | 322 | class FilterOverrideTests(TestCase): |
297 | 323 |
|
|
0 commit comments