Skip to content

Commit 91168d4

Browse files
authored
Merge branch 'main' into feat/immediate-placeholder-content
2 parents 796080d + 6b3b2d6 commit 91168d4

File tree

4 files changed

+33
-10
lines changed

4 files changed

+33
-10
lines changed

djangocms_rest/serializers/menus.py

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,12 +28,19 @@ def get_children(self, obj: NavigationNode) -> list[dict]:
2828

2929
def to_representation(self, obj: NavigationNode) -> dict:
3030
"""Customize the base representation of the NavigationNode."""
31+
path = getattr(obj, "api_endpoint", "")
32+
api_endpoint = get_absolute_frontend_url(self.request, path) if path else ""
33+
if self.request._preview_mode:
34+
if "?" in api_endpoint:
35+
api_endpoint += "&preview=1"
36+
else:
37+
api_endpoint += "?preview=1"
3138
return {
3239
"namespace": getattr(obj, "namespace", None),
3340
"title": obj.title,
3441
"url": get_absolute_frontend_url(self.request, obj.url) or "",
35-
"api_endpoint": get_absolute_frontend_url(self.request, getattr(obj, "api_endpoint", None)) or "",
36-
"path": getattr(obj, "api_endpoint", ""),
42+
"api_endpoint": api_endpoint,
43+
"path": path,
3744
"visible": obj.visible,
3845
"selected": obj.selected or obj.attr.get("is_home", False) and getattr(self.request, "is_home", False),
3946
"attr": obj.attr,

djangocms_rest/serializers/pages.py

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
from django.db import models
22

33
from cms.models import PageContent
4+
from cms.utils.placeholder import get_declared_placeholders_for_obj
45

56
from rest_framework import serializers
67

@@ -42,6 +43,11 @@ def get_base_representation(self, page_content: PageContent) -> dict:
4243
path = page_content.page.get_path(page_content.language)
4344
absolute_url = get_absolute_frontend_url(request, path)
4445
api_endpoint = get_absolute_frontend_url(request, page_content.page.get_api_endpoint(page_content.language))
46+
if self.is_preview:
47+
if "?" in api_endpoint:
48+
api_endpoint += "&preview=1"
49+
else:
50+
api_endpoint += "?preview=1"
4551
redirect = str(page_content.redirect or "")
4652
xframe_options = str(page_content.xframe_options or "")
4753
application_namespace = str(page_content.page.application_namespace or "")
@@ -132,7 +138,7 @@ def __init__(self, *args, **kwargs):
132138
self.request = self.context.get("request")
133139

134140
def to_representation(self, page_content: PageContent) -> dict:
135-
declared_slots = [placeholder.slot for placeholder in page_content.page.get_declared_placeholders()]
141+
declared_slots = [placeholder.slot for placeholder in get_declared_placeholders_for_obj(page_content)]
136142
placeholders = [
137143
placeholder for placeholder in page_content.placeholders.all() if placeholder.slot in declared_slots
138144
]

djangocms_rest/views.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -177,7 +177,7 @@ def get(self, request: Request, language: str, path: str = "") -> Response:
177177

178178
try:
179179
page_content = getattr(page, self.content_getter)(language, fallback=True)
180-
if page_content is None:
180+
if not page_content:
181181
raise PageContent.DoesNotExist()
182182
serializer = self.serializer_class(page_content, read_only=True, context={"request": request})
183183
return Response(serializer.data)

djangocms_rest/views_base.py

Lines changed: 16 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,9 @@
22

33
from django.contrib.sites.shortcuts import get_current_site
44
from django.utils.functional import cached_property
5+
6+
from cms.toolbar.toolbar import CMSToolbar
7+
58
from rest_framework.generics import ListAPIView
69
from rest_framework.permissions import IsAdminUser
710
from rest_framework.views import APIView
@@ -65,12 +68,19 @@ def site(self):
6568
return site if site is not None else get_current_site(self.request)
6669

6770
def _preview_requested(self):
68-
preview_mode = "preview" in self.request.GET and self.request.GET.get("preview", "").lower() not in (
69-
"0",
70-
"false",
71-
)
72-
self.request.toolbar.preview_mode_active = preview_mode
73-
return preview_mode
71+
if not hasattr(self.request, "_preview_mode"):
72+
# Cache to not re-generate toolbar object for preview requests
73+
self.request._preview_mode = "preview" in self.request.GET and self.request.GET.get(
74+
"preview", ""
75+
).lower() not in (
76+
"0",
77+
"false",
78+
)
79+
if self.request._preview_mode:
80+
if not hasattr(self.request, "toolbar"): # Create toolbar if not present to mark preview mode
81+
self.request.toolbar = CMSToolbar(self.request)
82+
self.request.toolbar.preview_mode_active = True
83+
return self.request._preview_mode
7484

7585
@property
7686
def content_getter(self):

0 commit comments

Comments
 (0)