Skip to content

Commit 61e6153

Browse files
committed
Unify rendering
1 parent eeb624d commit 61e6153

File tree

2 files changed

+82
-97
lines changed

2 files changed

+82
-97
lines changed

djangocms_rest/plugin_rendering.py

Lines changed: 75 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,16 @@
11
from typing import Any, Dict, Iterable, Optional, TypeVar
22

3+
from django.contrib.sites.shortcuts import get_current_site
34
from django.db import models
4-
from django.utils.html import escape, escapejs, mark_safe
5+
from django.utils.html import escape, mark_safe
56

7+
from cms.models import Placeholder
68
from cms.plugin_rendering import ContentRenderer
7-
from rest_framework import serializers
9+
from cms.utils.plugins import get_plugins
810

11+
from rest_framework import serializers
912
from djangocms_rest.serializers.placeholders import PlaceholderSerializer
13+
from djangocms_rest.serializers.utils.cache import get_placeholder_rest_cache, set_placeholder_rest_cache
1014

1115

1216
base_exclude = {
@@ -49,7 +53,7 @@ def get_auto_model_serializer(model_class: type[ModelType]) -> type:
4953
)
5054

5155

52-
def render_cms_plugin(
56+
def serialize_cms_plugin(
5357
instance: Optional[Any], context: Dict[str, Any]
5458
) -> Optional[Dict[str, Any]]:
5559
if not instance or not hasattr(instance, "get_plugin_instance"):
@@ -168,7 +172,7 @@ def highlight_list(json_data: list) -> dict[str, str]:
168172

169173
class RESTRenderer(ContentRenderer):
170174
"""
171-
A custom renderer that uses the render_cms_plugin function to render
175+
A custom renderer that uses the serialize_cms_plugin function to render
172176
CMS plugins in a RESTful way.
173177
"""
174178
placeholder_edit_template = "{content}{plugin_js}{placeholder_js}"
@@ -177,9 +181,9 @@ def render_plugin(
177181
self, instance, context, placeholder=None, editable: bool = False
178182
):
179183
"""
180-
Render a CMS plugin instance using the render_cms_plugin function.
184+
Render a CMS plugin instance using the serialize_cms_plugin function.
181185
"""
182-
data = render_cms_plugin(instance, context) or {}
186+
data = serialize_cms_plugin(instance, context) or {}
183187
children = [
184188
self.render_plugin(
185189
child, context, placeholder=placeholder, editable=editable
@@ -234,3 +238,68 @@ def get_plugins_and_placeholder_lot(
234238
placeholder, language, context, editable=editable, template=template
235239
)
236240
yield f'<div class="cms-placeholder cms-placeholder-{placeholder.pk}"></div>'
241+
242+
def serialize_placeholder(self, placeholder, context, language, use_cache=True):
243+
context.update({"request": self.request})
244+
if use_cache and placeholder.cache_placeholder:
245+
use_cache = self.placeholder_cache_is_enabled()
246+
else:
247+
use_cache = False
248+
249+
if use_cache:
250+
cached_value = get_placeholder_rest_cache(
251+
placeholder,
252+
lang=language,
253+
site_id=get_current_site(self.request).pk,
254+
request=self.request,
255+
)
256+
else:
257+
cached_value = None
258+
259+
if cached_value is not None:
260+
# User has opted to use the cache
261+
# and there is something in the cache
262+
return cached_value["content"]
263+
264+
plugin_content = self.serialize_plugins(
265+
placeholder,
266+
language=language,
267+
context=context,
268+
)
269+
270+
if use_cache:
271+
set_placeholder_rest_cache(
272+
placeholder,
273+
lang=language,
274+
site_id=get_current_site(self.request).pk,
275+
content=plugin_content,
276+
request=self.request,
277+
)
278+
279+
if placeholder.pk not in self._rendered_placeholders:
280+
# First time this placeholder is rendered
281+
self._rendered_placeholders[placeholder.pk] = plugin_content
282+
283+
return plugin_content
284+
285+
def serialize_plugins(
286+
self, placeholder: Placeholder, language: str, context: dict
287+
) -> list:
288+
plugins = get_plugins(
289+
self.request,
290+
placeholder=placeholder,
291+
lang=language,
292+
template=None,
293+
)
294+
295+
def serialize_children(child_plugins):
296+
for plugin in child_plugins:
297+
plugin_content = serialize_cms_plugin(plugin, context)
298+
if getattr(plugin, "child_plugin_instances", None):
299+
plugin_content["children"] = serialize_children(
300+
plugin.child_plugin_instances
301+
)
302+
if plugin_content:
303+
yield plugin_content
304+
305+
return list(serialize_children(plugins))

djangocms_rest/serializers/placeholders.py

Lines changed: 7 additions & 91 deletions
Original file line numberDiff line numberDiff line change
@@ -1,93 +1,7 @@
1-
from cms.models import Placeholder
2-
from cms.plugin_rendering import BaseRenderer
3-
from cms.utils.conf import get_cms_setting
4-
from cms.utils.plugins import get_plugins
5-
from django.contrib.sites.shortcuts import get_current_site
1+
from django.template import Context
62
from rest_framework import serializers
73

8-
from djangocms_rest.serializers.utils.cache import (
9-
get_placeholder_rest_cache,
10-
set_placeholder_rest_cache,
11-
)
12-
from djangocms_rest.serializers.utils.render import render_html, render_plugin
13-
14-
15-
class PlaceholderRenderer(BaseRenderer):
16-
"""
17-
The `PlaceholderRenderer` class is a custom renderer that renders a placeholder object.
18-
"""
19-
20-
def placeholder_cache_is_enabled(self):
21-
if not get_cms_setting("PLACEHOLDER_CACHE"):
22-
return False
23-
if self.request.user.is_staff:
24-
return False
25-
return True
26-
27-
def render_placeholder(self, placeholder, context, language, use_cache=True):
28-
context.update({"request": self.request})
29-
if use_cache and placeholder.cache_placeholder:
30-
use_cache = self.placeholder_cache_is_enabled()
31-
else:
32-
use_cache = False
33-
34-
if use_cache:
35-
cached_value = get_placeholder_rest_cache(
36-
placeholder,
37-
lang=language,
38-
site_id=get_current_site(self.request).pk,
39-
request=self.request,
40-
)
41-
else:
42-
cached_value = None
43-
44-
if cached_value is not None:
45-
# User has opted to use the cache
46-
# and there is something in the cache
47-
return cached_value["content"]
48-
49-
plugin_content = self.render_plugins(
50-
placeholder,
51-
language=language,
52-
context=context,
53-
)
54-
55-
if use_cache:
56-
set_placeholder_rest_cache(
57-
placeholder,
58-
lang=language,
59-
site_id=get_current_site(self.request).pk,
60-
content=plugin_content,
61-
request=self.request,
62-
)
63-
64-
if placeholder.pk not in self._rendered_placeholders:
65-
# First time this placeholder is rendered
66-
self._rendered_placeholders[placeholder.pk] = plugin_content
67-
68-
return plugin_content
69-
70-
def render_plugins(
71-
self, placeholder: Placeholder, language: str, context: dict
72-
) -> list:
73-
plugins = get_plugins(
74-
self.request,
75-
placeholder=placeholder,
76-
lang=language,
77-
template=None,
78-
)
79-
80-
def render_children(child_plugins):
81-
for plugin in child_plugins:
82-
plugin_content = render_plugin(plugin, context)
83-
if getattr(plugin, "child_plugin_instances", None):
84-
plugin_content["children"] = render_children(
85-
plugin.child_plugin_instances
86-
)
87-
if plugin_content:
88-
yield plugin_content
89-
90-
return list(render_children(plugins))
4+
from djangocms_rest.serializers.utils.render import render_html
915

926

937
class PlaceholderSerializer(serializers.Serializer):
@@ -108,10 +22,12 @@ def __init__(self, *args, **kwargs):
10822

10923
if placeholder and request and language:
11024
if render_plugins:
111-
renderer = PlaceholderRenderer(request)
112-
placeholder.content = renderer.render_placeholder(
25+
from djangocms_rest.plugin_rendering import RESTRenderer
26+
27+
renderer = RESTRenderer(request)
28+
placeholder.content = renderer.serialize_placeholder(
11329
placeholder,
114-
context={},
30+
context=Context({"request": request}),
11531
language=language,
11632
use_cache=True,
11733
)

0 commit comments

Comments
 (0)