Skip to content

Commit 867277b

Browse files
authored
add preview endpoints
Feature/content preview api
2 parents f57208d + 3385e07 commit 867277b

File tree

10 files changed

+1380
-76
lines changed

10 files changed

+1380
-76
lines changed

.gitignore

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -161,3 +161,8 @@ cython_debug/
161161
/.idea/vcs.xml
162162
/.idea/.gitignore
163163
/.python-version
164+
.idea/djangocms-rest.iml
165+
.idea/misc.xml
166+
.idea/modules.xml
167+
.idea/inspectionProfiles/profiles_settings.xml
168+
.idea/inspectionProfiles/Project_Default.xml

djangocms_rest/serializers/pages.py

Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -132,3 +132,69 @@ def to_representation(self, page_content: PageContent) -> Dict:
132132
"is_home": page_content.page.is_home,
133133
"languages": page_content.page.languages.split(","),
134134
}
135+
136+
137+
class PreviewPageContentSerializer(PageContentSerializer):
138+
"""Serializer specifically for preview/draft page content"""
139+
140+
def to_representation(self, page_content: PageContent) -> Dict:
141+
# Get placeholders directly from the page_content
142+
# This avoids the extra query to get_declared_placeholders
143+
placeholders = page_content.placeholders.all()
144+
145+
placeholders_data = [
146+
{
147+
"content_type_id": placeholder.content_type_id,
148+
"object_id": placeholder.object_id,
149+
"slot": placeholder.slot,
150+
}
151+
for placeholder in placeholders
152+
]
153+
154+
relative_url = page_content.page.get_absolute_url(page_content.language)
155+
156+
return {
157+
"title": page_content.title,
158+
"page_title": page_content.page_title or page_content.title,
159+
"menu_title": page_content.menu_title or page_content.title,
160+
"meta_description": page_content.meta_description,
161+
"redirect": page_content.redirect,
162+
"placeholders": PlaceholderRelationSerializer(placeholders_data, many=True, context=self.context).data,
163+
"in_navigation": page_content.in_navigation,
164+
"soft_root": page_content.soft_root,
165+
"template": page_content.template,
166+
"xframe_options": page_content.xframe_options,
167+
"limit_visibility_in_menu": page_content.limit_visibility_in_menu,
168+
"language": page_content.language,
169+
"path": relative_url,
170+
"is_home": page_content.page.is_home,
171+
"languages": page_content.page.languages.split(","),
172+
"is_preview": True,
173+
"creation_date": page_content.creation_date,
174+
}
175+
176+
177+
class PageListSerializer(BasePageSerializer):
178+
def __init__(self, *args, **kwargs):
179+
super().__init__(*args, **kwargs)
180+
self.request = self.context.get("request")
181+
182+
def to_representation(self, page_content: PageContent) -> Dict:
183+
relative_url = page_content.page.get_absolute_url(page_content.language)
184+
185+
return {
186+
"title": page_content.title,
187+
"page_title": page_content.page_title or page_content.title,
188+
"menu_title": page_content.menu_title or page_content.title,
189+
"meta_description": page_content.meta_description,
190+
"redirect": page_content.redirect,
191+
"in_navigation": page_content.in_navigation,
192+
"soft_root": page_content.soft_root,
193+
"template": page_content.template,
194+
"xframe_options": page_content.xframe_options,
195+
"limit_visibility_in_menu": page_content.limit_visibility_in_menu,
196+
"language": page_content.language,
197+
"path": relative_url,
198+
"is_home": page_content.page.is_home,
199+
"languages": page_content.page.languages.split(","),
200+
}

djangocms_rest/urls.py

Lines changed: 64 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,74 @@
11
from django.urls import path
22

3-
from djangocms_rest.views import LanguageListView, PageDetailView, PageTreeListView, PlaceholderDetailView
3+
from djangocms_rest.views import (
4+
LanguageListView,
5+
PageDetailView,
6+
PageListView,
7+
PageTreeListView,
8+
PlaceholderDetailView,
9+
PreviewPageView,
10+
PreviewPlaceholderDetailView,
11+
PreviewPageTreeListView,
12+
PreviewPageListView,
13+
)
414

515
urlpatterns = [
6-
path("languages/", LanguageListView.as_view(), name="language-list"),
7-
path("<slug:language>/pages-tree/", PageTreeListView.as_view(), name="page-tree-list"),
8-
path("<slug:language>/pages-root/", PageDetailView.as_view(), name="page-root"),
9-
path("<slug:language>/pages/<path:path>/", PageDetailView.as_view(), name="page-detail"),
16+
# Published content endpoints
17+
path(
18+
"languages/",
19+
LanguageListView.as_view(),
20+
name="language-list",
21+
),
22+
path(
23+
"<slug:language>/pages-tree/",
24+
PageTreeListView.as_view(),
25+
name="page-tree-list",
26+
),
27+
path(
28+
"<slug:language>/pages-list/",
29+
PageListView.as_view(),
30+
name="page-list",
31+
),
32+
path(
33+
"<slug:language>/pages-root/",
34+
PageDetailView.as_view(),
35+
name="page-root",
36+
),
37+
path(
38+
"<slug:language>/pages/<path:path>/",
39+
PageDetailView.as_view(),
40+
name="page-detail",
41+
),
1042
path(
1143
"<slug:language>/placeholders/<int:content_type_id>/<int:object_id>/<str:slot>/",
1244
PlaceholderDetailView.as_view(),
1345
name="placeholder-detail",
1446
),
47+
48+
# Preview content endpoints
49+
path(
50+
"preview/<slug:language>/pages-root/",
51+
PreviewPageView.as_view(),
52+
name="preview-page-root",
53+
),
54+
path(
55+
"preview/<slug:language>/pages-tree/",
56+
PreviewPageTreeListView.as_view(),
57+
name="preview-page-tree",
58+
),
59+
path(
60+
"preview/<slug:language>/pages-list/",
61+
PreviewPageListView.as_view(),
62+
name="preview-page-list",
63+
),
64+
path(
65+
"preview/<slug:language>/pages/<path:path>/",
66+
PreviewPageView.as_view(),
67+
name="preview-page",
68+
),
69+
path(
70+
"preview/<slug:language>/placeholders/<int:content_type_id>/<int:object_id>/<str:slot>/",
71+
PreviewPlaceholderDetailView.as_view(),
72+
name="preview-placeholder-detail",
73+
),
1574
]

djangocms_rest/utils.py

Lines changed: 0 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -17,13 +17,3 @@ def get_object(site: Site, path: str) -> Page:
1717
else:
1818
page.urls_cache = {url.language: url for url in page_urls}
1919
return page
20-
21-
def get_placeholder(content_type_id: int, object_id: int, slot:str) -> Placeholder:
22-
try:
23-
placeholder = Placeholder.objects.get(
24-
content_type_id=content_type_id, object_id=object_id, slot=slot
25-
)
26-
except Placeholder.DoesNotExist:
27-
raise Http404
28-
return placeholder
29-

0 commit comments

Comments
 (0)