-
-
Notifications
You must be signed in to change notification settings - Fork 4
/
transforms.py
144 lines (108 loc) · 4.65 KB
/
transforms.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
from plone.restapi.behaviors import IBlocks
from plone.restapi.deserializer.blocks import ResolveUIDDeserializerBase
from plone.restapi.interfaces import IBlockFieldDeserializationTransformer
from plone.restapi.interfaces import IBlockFieldSerializationTransformer
from plone.restapi.interfaces import IBlockVisitor
from plone.restapi.serializer.blocks import ResolveUIDSerializerBase
from plone.volto.bbb import IPloneSiteRoot
from zope.component import adapter
from zope.component import subscribers
from zope.interface import implementer
from zope.interface import Interface
from zope.publisher.interfaces.browser import IBrowserRequest
@implementer(IBlockVisitor)
@adapter(Interface, IBrowserRequest)
class NestedBlocksVisitor:
"""Visit nested blocks in columns, hrefList, or slides."""
def __init__(self, context, request):
pass
def __call__(self, block_value):
for nested_name in ("columns", "hrefList", "slides"):
nested_blocks = block_value.get(nested_name, [])
if not isinstance(nested_blocks, list):
continue
yield from nested_blocks
class NestedResolveUIDDeserializerBase(object):
"""The "url" smart block field for nested blocks
[Deprecated -- replaced by NestedBlocksVisitor above,
but the base class is still here in case someone extended it.]
This is a generic handler. In all blocks, it converts any "url"
field from using resolveuid to an "absolute" URL
"""
order = 1
block_type = None
def __init__(self, context, request):
self.context = context
self.request = request
def _transform(self, block):
"""this mutates the object directly"""
block_type = block.get("@type", "")
handlers = []
for h in subscribers(
(self.context, self.request), IBlockFieldDeserializationTransformer
):
if h.block_type == block_type or h.block_type is None:
h.blockid = block.get("id", None)
handlers.append(h)
for handler in sorted(handlers, key=lambda h: h.order):
block = handler(block)
return block
def __call__(self, block):
for nested_name in ["columns", "hrefList", "slides"]:
nested_blocks = block.get(nested_name, [])
if not isinstance(nested_blocks, list):
continue
for nested_block in nested_blocks:
self._transform(nested_block)
return block
class NestedResolveUIDSerializerBase(object):
"""
[Deprecated -- replaced by NestedBlocksVisitor above,
but the base class is still here in case someone extended it.]
"""
order = 1
block_type = None
def __init__(self, context, request):
self.context = context
self.request = request
def _transform(self, block):
"""this mutates the object directly"""
block_type = block.get("@type", "")
handlers = []
for h in subscribers(
(self.context, self.request), IBlockFieldSerializationTransformer
):
if h.block_type == block_type or h.block_type is None:
h.blockid = block.get("id", None)
handlers.append(h)
for handler in sorted(handlers, key=lambda h: h.order):
block = handler(block)
return block
def __call__(self, block):
for nested_name in ["columns", "hrefList", "slides"]:
nested_blocks = block.get(nested_name, [])
if not isinstance(nested_blocks, list):
continue
for nested_block in nested_blocks:
self._transform(nested_block)
return block
@adapter(IBlocks, IBrowserRequest)
@implementer(IBlockFieldDeserializationTransformer)
class PreviewImageResolveUIDDeserializer(ResolveUIDDeserializerBase):
"""Deserializer for resolveuid in preview_image field"""
fields = ["preview_image"]
@adapter(IPloneSiteRoot, IBrowserRequest)
@implementer(IBlockFieldDeserializationTransformer)
class PreviewImageResolveUIDDeserializerRoot(ResolveUIDDeserializerBase):
"""Deserializer for resolveuid in preview_image field on site root"""
fields = ["preview_image"]
@adapter(IBlocks, IBrowserRequest)
@implementer(IBlockFieldSerializationTransformer)
class PreviewImageResolveUIDSerializer(ResolveUIDSerializerBase):
"""Serializer for resolveuid in preview_image field"""
fields = ["preview_image"]
@adapter(IPloneSiteRoot, IBrowserRequest)
@implementer(IBlockFieldSerializationTransformer)
class PreviewImageResolveUIDSerializerRoot(ResolveUIDSerializerBase):
"""Serializer for resolveuid in preview_image field on site root"""
fields = ["preview_image"]