diff --git a/CHANGELOG.md b/CHANGELOG.md index 46dc3419..a295aee1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -20,6 +20,7 @@ any parts of the framework not mentioned in the documentation should generally b ### Added * Added support for Django 4.1. +* Added support for Django REST framework 3.14. * Expanded JSONParser API with `parse_data` method ### Changed @@ -29,13 +30,14 @@ any parts of the framework not mentioned in the documentation should generally b ### Removed * Removed support for Django 2.2. +* Removed support for Django REST framework 3.12. ## [5.0.0] - 2022-01-03 This release is not backwards compatible. For easy migration best upgrade first to version 4.3.0 and resolve all deprecation warnings before updating to 5.0.0 -This is the last release supporting Django 2.2. +This is the last release supporting Django 2.2 and Django REST framework 3.12. ### Added diff --git a/README.rst b/README.rst index c82ebb2d..8812bc5d 100644 --- a/README.rst +++ b/README.rst @@ -90,7 +90,7 @@ Requirements 1. Python (3.7, 3.8, 3.9, 3.10) 2. Django (3.2, 4.0, 4.1) -3. Django REST framework (3.12, 3.13) +3. Django REST framework (3.13, 3.14) We **highly** recommend and only officially support the latest patch release of each Python, Django and REST framework series. diff --git a/docs/getting-started.md b/docs/getting-started.md index e03b415b..ab0e961d 100644 --- a/docs/getting-started.md +++ b/docs/getting-started.md @@ -53,7 +53,7 @@ like the following: 1. Python (3.7, 3.8, 3.9, 3.10) 2. Django (3.2, 4.0, 4.1) -3. Django REST framework (3.12, 3.13) +3. Django REST framework (3.13, 3.14) We **highly** recommend and only officially support the latest patch release of each Python, Django and REST framework series. diff --git a/rest_framework_json_api/compat.py b/rest_framework_json_api/compat.py new file mode 100644 index 00000000..96648eb0 --- /dev/null +++ b/rest_framework_json_api/compat.py @@ -0,0 +1,15 @@ +# Django REST framework 3.14 removed NullBooleanField +# can be removed once support for DRF 3.13 is dropped. +try: + from rest_framework.serializers import NullBooleanField +except ImportError: # pragma: no cover + NullBooleanField = object() + + +# Django REST framework 3.14 deprecates usage of `_get_reference`. +# can be removed once support for DRF 3.13 is dropped. +def get_reference(schema, serializer): + try: + return schema.get_reference(serializer) + except AttributeError: # pragma: no cover + return schema._get_reference(serializer) diff --git a/rest_framework_json_api/metadata.py b/rest_framework_json_api/metadata.py index 6b88e578..1906de71 100644 --- a/rest_framework_json_api/metadata.py +++ b/rest_framework_json_api/metadata.py @@ -7,6 +7,7 @@ from rest_framework.settings import api_settings from rest_framework.utils.field_mapping import ClassLookupDict +from rest_framework_json_api.compat import NullBooleanField from rest_framework_json_api.utils import format_field_name, get_related_resource_type @@ -23,7 +24,7 @@ class JSONAPIMetadata(SimpleMetadata): serializers.Field: "GenericField", serializers.RelatedField: "Relationship", serializers.BooleanField: "Boolean", - serializers.NullBooleanField: "Boolean", + NullBooleanField: "Boolean", serializers.CharField: "String", serializers.URLField: "URL", serializers.EmailField: "Email", diff --git a/rest_framework_json_api/schemas/openapi.py b/rest_framework_json_api/schemas/openapi.py index 1aa690fa..59ed3a3e 100644 --- a/rest_framework_json_api/schemas/openapi.py +++ b/rest_framework_json_api/schemas/openapi.py @@ -7,6 +7,7 @@ from rest_framework.schemas.utils import is_list_view from rest_framework_json_api import serializers, views +from rest_framework_json_api.compat import get_reference from rest_framework_json_api.utils import format_field_name @@ -515,10 +516,10 @@ def _get_toplevel_200_response(self, operation, collection=True): if collection: data = { "type": "array", - "items": self._get_reference(self.view.get_serializer()), + "items": get_reference(self, self.view.get_serializer()), } else: - data = self._get_reference(self.view.get_serializer()) + data = get_reference(self, self.view.get_serializer()) return { "description": operation["operationId"], diff --git a/setup.py b/setup.py index 6ac4d9f3..87e296f1 100755 --- a/setup.py +++ b/setup.py @@ -96,7 +96,7 @@ def get_package_data(package): ], install_requires=[ "inflection>=0.5.0", - "djangorestframework>=3.12,<3.14", + "djangorestframework>=3.13,<3.15", "django>=3.2,<4.2", ], extras_require={ diff --git a/tox.ini b/tox.ini index 4d52ce48..3d1219b5 100644 --- a/tox.ini +++ b/tox.ini @@ -1,7 +1,8 @@ [tox] envlist = - py{37,38,39,310}-django32-drf{312,313,master}, - py{38,39,310}-django{40,41}-drf{313,master}, + py{37,38,39,310}-django32-drf{313,314,master}, + py{38,39,310}-django40-drf{313,314,master}, + py{38,39,310}-django41-drf{314,master}, lint,docs [testenv] @@ -9,8 +10,8 @@ deps = django32: Django>=3.2,<3.3 django40: Django>=4.0,<4.1 django41: Django>=4.1,<4.2 - drf312: djangorestframework>=3.12,<3.13 drf313: djangorestframework>=3.13,<3.14 + drf314: djangorestframework>=3.14,<3.15 drfmaster: https://github.com/encode/django-rest-framework/archive/master.zip -rrequirements/requirements-testing.txt -rrequirements/requirements-optionals.txt