Skip to content
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.

Commit 3a3032a

Browse files
committedFeb 10, 2021
Move extracing of meta logic into build_json_resource_obj
1 parent bdff4a8 commit 3a3032a

File tree

4 files changed

+34
-46
lines changed

4 files changed

+34
-46
lines changed
 

‎CHANGELOG.md

+1-1
Original file line numberDiff line numberDiff line change
@@ -14,12 +14,12 @@ any parts of the framework not mentioned in the documentation should generally b
1414

1515
* Ability for the user to select `included_serializers` to apply when using `BrowsableAPI`, based on available `included_serializers` defined for the current endpoint.
1616
* Ability for the user to format serializer properties in URL segments using the `JSON_API_FORMAT_RELATED_LINKS` setting.
17-
* Ability to render meta_fields of included resources
1817

1918
### Fixed
2019

2120
* Allow users to overwrite a view's `get_serializer_class()` method when using [related urls](https://django-rest-framework-json-api.readthedocs.io/en/stable/usage.html#related-urls)
2221
* Correctly resolve the resource type of `ResourceRelatedField(many=True)` fields on plain serializers
22+
* Render `meta_fields` in included resources
2323

2424

2525
## [4.0.0] - 2020-10-31

‎example/tests/integration/test_includes.py

+4-6
Original file line numberDiff line numberDiff line change
@@ -263,17 +263,15 @@ def test_data_resource_not_included_again(single_comment, client):
263263
assert comment_count == expected_comment_count, "Comment count incorrect"
264264

265265

266-
def test_meta_object_added_to_included_resource_on_list(single_entry, client):
267-
# Add metadata to included object
266+
def test_meta_object_added_to_included_resources(single_entry, client):
268267
response = client.get(
269268
reverse("entry-detail", kwargs={"pk": single_entry.pk}) + "?include=comments"
270269
)
271-
meta = response.json()["included"][0].get("meta", False)
272-
assert meta, "list has no meta object"
270+
assert response.json()["included"][0].get("meta")
273271

274272
response = client.get(
275273
reverse("entry-detail", kwargs={"pk": single_entry.pk})
276274
+ "?include=comments.author"
277275
)
278-
meta = response.json()["included"][0].get("meta", False)
279-
assert meta, "detail has no meta object"
276+
assert response.json()["included"][0].get("meta")
277+
assert response.json()["included"][1].get("meta")

‎example/tests/unit/test_renderer_class_methods.py

+15-10
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33

44
from rest_framework_json_api import serializers
55
from rest_framework_json_api.renderers import JSONRenderer
6+
from rest_framework_json_api.utils import get_serializer_fields
67

78
pytestmark = pytest.mark.django_db
89

@@ -20,10 +21,7 @@ class Meta:
2021

2122

2223
def test_build_json_resource_obj():
23-
resource = {
24-
"pk": 1,
25-
"username": "Alice",
26-
}
24+
resource = {"username": "Alice", "version": "1.0.0"}
2725

2826
serializer = ResourceSerializer(data={"username": "Alice"})
2927
serializer.is_valid()
@@ -33,11 +31,16 @@ def test_build_json_resource_obj():
3331
"type": "user",
3432
"id": "1",
3533
"attributes": {"username": "Alice"},
34+
"meta": {"version": "1.0.0"},
3635
}
3736

3837
assert (
3938
JSONRenderer.build_json_resource_obj(
40-
serializer.fields, resource, resource_instance, "user"
39+
get_serializer_fields(serializer),
40+
resource,
41+
resource_instance,
42+
"user",
43+
serializer,
4144
)
4245
== output
4346
)
@@ -47,11 +50,8 @@ def test_can_override_methods():
4750
"""
4851
Make sure extract_attributes and extract_relationships can be overriden.
4952
"""
50-
resource = {
51-
"pk": 1,
52-
"username": "Alice",
53-
}
5453

54+
resource = {"username": "Alice", "version": "1.0.0"}
5555
serializer = ResourceSerializer(data={"username": "Alice"})
5656
serializer.is_valid()
5757
resource_instance = serializer.save()
@@ -60,6 +60,7 @@ def test_can_override_methods():
6060
"type": "user",
6161
"id": "1",
6262
"attributes": {"username": "Alice"},
63+
"meta": {"version": "1.0.0"},
6364
}
6465

6566
class CustomRenderer(JSONRenderer):
@@ -80,7 +81,11 @@ def extract_relationships(cls, fields, resource, resource_instance):
8081

8182
assert (
8283
CustomRenderer.build_json_resource_obj(
83-
serializer.fields, resource, resource_instance, "user"
84+
get_serializer_fields(serializer),
85+
resource,
86+
resource_instance,
87+
"user",
88+
serializer,
8489
)
8590
== output
8691
)

‎rest_framework_json_api/renderers.py

+14-29
Original file line numberDiff line numberDiff line change
@@ -373,14 +373,11 @@ def extract_included(
373373
serializer_resource,
374374
nested_resource_instance,
375375
resource_type,
376+
serializer,
376377
getattr(serializer, "_poly_force_type_resolution", False),
377378
)
378-
included_cache[new_item["type"]][
379-
new_item["id"]
380-
] = utils.format_field_names(new_item)
381-
cls.add_meta_to_included(
382-
included_cache, field, serializer_resource, new_item
383-
)
379+
included_cache[new_item["type"]][new_item["id"]] = new_item
380+
384381
cls.extract_included(
385382
serializer_fields,
386383
serializer_resource,
@@ -400,14 +397,11 @@ def extract_included(
400397
serializer_data,
401398
relation_instance,
402399
relation_type,
400+
field,
403401
getattr(field, "_poly_force_type_resolution", False),
404402
)
405-
included_cache[new_item["type"]][
406-
new_item["id"]
407-
] = utils.format_field_names(new_item)
408-
cls.add_meta_to_included(
409-
included_cache, field, serializer_data, new_item
410-
)
403+
included_cache[new_item["type"]][new_item["id"]] = new_item
404+
411405
cls.extract_included(
412406
serializer_fields,
413407
serializer_data,
@@ -416,14 +410,6 @@ def extract_included(
416410
included_cache,
417411
)
418412

419-
@classmethod
420-
def add_meta_to_included(cls, included_cache, field, resource, new_item):
421-
meta = cls.extract_meta(field, resource)
422-
if meta:
423-
included_cache[new_item["type"]][new_item["id"]][
424-
"meta"
425-
] = utils.format_field_names(meta)
426-
427413
@classmethod
428414
def extract_meta(cls, serializer, resource):
429415
"""
@@ -464,6 +450,7 @@ def build_json_resource_obj(
464450
resource,
465451
resource_instance,
466452
resource_name,
453+
serializer,
467454
force_type_resolution=False,
468455
):
469456
"""
@@ -490,6 +477,11 @@ def build_json_resource_obj(
490477
resource_data.append(
491478
("links", {"self": resource[api_settings.URL_FIELD_NAME]})
492479
)
480+
481+
meta = cls.extract_meta(serializer, resource)
482+
if meta:
483+
resource_data.append(("meta", utils.format_field_names(meta)))
484+
493485
return OrderedDict(resource_data)
494486

495487
def render_relationship_view(
@@ -596,13 +588,9 @@ def render(self, data, accepted_media_type=None, renderer_context=None):
596588
resource,
597589
resource_instance,
598590
resource_name,
591+
serializer,
599592
force_type_resolution,
600593
)
601-
meta = self.extract_meta(serializer, resource)
602-
if meta:
603-
json_resource_obj.update(
604-
{"meta": utils.format_field_names(meta)}
605-
)
606594
json_api_data.append(json_resource_obj)
607595

608596
self.extract_included(
@@ -624,13 +612,10 @@ def render(self, data, accepted_media_type=None, renderer_context=None):
624612
serializer_data,
625613
resource_instance,
626614
resource_name,
615+
serializer,
627616
force_type_resolution,
628617
)
629618

630-
meta = self.extract_meta(serializer, serializer_data)
631-
if meta:
632-
json_api_data.update({"meta": utils.format_field_names(meta)})
633-
634619
self.extract_included(
635620
fields,
636621
serializer_data,

0 commit comments

Comments
 (0)
Please sign in to comment.