From 1a8f30bfdba49a08c44976c8e9de61a85cb6e767 Mon Sep 17 00:00:00 2001 From: jokiefer Date: Sun, 6 Feb 2022 19:29:06 +0100 Subject: [PATCH 1/4] fixes attribute naming in filter backend and AutoSchema --- CHANGELOG.md | 1 + rest_framework_json_api/django_filters/backends.py | 5 +++-- rest_framework_json_api/schemas/openapi.py | 7 +++++-- 3 files changed, 9 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 73a9a738..566014bd 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -15,6 +15,7 @@ any parts of the framework not mentioned in the documentation should generally b * Fixed invalid relationship pointer in error objects when field naming formatting is used. * Properly resolved related resource type when nested source field is defined. * Prevented overwriting of pointer in custom error object +* Adhered to field naming format setting when generating OpenAPI schema. ### Added diff --git a/rest_framework_json_api/django_filters/backends.py b/rest_framework_json_api/django_filters/backends.py index 5302bf09..73b4c578 100644 --- a/rest_framework_json_api/django_filters/backends.py +++ b/rest_framework_json_api/django_filters/backends.py @@ -4,7 +4,7 @@ from rest_framework.exceptions import ValidationError from rest_framework.settings import api_settings -from rest_framework_json_api.utils import undo_format_field_name +from rest_framework_json_api.utils import format_field_names, undo_format_field_name class DjangoFilterBackend(DjangoFilterBackend): @@ -139,5 +139,6 @@ def get_schema_operation_parameters(self, view): result = super().get_schema_operation_parameters(view) for res in result: if "name" in res: - res["name"] = "filter[{}]".format(res["name"]).replace("__", ".") + name = format_field_names(res["name"].replace("__", ".")) + res["name"] = "filter[{}]".format(name) return result diff --git a/rest_framework_json_api/schemas/openapi.py b/rest_framework_json_api/schemas/openapi.py index c3d553b7..52c8ccde 100644 --- a/rest_framework_json_api/schemas/openapi.py +++ b/rest_framework_json_api/schemas/openapi.py @@ -667,8 +667,8 @@ def map_serializer(self, serializer): continue if field.required: - required.append(field.field_name) - + required.append(format_field_name(field.field_name)) + schema = self.map_field(field) if field.read_only: schema["readOnly"] = True @@ -681,6 +681,9 @@ def map_serializer(self, serializer): if field.help_text: # Ensure django gettext_lazy is rendered correctly schema["description"] = str(field.help_text) + if field.label: + # Ensure django gettext_lazy is rendered correctly + schema["title"] = str(field.label) self.map_field_validators(field, schema) attributes[format_field_name(field.field_name)] = schema From 80c11fc8089f613cfb23315ccbb5d7ed6cf9e493 Mon Sep 17 00:00:00 2001 From: jokiefer Date: Mon, 7 Feb 2022 08:50:19 +0100 Subject: [PATCH 2/4] removes title from schema --- rest_framework_json_api/schemas/openapi.py | 3 --- 1 file changed, 3 deletions(-) diff --git a/rest_framework_json_api/schemas/openapi.py b/rest_framework_json_api/schemas/openapi.py index 52c8ccde..f846f1a9 100644 --- a/rest_framework_json_api/schemas/openapi.py +++ b/rest_framework_json_api/schemas/openapi.py @@ -681,9 +681,6 @@ def map_serializer(self, serializer): if field.help_text: # Ensure django gettext_lazy is rendered correctly schema["description"] = str(field.help_text) - if field.label: - # Ensure django gettext_lazy is rendered correctly - schema["title"] = str(field.label) self.map_field_validators(field, schema) attributes[format_field_name(field.field_name)] = schema From 53bb56a3b77ce23a3b5d447bb243ced9a5a96995 Mon Sep 17 00:00:00 2001 From: jokiefer Date: Mon, 7 Feb 2022 08:53:12 +0100 Subject: [PATCH 3/4] fixes lint issues --- rest_framework_json_api/schemas/openapi.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rest_framework_json_api/schemas/openapi.py b/rest_framework_json_api/schemas/openapi.py index f846f1a9..1aa690fa 100644 --- a/rest_framework_json_api/schemas/openapi.py +++ b/rest_framework_json_api/schemas/openapi.py @@ -668,7 +668,7 @@ def map_serializer(self, serializer): if field.required: required.append(format_field_name(field.field_name)) - + schema = self.map_field(field) if field.read_only: schema["readOnly"] = True From 30bc7d6604d52f629ebf91384cecdadd0c26e168 Mon Sep 17 00:00:00 2001 From: Oliver Sauder Date: Tue, 6 Sep 2022 22:50:52 +0200 Subject: [PATCH 4/4] Added testing of missing field name formatting in schema --- CHANGELOG.md | 2 +- example/migrations/0012_author_full_name.py | 19 ++++++++ example/models.py | 1 + example/serializers.py | 1 + example/tests/__snapshots__/test_openapi.ambr | 45 +++++++++++++++++++ example/tests/test_format_keys.py | 1 + example/views.py | 1 + .../django_filters/backends.py | 4 +- 8 files changed, 71 insertions(+), 3 deletions(-) create mode 100644 example/migrations/0012_author_full_name.py diff --git a/CHANGELOG.md b/CHANGELOG.md index 566014bd..46dc3419 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -15,7 +15,7 @@ any parts of the framework not mentioned in the documentation should generally b * Fixed invalid relationship pointer in error objects when field naming formatting is used. * Properly resolved related resource type when nested source field is defined. * Prevented overwriting of pointer in custom error object -* Adhered to field naming format setting when generating OpenAPI schema. +* Adhered to field naming format setting when generating schema parameters and required fields. ### Added diff --git a/example/migrations/0012_author_full_name.py b/example/migrations/0012_author_full_name.py new file mode 100644 index 00000000..1f67558e --- /dev/null +++ b/example/migrations/0012_author_full_name.py @@ -0,0 +1,19 @@ +# Generated by Django 4.1 on 2022-09-06 15:42 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ("example", "0011_rename_type_author_author_type_and_more"), + ] + + operations = [ + migrations.AddField( + model_name="author", + name="full_name", + field=models.CharField(default="", max_length=50), + preserve_default=False, + ), + ] diff --git a/example/models.py b/example/models.py index c3850076..8fc86c22 100644 --- a/example/models.py +++ b/example/models.py @@ -53,6 +53,7 @@ class Meta: class Author(BaseModel): name = models.CharField(max_length=50) + full_name = models.CharField(max_length=50) email = models.EmailField() author_type = models.ForeignKey(AuthorType, null=True, on_delete=models.CASCADE) diff --git a/example/serializers.py b/example/serializers.py index b9bf71d6..75a1de11 100644 --- a/example/serializers.py +++ b/example/serializers.py @@ -268,6 +268,7 @@ class Meta: model = Author fields = ( "name", + "full_name", "email", "bio", "entries", diff --git a/example/tests/__snapshots__/test_openapi.ambr b/example/tests/__snapshots__/test_openapi.ambr index fb8c2abe..a0231471 100644 --- a/example/tests/__snapshots__/test_openapi.ambr +++ b/example/tests/__snapshots__/test_openapi.ambr @@ -104,6 +104,10 @@ "maxLength": 254, "type": "string" }, + "fullName": { + "maxLength": 50, + "type": "string" + }, "name": { "maxLength": 50, "type": "string" @@ -280,6 +284,24 @@ "type": "string" } }, + { + "description": "author_type", + "in": "query", + "name": "filter[authorType]", + "required": false, + "schema": { + "type": "string" + } + }, + { + "description": "name", + "in": "query", + "name": "filter[name]", + "required": false, + "schema": { + "type": "string" + } + }, { "description": "A search term.", "in": "query", @@ -399,6 +421,24 @@ "type": "string" } }, + { + "description": "author_type", + "in": "query", + "name": "filter[authorType]", + "required": false, + "schema": { + "type": "string" + } + }, + { + "description": "name", + "in": "query", + "name": "filter[name]", + "required": false, + "schema": { + "type": "string" + } + }, { "description": "A search term.", "in": "query", @@ -508,6 +548,10 @@ "maxLength": 254, "type": "string" }, + "fullName": { + "maxLength": 50, + "type": "string" + }, "name": { "maxLength": 50, "type": "string" @@ -515,6 +559,7 @@ }, "required": [ "name", + "fullName", "email" ], "type": "object" diff --git a/example/tests/test_format_keys.py b/example/tests/test_format_keys.py index b91cf595..d0e36d81 100644 --- a/example/tests/test_format_keys.py +++ b/example/tests/test_format_keys.py @@ -55,6 +55,7 @@ def test_options_format_field_names(db, client): data = response.json()["data"] expected_keys = { "name", + "fullName", "email", "bio", "entries", diff --git a/example/views.py b/example/views.py index 27ec6c2e..edb49ba8 100644 --- a/example/views.py +++ b/example/views.py @@ -222,6 +222,7 @@ class NoFiltersetEntryViewSet(EntryViewSet): class AuthorViewSet(ModelViewSet): queryset = Author.objects.all() + filterset_fields = ("author_type", "name") def get_serializer_class(self): serializer_classes = { diff --git a/rest_framework_json_api/django_filters/backends.py b/rest_framework_json_api/django_filters/backends.py index 73b4c578..365831c7 100644 --- a/rest_framework_json_api/django_filters/backends.py +++ b/rest_framework_json_api/django_filters/backends.py @@ -4,7 +4,7 @@ from rest_framework.exceptions import ValidationError from rest_framework.settings import api_settings -from rest_framework_json_api.utils import format_field_names, undo_format_field_name +from rest_framework_json_api.utils import format_field_name, undo_format_field_name class DjangoFilterBackend(DjangoFilterBackend): @@ -139,6 +139,6 @@ def get_schema_operation_parameters(self, view): result = super().get_schema_operation_parameters(view) for res in result: if "name" in res: - name = format_field_names(res["name"].replace("__", ".")) + name = format_field_name(res["name"].replace("__", ".")) res["name"] = "filter[{}]".format(name) return result pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy