Skip to content

Commit a76396b

Browse files
authored
Merge branch 'master' into include_related_field
2 parents 955b28c + 36a60a3 commit a76396b

20 files changed

+226
-85
lines changed

AUTHORS

+1
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ Raphael Cohen <[email protected]>
3131
René Kälin <[email protected]>
3232
Roberto Barreda <[email protected]>
3333
Rohith PR <[email protected]>
34+
Safa AlFulaij <[email protected]>
3435
santiavenda <[email protected]>
3536
Sergey Kolomenkin <https://kolomenkin.com>
3637

CHANGELOG.md

+11
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,17 @@ any parts of the framework not mentioned in the documentation should generally b
1313
### Added
1414

1515
* Added support for Django 3.2.
16+
* Added support for tags in OAS schema
17+
18+
### Fixed
19+
20+
* Allow `get_serializer_class` to be overwritten when using related urls without defining `serializer_class` fallback
21+
* Preserve field names when no formatting is configured.
22+
23+
### Deprecated
24+
25+
* Deprecated default `format_type` argument of `rest_framework_json_api.utils.format_value`. Use `rest_framework_json_api.utils.format_field_name` or specify specifc `format_type` instead.
26+
* Deprecated `format_type` argument of `rest_framework_json_api.utils.format_link_segment`. Use `format_value` instead.
1627

1728
### Fixed
1829

example/tests/snapshots/snap_test_openapi.py

+20-5
Original file line numberDiff line numberDiff line change
@@ -121,7 +121,10 @@
121121
},
122122
"description": "not found"
123123
}
124-
}
124+
},
125+
"tags": [
126+
"authors"
127+
]
125128
}"""
126129

127130
snapshots[
@@ -227,7 +230,10 @@
227230
},
228231
"description": "not found"
229232
}
230-
}
233+
},
234+
"tags": [
235+
"authors"
236+
]
231237
}"""
232238

233239
snapshots[
@@ -411,7 +417,10 @@
411417
},
412418
"description": "[Conflict](https://jsonapi.org/format/#crud-creating-responses-409)"
413419
}
414-
}
420+
},
421+
"tags": [
422+
"authors"
423+
]
415424
}"""
416425

417426
snapshots[
@@ -589,7 +598,10 @@
589598
},
590599
"description": "[Conflict]([Conflict](https://jsonapi.org/format/#crud-updating-responses-409)"
591600
}
592-
}
601+
},
602+
"tags": [
603+
"authors"
604+
]
593605
}"""
594606

595607
snapshots[
@@ -652,5 +664,8 @@
652664
},
653665
"description": "[Resource does not exist](https://jsonapi.org/format/#crud-deleting-responses-404)"
654666
}
655-
}
667+
},
668+
"tags": [
669+
"authors"
670+
]
656671
}"""

example/tests/test_views.py

+3-4
Original file line numberDiff line numberDiff line change
@@ -417,12 +417,11 @@ def test_get_related_serializer_class_many(self):
417417
def test_get_serializer_comes_from_included_serializers(self):
418418
kwargs = {"pk": self.author.id, "related_field": "type"}
419419
view = self._get_view(kwargs)
420-
related_serializers = view.serializer_class.related_serializers
421-
delattr(view.serializer_class, "related_serializers")
420+
related_serializers = view.get_serializer_class().related_serializers
421+
delattr(view.get_serializer_class(), "related_serializers")
422422
got = view.get_related_serializer_class()
423423
self.assertEqual(got, AuthorTypeSerializer)
424-
425-
view.serializer_class.related_serializers = related_serializers
424+
view.get_serializer_class().related_serializers = related_serializers
426425

427426
def test_get_related_serializer_class_raises_error(self):
428427
kwargs = {"pk": self.author.id, "related_field": "unknown"}

example/views.py

+7-9
Original file line numberDiff line numberDiff line change
@@ -208,17 +208,15 @@ class NoFiltersetEntryViewSet(EntryViewSet):
208208

209209
class AuthorViewSet(ModelViewSet):
210210
queryset = Author.objects.all()
211-
serializer_classes = {
212-
"list": AuthorListSerializer,
213-
"retrieve": AuthorDetailSerializer,
214-
}
215-
serializer_class = AuthorSerializer # fallback
216211

217212
def get_serializer_class(self):
218-
try:
219-
return self.serializer_classes.get(self.action, self.serializer_class)
220-
except AttributeError:
221-
return self.serializer_class
213+
serializer_classes = {
214+
"list": AuthorListSerializer,
215+
"retrieve": AuthorDetailSerializer,
216+
}
217+
218+
action = getattr(self, "action", "")
219+
return serializer_classes.get(action, AuthorSerializer)
222220

223221

224222
class CommentViewSet(ModelViewSet):
+2-2
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
11
black==20.8b1
2-
flake8==3.9.0
2+
flake8==3.9.1
33
flake8-isort==4.0.0
4-
isort==5.7.0
4+
isort==5.8.0
+2-2
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,3 @@
11
recommonmark==0.7.1
2-
Sphinx==3.5.2
3-
sphinx_rtd_theme==0.5.1
2+
Sphinx==3.5.4
3+
sphinx_rtd_theme==0.5.2
+1-1
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
twine==3.3.0
1+
twine==3.4.1

requirements/requirements-testing.txt

+4-4
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
1-
django-debug-toolbar==3.2
1+
django-debug-toolbar==3.2.1
22
factory-boy==3.2.0
3-
Faker==6.6.0
4-
pytest==6.2.2
3+
Faker==8.1.0
4+
pytest==6.2.3
55
pytest-cov==2.11.1
6-
pytest-django==4.1.0
6+
pytest-django==4.2.0
77
pytest-factoryboy==2.1.0
88
snapshottest==0.6.0

rest_framework_json_api/django_filters/backends.py

+2-3
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
from rest_framework.exceptions import ValidationError
55
from rest_framework.settings import api_settings
66

7-
from rest_framework_json_api.utils import format_value
7+
from rest_framework_json_api.utils import undo_format_field_name
88

99

1010
class DjangoFilterBackend(DjangoFilterBackend):
@@ -119,8 +119,7 @@ def get_filterset_kwargs(self, request, queryset, view):
119119
)
120120
# convert jsonapi relationship path to Django ORM's __ notation
121121
key = m.groupdict()["assoc"].replace(".", "__")
122-
# undo JSON_API_FORMAT_FIELD_NAMES conversion:
123-
key = format_value(key, "underscore")
122+
key = undo_format_field_name(key)
124123
data.setlist(key, val)
125124
filter_keys.append(key)
126125
del data[qp]

rest_framework_json_api/filters.py

+5-5
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
from rest_framework.exceptions import ValidationError
44
from rest_framework.filters import BaseFilterBackend, OrderingFilter
55

6-
from rest_framework_json_api.utils import format_value
6+
from rest_framework_json_api.utils import undo_format_field_name
77

88

99
class OrderingFilter(OrderingFilter):
@@ -15,7 +15,7 @@ class OrderingFilter(OrderingFilter):
1515
:py:class:`rest_framework.filters.OrderingFilter` with
1616
:py:attr:`~rest_framework.filters.OrderingFilter.ordering_param` = "sort"
1717
18-
Also applies DJA format_value() to convert (e.g. camelcase) to underscore.
18+
Also supports undo of field name formatting
1919
(See JSON_API_FORMAT_FIELD_NAMES in docs/usage.md)
2020
"""
2121

@@ -38,7 +38,7 @@ def remove_invalid_fields(self, queryset, fields, view, request):
3838
bad_terms = [
3939
term
4040
for term in fields
41-
if format_value(term.replace(".", "__").lstrip("-"), "underscore")
41+
if undo_format_field_name(term.replace(".", "__").lstrip("-"))
4242
not in valid_fields
4343
]
4444
if bad_terms:
@@ -56,10 +56,10 @@ def remove_invalid_fields(self, queryset, fields, view, request):
5656
item_rewritten = item.replace(".", "__")
5757
if item_rewritten.startswith("-"):
5858
underscore_fields.append(
59-
"-" + format_value(item_rewritten.lstrip("-"), "underscore")
59+
"-" + undo_format_field_name(item_rewritten.lstrip("-"))
6060
)
6161
else:
62-
underscore_fields.append(format_value(item_rewritten, "underscore"))
62+
underscore_fields.append(undo_format_field_name(item_rewritten))
6363

6464
return super(OrderingFilter, self).remove_invalid_fields(
6565
queryset, underscore_fields, view, request

rest_framework_json_api/metadata.py

+2-2
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
from rest_framework.settings import api_settings
88
from rest_framework.utils.field_mapping import ClassLookupDict
99

10-
from rest_framework_json_api.utils import format_value, get_related_resource_type
10+
from rest_framework_json_api.utils import format_field_name, get_related_resource_type
1111

1212

1313
class JSONAPIMetadata(SimpleMetadata):
@@ -93,7 +93,7 @@ def get_serializer_info(self, serializer):
9393

9494
return OrderedDict(
9595
[
96-
(format_value(field_name), self.get_field_info(field))
96+
(format_field_name(field_name), self.get_field_info(field))
9797
for field_name, field in serializer.fields.items()
9898
]
9999
)

rest_framework_json_api/parsers.py

+7-21
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,8 @@
44
from rest_framework import parsers
55
from rest_framework.exceptions import ParseError
66

7-
from . import exceptions, renderers, serializers, utils
8-
from .settings import json_api_settings
7+
from rest_framework_json_api import exceptions, renderers, serializers
8+
from rest_framework_json_api.utils import get_resource_name, undo_format_field_names
99

1010

1111
class JSONParser(parsers.JSONParser):
@@ -37,27 +37,13 @@ class JSONParser(parsers.JSONParser):
3737

3838
@staticmethod
3939
def parse_attributes(data):
40-
attributes = data.get("attributes")
41-
uses_format_translation = json_api_settings.FORMAT_FIELD_NAMES
42-
43-
if not attributes:
44-
return dict()
45-
elif uses_format_translation:
46-
# convert back to python/rest_framework's preferred underscore format
47-
return utils.format_field_names(attributes, "underscore")
48-
else:
49-
return attributes
40+
attributes = data.get("attributes") or dict()
41+
return undo_format_field_names(attributes)
5042

5143
@staticmethod
5244
def parse_relationships(data):
53-
uses_format_translation = json_api_settings.FORMAT_FIELD_NAMES
54-
relationships = data.get("relationships")
55-
56-
if not relationships:
57-
relationships = dict()
58-
elif uses_format_translation:
59-
# convert back to python/rest_framework's preferred underscore format
60-
relationships = utils.format_field_names(relationships, "underscore")
45+
relationships = data.get("relationships") or dict()
46+
relationships = undo_format_field_names(relationships)
6147

6248
# Parse the relationships
6349
parsed_relationships = dict()
@@ -130,7 +116,7 @@ def parse(self, stream, media_type=None, parser_context=None):
130116

131117
# Check for inconsistencies
132118
if request.method in ("PUT", "POST", "PATCH"):
133-
resource_name = utils.get_resource_name(
119+
resource_name = get_resource_name(
134120
parser_context, expand_polymorphic_types=True
135121
)
136122
if isinstance(resource_name, str):

rest_framework_json_api/schemas/openapi.py

+1
Original file line numberDiff line numberDiff line change
@@ -427,6 +427,7 @@ def get_operation(self, path, method):
427427
parameters += self.get_pagination_parameters(path, method)
428428
parameters += self.get_filter_parameters(path, method)
429429
operation["parameters"] = parameters
430+
operation["tags"] = self.get_tags(path, method)
430431

431432
# get request and response code schemas
432433
if method == "GET":

0 commit comments

Comments
 (0)