From c232ca7acc1d626f7c6d945faf3cf9db5ecc5401 Mon Sep 17 00:00:00 2001 From: Marcus Weiner Date: Tue, 21 Jan 2025 17:42:43 +0100 Subject: [PATCH 1/3] Fix request OpenAPI schemas for nested models --- netbox/core/api/schema.py | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/netbox/core/api/schema.py b/netbox/core/api/schema.py index 663ee2899f2..11a39fff5f5 100644 --- a/netbox/core/api/schema.py +++ b/netbox/core/api/schema.py @@ -277,3 +277,21 @@ def map_serializer_field(self, auto_schema, direction): return component.ref if component else None else: return build_basic_type(OpenApiTypes.INT) + + +# Nested models can be passed by ID in requests +# The logic for this is handled in `BaseModelSerializer.to_internal_value` +class FixWritableNestedSerializerAllowPK(OpenApiSerializerFieldExtension): + target_class = 'netbox.api.serializers.BaseModelSerializer' + match_subclasses = True + + def map_serializer_field(self, auto_schema, direction): + schema = auto_schema._map_serializer_field(self.target, direction, bypass_extensions=True) + if direction == 'request' and self.target.nested: + return { + 'oneOf': [ + build_basic_type(OpenApiTypes.NUMBER), + schema, + ] + } + return schema From 640e438ef6598290162e2f2b24d2b7bc935eb721 Mon Sep 17 00:00:00 2001 From: Marcus Weiner Date: Wed, 22 Jan 2025 14:39:06 +0100 Subject: [PATCH 2/3] Add none check --- netbox/core/api/schema.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/netbox/core/api/schema.py b/netbox/core/api/schema.py index 11a39fff5f5..647446434a8 100644 --- a/netbox/core/api/schema.py +++ b/netbox/core/api/schema.py @@ -287,6 +287,8 @@ class FixWritableNestedSerializerAllowPK(OpenApiSerializerFieldExtension): def map_serializer_field(self, auto_schema, direction): schema = auto_schema._map_serializer_field(self.target, direction, bypass_extensions=True) + if schema is None: + return schema if direction == 'request' and self.target.nested: return { 'oneOf': [ From 7216a0d5ae663231859928f695665292dc8ff2a7 Mon Sep 17 00:00:00 2001 From: Marcus Weiner Date: Wed, 22 Jan 2025 17:25:24 +0100 Subject: [PATCH 3/3] Change PK type to int --- netbox/core/api/schema.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/netbox/core/api/schema.py b/netbox/core/api/schema.py index 647446434a8..e9655378d16 100644 --- a/netbox/core/api/schema.py +++ b/netbox/core/api/schema.py @@ -292,7 +292,7 @@ def map_serializer_field(self, auto_schema, direction): if direction == 'request' and self.target.nested: return { 'oneOf': [ - build_basic_type(OpenApiTypes.NUMBER), + build_basic_type(OpenApiTypes.INT), schema, ] }