From d292b6562b5ee8a12046b95f20b5e4bbdeece6c5 Mon Sep 17 00:00:00 2001 From: "zhenyu (Eric) Liu" Date: Fri, 31 May 2024 11:02:57 +1000 Subject: [PATCH 1/2] fix the format_errors bug when data is None --- .../tests/unit/test_default_drf_serializers.py | 15 ++++++++++++++- example/views.py | 18 +++++++++++++++--- rest_framework_json_api/utils.py | 2 +- 3 files changed, 30 insertions(+), 5 deletions(-) diff --git a/example/tests/unit/test_default_drf_serializers.py b/example/tests/unit/test_default_drf_serializers.py index 87231896..ba668d8d 100644 --- a/example/tests/unit/test_default_drf_serializers.py +++ b/example/tests/unit/test_default_drf_serializers.py @@ -1,5 +1,6 @@ import json from datetime import datetime +import logging import pytest from django.urls import reverse @@ -73,7 +74,6 @@ def test_render_format_field_names(db, settings, entry): def test_blog_create(client): url = reverse("drf-entry-blog-list") name = "Dummy Name" - request_data = { "data": {"attributes": {"name": name}, "type": "blogs"}, } @@ -104,6 +104,19 @@ def test_blog_create(client): assert resp.json() == expected +@pytest.mark.django_db +def test_rest_action_request(client): + url = reverse("drf-entry-blog-list") + "/actions/custom_response" + name = "Dummy Name" + request_data = { + "data": {"attributes": {"name": name}, "type": "blogs"}, + } + + resp = client.post(url, request_data) + + assert resp.status_code == 400 + + @pytest.mark.django_db def test_get_object_gives_correct_blog(client, blog, entry): url = reverse("drf-entry-blog-detail", kwargs={"entry_pk": entry.id}) diff --git a/example/views.py b/example/views.py index 9c949684..a85f8197 100644 --- a/example/views.py +++ b/example/views.py @@ -1,9 +1,11 @@ +import logging import rest_framework.exceptions as exceptions import rest_framework.parsers import rest_framework.renderers from django_filters import rest_framework as filters from rest_framework.filters import SearchFilter - +from rest_framework.response import Response +from rest_framework.decorators import action import rest_framework_json_api.metadata import rest_framework_json_api.parsers import rest_framework_json_api.renderers @@ -74,6 +76,18 @@ def get_object(self): return super().get_object() + @action(url_path="actions/custom_response", detail=False, methods=["post"]) + def custom_response(self, request): + data = request.data + serializer = self.get_serializer(data=data) + serializer.is_valid(raise_exception=True) + self.perform_create(serializer) + try: + test = 1/0 + except Exception: + return Response(status=400) + + return Response(status=201) class JsonApiViewSet(ModelViewSet): """ @@ -254,7 +268,6 @@ def get_queryset(self, *args, **kwargs): return queryset - class CompanyViewset(ModelViewSet): queryset = Company.objects.all() serializer_class = CompanySerializer @@ -273,7 +286,6 @@ class ProjectTypeViewset(ModelViewSet): class EntryRelationshipView(RelationshipView): queryset = Entry.objects.all() - class BlogRelationshipView(RelationshipView): queryset = Blog.objects.all() diff --git a/rest_framework_json_api/utils.py b/rest_framework_json_api/utils.py index e12080ac..66b46435 100644 --- a/rest_framework_json_api/utils.py +++ b/rest_framework_json_api/utils.py @@ -474,6 +474,6 @@ def format_error_object(message, pointer, response): def format_errors(data): - if len(data) > 1 and isinstance(data, list): + if isinstance(data, list) and len(data) > 1: data.sort(key=lambda x: x.get("source", {}).get("pointer", "")) return {"errors": data} From 7b2832c03aca7c9b66287fe8f6ab600a2b87c01f Mon Sep 17 00:00:00 2001 From: "zhenyu (Eric) Liu" Date: Fri, 31 May 2024 11:09:28 +1000 Subject: [PATCH 2/2] remove unused code --- example/tests/unit/test_default_drf_serializers.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/example/tests/unit/test_default_drf_serializers.py b/example/tests/unit/test_default_drf_serializers.py index ba668d8d..c078dc06 100644 --- a/example/tests/unit/test_default_drf_serializers.py +++ b/example/tests/unit/test_default_drf_serializers.py @@ -1,6 +1,5 @@ import json from datetime import datetime -import logging import pytest from django.urls import reverse @@ -74,6 +73,7 @@ def test_render_format_field_names(db, settings, entry): def test_blog_create(client): url = reverse("drf-entry-blog-list") name = "Dummy Name" + request_data = { "data": {"attributes": {"name": name}, "type": "blogs"}, }