Skip to content

Commit 7723162

Browse files
authored
Merge pull request #58 from metaforx/fix/nav-node-type-mismatch
fix: OpenAPI schema for nested navigation
2 parents cfb1271 + 6634b8a commit 7723162

File tree

2 files changed

+24
-2
lines changed

2 files changed

+24
-2
lines changed

djangocms_rest/serializers/menus.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ def get_children(self, obj: NavigationNode) -> list[dict]:
3030
def to_representation(self, obj: NavigationNode) -> dict:
3131
"""Customize the base representation of the NavigationNode."""
3232
return {
33+
"namespace": getattr(obj, "namespace", None),
3334
"title": obj.title,
3435
"url": get_absolute_frontend_url(self.request, obj.url),
3536
"api_endpoint": get_absolute_frontend_url(

djangocms_rest/views.py

Lines changed: 23 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -55,11 +55,12 @@
5555
location="query",
5656
description="Set to true to preview unpublished content (admin access required)",
5757
required=False,
58-
)
58+
),
5959
]
6060
)
6161

62-
except ImportError: # pragma: no cover
62+
except ImportError: # pragma: no cover
63+
6364
class OpenApiTypes:
6465
BOOL = "boolean"
6566
INT = "integer"
@@ -76,6 +77,7 @@ def __init__(self, *args, **kwargs):
7677
def extend_schema(*_args, **_kwargs): # pragma: no cover
7778
def _decorator(obj: T) -> T:
7879
return obj
80+
7981
return _decorator
8082

8183
def extend_placeholder_schema(func: Callable[P, T]) -> Callable[P, T]:
@@ -268,13 +270,32 @@ def get(self, request: Request) -> Response:
268270
return Response(definitions)
269271

270272

273+
try:
274+
from drf_spectacular.utils import extend_schema, OpenApiResponse
275+
276+
def method_schema_decorator(method):
277+
"""
278+
Decorator for adding OpenAPI schema to a method.
279+
Needed to force the schema to use many=True for NavigationNodeSerializer.
280+
"""
281+
return extend_schema(
282+
responses=OpenApiResponse(response=NavigationNodeSerializer(many=True))
283+
)(method)
284+
285+
except ImportError: # pragma: no cover
286+
287+
def method_schema_decorator(method): # pragma: no cover
288+
return method # pragma: no cover
289+
290+
271291
class MenuView(BaseAPIView):
272292
permission_classes = [IsAllowedPublicLanguage]
273293
serializer_class = NavigationNodeSerializer
274294

275295
tag = ShowMenu
276296
return_key = "children"
277297

298+
@method_schema_decorator
278299
def get(
279300
self,
280301
request: Request,

0 commit comments

Comments
 (0)