Skip to content

Commit 29d679a

Browse files
committed
Provide a JsonCompatible adapter for RichTextValue objects
1 parent 0ba390d commit 29d679a

File tree

5 files changed

+64
-6
lines changed

5 files changed

+64
-6
lines changed

news/1583.bugfix

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
Provide a JsonCompatible adapter for RichTextValue objects
2+
[erral]

src/plone/restapi/serializer/configure.zcml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,7 @@
6565
<adapter factory=".converters.persistent_list_converter" />
6666
<adapter factory=".converters.persistent_mapping_converter" />
6767
<adapter factory=".converters.python_datetime_converter" />
68+
<adapter factory=".converters.richtextvalue_converter" />
6869
<adapter factory=".converters.RichtextDXContextConverter" />
6970
<adapter factory=".converters.set_converter" />
7071
<adapter factory=".converters.bytes_converter" />

src/plone/restapi/serializer/converters.py

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -78,8 +78,7 @@ def default_converter(value):
7878
return value
7979

8080
raise TypeError(
81-
"No converter for making"
82-
" {!r} ({}) JSON compatible.".format(value, type(value))
81+
"No converter for making {!r} ({}) JSON compatible.".format(value, type(value))
8382
)
8483

8584

@@ -173,6 +172,12 @@ def timedelta_converter(value):
173172
return json_compatible(value.total_seconds())
174173

175174

175+
@adapter(IRichTextValue)
176+
@implementer(IJsonCompatible)
177+
def richtextvalue_converter(value):
178+
return json_compatible(value.output)
179+
180+
176181
@adapter(IRichTextValue, IDexterityContent)
177182
@implementer(IContextawareJsonCompatible)
178183
class RichtextDXContextConverter:
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
# -*- coding: utf-8 -*-
2+
3+
import unittest
4+
from plone.app.textfield import RichTextValue
5+
from plone.restapi.interfaces import IJsonCompatible
6+
from plone.restapi.testing import PLONE_RESTAPI_DX_INTEGRATION_TESTING
7+
8+
9+
class TestConverters(unittest.TestCase):
10+
11+
layer = PLONE_RESTAPI_DX_INTEGRATION_TESTING
12+
13+
def test_richtextvalue_converter(self):
14+
"""test that a RichTextValue is converted to a proper HTML"""
15+
html = "<p>This is a demo HTML</p>"
16+
value = RichTextValue(html, "text/html", "text/html")
17+
json_compatible_value = IJsonCompatible(value)
18+
self.assertEqual(json_compatible_value, html)

src/plone/restapi/tests/test_types.py

Lines changed: 36 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,9 @@ class ITaggedValuesSchema(model.Schema):
4646

4747
parametrized_widget_field = schema.TextLine(title="Parametrized widget field")
4848
form.widget(
49-
"parametrized_widget_field", a_param="some_value", defaultFactory=lambda: "Foo"
49+
"parametrized_widget_field",
50+
a_param="some_value",
51+
defaultFactory=lambda: "Foo",
5052
)
5153

5254
not_parametrized_widget_field = schema.TextLine(
@@ -459,7 +461,11 @@ def test_decimal(self):
459461

460462
def test_int(self):
461463
field = schema.Int(
462-
title="My field", description="My great field", min=0, max=100, default=50
464+
title="My field",
465+
description="My great field",
466+
min=0,
467+
max=100,
468+
default=50,
463469
)
464470
adapter = getMultiAdapter(
465471
(field, self.portal, self.request), IJsonSchemaProvider
@@ -742,9 +748,33 @@ def test_richtext(self):
742748
adapter.get_schema(),
743749
)
744750

751+
def test_richtext_with_default(self):
752+
field = RichText(
753+
title="My field",
754+
description="My great field",
755+
default="<p>Some default value</p>",
756+
)
757+
adapter = getMultiAdapter(
758+
(field, self.portal, self.request), IJsonSchemaProvider
759+
)
760+
761+
self.assertEqual(
762+
{
763+
"type": "string",
764+
"title": "My field",
765+
"factory": "Rich Text",
766+
"description": "My great field",
767+
"widget": "richtext",
768+
"default": "<p>Some default value</p>",
769+
},
770+
adapter.get_schema(),
771+
)
772+
745773
def test_date(self):
746774
field = schema.Date(
747-
title="My field", description="My great field", default=date(2016, 1, 1)
775+
title="My field",
776+
description="My great field",
777+
default=date(2016, 1, 1),
748778
)
749779
adapter = getMultiAdapter(
750780
(field, self.portal, self.request), IJsonSchemaProvider
@@ -781,7 +811,9 @@ def test_datetime(self):
781811

782812
def test_jsonfield(self):
783813
field = JSONField(
784-
title="My field", description="My great field", widget="my_widget_name"
814+
title="My field",
815+
description="My great field",
816+
widget="my_widget_name",
785817
)
786818
adapter = getMultiAdapter(
787819
(field, self.portal, self.request), IJsonSchemaProvider

0 commit comments

Comments
 (0)