Skip to content

Commit 48b7b4d

Browse files
committed
Deprecated built-in schema generation.
* To be removed in v25. * Use drf-spectacular. Closes #1432. Closes #1573.
1 parent d6e3cc0 commit 48b7b4d

File tree

5 files changed

+43
-3
lines changed

5 files changed

+43
-3
lines changed

CHANGES.rst

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,17 @@
1+
Version 23.2 (UNRELEASED)
2+
-------------------------
3+
4+
* Deprecated the schema generation methods of the DRF related ``DjangoFilterBackend``.
5+
These will be removed in version 25.1.
6+
7+
You should use `drf-spectacular <https://drf-spectacular.readthedocs.io/en/latest/>`_
8+
for generating OpenAPI schemas with DRF.
9+
10+
* In addition, stopped testing against the (very old now) ``coreapi`` schema generation.
11+
These methods should continue to work if you're using them until v25.1, but
12+
``coreapi`` is no longer maintained, and is raising warnings against the current
13+
versions of Python. To workaround this is not worth the effort at this point.
14+
115
Version 23.1 (2023-3-26)
216
------------------------
317

django_filters/__init__.py

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,3 +29,11 @@ def parse_version(version):
2929

3030

3131
VERSION = parse_version(__version__)
32+
33+
34+
35+
assert VERSION < (25,0), "Remove deprecated code"
36+
37+
38+
class RemovedInDjangoFilter25Warning(DeprecationWarning):
39+
pass

django_filters/rest_framework/backends.py

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -93,6 +93,11 @@ def get_schema_fields(self, view):
9393
# This is not compatible with widgets where the query param differs from the
9494
# filter's attribute name. Notably, this includes `MultiWidget`, where query
9595
# params will be of the format `<name>_0`, `<name>_1`, etc...
96+
from django_filters import RemovedInDjangoFilter25Warning
97+
warnings.warn(
98+
"Built-in schema generation is deprecated. Use drf-spectacular.",
99+
category=RemovedInDjangoFilter25Warning,
100+
)
96101
assert (
97102
compat.coreapi is not None
98103
), "coreapi must be installed to use `get_schema_fields()`"
@@ -125,6 +130,11 @@ def get_schema_fields(self, view):
125130
)
126131

127132
def get_schema_operation_parameters(self, view):
133+
from django_filters import RemovedInDjangoFilter25Warning
134+
warnings.warn(
135+
"Built-in schema generation is deprecated. Use drf-spectacular.",
136+
category=RemovedInDjangoFilter25Warning,
137+
)
128138
try:
129139
queryset = view.get_queryset()
130140
except Exception:

requirements/test-ci.txt

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
markdown
2-
coreapi
32
django-crispy-forms
43

54
coverage

tests/rest_framework/test_backends.py

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,11 @@
33

44
from django.db.models import BooleanField
55
from django.test import TestCase
6-
from django.test.utils import override_settings
6+
from django.test.utils import ignore_warnings, override_settings
77
from rest_framework import generics, serializers
88
from rest_framework.test import APIRequestFactory
99

10-
from django_filters import compat, filters
10+
from django_filters import RemovedInDjangoFilter25Warning, compat, filters
1111
from django_filters.rest_framework import DjangoFilterBackend, FilterSet, backends
1212

1313
from ..models import Article
@@ -245,13 +245,15 @@ class View(FilterClassRootView):
245245

246246

247247
class GetSchemaOperationParametersTests(TestCase):
248+
@ignore_warnings(category=RemovedInDjangoFilter25Warning)
248249
def test_get_operation_parameters_with_filterset_fields_list(self):
249250
backend = DjangoFilterBackend()
250251
fields = backend.get_schema_operation_parameters(FilterFieldsRootView())
251252
fields = [f["name"] for f in fields]
252253

253254
self.assertEqual(fields, ["decimal", "date"])
254255

256+
@ignore_warnings(category=RemovedInDjangoFilter25Warning)
255257
def test_get_operation_parameters_with_filterset_fields_list_with_choices(self):
256258
backend = DjangoFilterBackend()
257259
fields = backend.get_schema_operation_parameters(CategoryItemView())
@@ -269,6 +271,12 @@ def test_get_operation_parameters_with_filterset_fields_list_with_choices(self):
269271
],
270272
)
271273

274+
def test_deprecation_warning(self):
275+
backend = DjangoFilterBackend()
276+
msg = "Built-in schema generation is deprecated. Use drf-spectacular."
277+
with self.assertWarnsMessage(RemovedInDjangoFilter25Warning, msg):
278+
backend.get_schema_operation_parameters(FilterFieldsRootView())
279+
272280

273281
class TemplateTests(TestCase):
274282
def test_backend_output(self):
@@ -407,6 +415,7 @@ def test_to_html_none_filter_class(self):
407415
html = self.backend.to_html(mock.Mock(), mock.Mock(), mock.Mock())
408416
self.assertIsNone(html)
409417

418+
@ignore_warnings(category=RemovedInDjangoFilter25Warning)
410419
def test_get_schema_operation_parameters_userwarning(self):
411420
with self.assertWarns(UserWarning):
412421
view = mock.Mock()

0 commit comments

Comments
 (0)