plone.tiles 3.0.0__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- plone/tiles/__init__.py +7 -0
- plone/tiles/absoluteurl.py +101 -0
- plone/tiles/configure.zcml +184 -0
- plone/tiles/data.py +422 -0
- plone/tiles/data.rst +179 -0
- plone/tiles/directives.py +13 -0
- plone/tiles/directives.rst +221 -0
- plone/tiles/esi.py +214 -0
- plone/tiles/esi.rst +325 -0
- plone/tiles/fieldtypeconverters.py +39 -0
- plone/tiles/interfaces.py +172 -0
- plone/tiles/meta.py +162 -0
- plone/tiles/meta.zcml +16 -0
- plone/tiles/test.pt +1 -0
- plone/tiles/testing.py +59 -0
- plone/tiles/tests/__init__.py +0 -0
- plone/tiles/tests/test_data.py +83 -0
- plone/tiles/tests/test_doctests.py +30 -0
- plone/tiles/tile.py +186 -0
- plone/tiles/tiles.rst +783 -0
- plone/tiles/type.py +39 -0
- plone.tiles-3.0.0-py3.13-nspkg.pth +1 -0
- plone_tiles-3.0.0.dist-info/LICENSE.GPL +339 -0
- plone_tiles-3.0.0.dist-info/LICENSE.txt +16 -0
- plone_tiles-3.0.0.dist-info/METADATA +1990 -0
- plone_tiles-3.0.0.dist-info/RECORD +29 -0
- plone_tiles-3.0.0.dist-info/WHEEL +5 -0
- plone_tiles-3.0.0.dist-info/namespace_packages.txt +1 -0
- plone_tiles-3.0.0.dist-info/top_level.txt +1 -0
plone/tiles/__init__.py
ADDED
@@ -0,0 +1,101 @@
|
|
1
|
+
from plone.tiles.data import encode
|
2
|
+
from plone.tiles.interfaces import ITileDataManager
|
3
|
+
from plone.tiles.interfaces import ITileType
|
4
|
+
from urllib import parse
|
5
|
+
from zope.annotation import IAnnotations
|
6
|
+
from zope.component import getMultiAdapter
|
7
|
+
from zope.component import queryUtility
|
8
|
+
from zope.traversing.browser.absoluteurl import AbsoluteURL
|
9
|
+
from zope.traversing.browser.interfaces import IAbsoluteURL
|
10
|
+
|
11
|
+
|
12
|
+
_safe = "@+"
|
13
|
+
|
14
|
+
|
15
|
+
class BaseTileAbsoluteURL(AbsoluteURL):
|
16
|
+
"""Convenience base class"""
|
17
|
+
|
18
|
+
def __str__(self):
|
19
|
+
tile = self.context
|
20
|
+
request = self.request
|
21
|
+
|
22
|
+
tid = tile.id
|
23
|
+
name = tile.__name__
|
24
|
+
context = tile.__parent__
|
25
|
+
|
26
|
+
if name is None or context is None:
|
27
|
+
raise TypeError("Insufficient context to determine URL")
|
28
|
+
|
29
|
+
tileFragment = "@@" + parse.quote(name.encode("utf-8"), _safe)
|
30
|
+
if tid:
|
31
|
+
tileFragment += "/" + parse.quote(tid.encode("utf-8"), _safe)
|
32
|
+
|
33
|
+
absolute_url = getMultiAdapter((context, request), IAbsoluteURL)
|
34
|
+
try:
|
35
|
+
tileFragment = "/".join([str(absolute_url), tileFragment])
|
36
|
+
except TypeError: # Not enough context to get URL information
|
37
|
+
pass
|
38
|
+
|
39
|
+
return tileFragment
|
40
|
+
|
41
|
+
def breadcrumbs(self):
|
42
|
+
tile = self.context
|
43
|
+
request = self.request
|
44
|
+
|
45
|
+
tid = tile.id
|
46
|
+
name = tile.__name__
|
47
|
+
context = tile.__parent__
|
48
|
+
|
49
|
+
tileFragment = "@@" + parse.quote(name.encode("utf-8"), _safe)
|
50
|
+
if tid:
|
51
|
+
tileFragment += "/" + parse.quote(tid.encode("utf-8"), _safe)
|
52
|
+
|
53
|
+
base = tuple(getMultiAdapter((context, request), IAbsoluteURL).breadcrumbs())
|
54
|
+
base += (
|
55
|
+
{
|
56
|
+
"name": name,
|
57
|
+
"url": "/".join([base[-1]["url"], tileFragment]),
|
58
|
+
},
|
59
|
+
)
|
60
|
+
|
61
|
+
return base
|
62
|
+
|
63
|
+
|
64
|
+
class TransientTileAbsoluteURL(BaseTileAbsoluteURL):
|
65
|
+
"""Absolute URL for a transient tile. Includes the tile traverser and
|
66
|
+
tile data encoded in the query string.
|
67
|
+
"""
|
68
|
+
|
69
|
+
def __str__(self):
|
70
|
+
url = super().__str__()
|
71
|
+
manager = ITileDataManager(self.context)
|
72
|
+
|
73
|
+
# Transient looking tile with id is only really transient
|
74
|
+
# if it caches its decoded query data in request annotations
|
75
|
+
transient = manager.storage == IAnnotations(self.request)
|
76
|
+
|
77
|
+
# When transient looking tile with id is not really transient,
|
78
|
+
# its data should not be encoded into query string
|
79
|
+
if self.context.id and not transient:
|
80
|
+
return url
|
81
|
+
|
82
|
+
# All tiles don't need / have configuration data at all.
|
83
|
+
data = manager.get()
|
84
|
+
if not data:
|
85
|
+
return url
|
86
|
+
|
87
|
+
# But when configuration data is really read from query string
|
88
|
+
# and not persisted, it should also be kept in query string
|
89
|
+
tileType = queryUtility(ITileType, name=self.context.__name__)
|
90
|
+
if tileType is not None and tileType.schema is not None:
|
91
|
+
if "?" in url:
|
92
|
+
url += "&" + encode(data, tileType.schema)
|
93
|
+
else:
|
94
|
+
url += "?" + encode(data, tileType.schema)
|
95
|
+
return url
|
96
|
+
|
97
|
+
|
98
|
+
class PersistentTileAbsoluteURL(BaseTileAbsoluteURL):
|
99
|
+
"""Absolute URL for a persistent tile. Includes the tile traverser, but no
|
100
|
+
tile data encoded in the query string.
|
101
|
+
"""
|
@@ -0,0 +1,184 @@
|
|
1
|
+
<configure
|
2
|
+
xmlns="http://namespaces.zope.org/zope"
|
3
|
+
xmlns:browser="http://namespaces.zope.org/browser"
|
4
|
+
xmlns:zcml="http://namespaces.zope.org/zcml"
|
5
|
+
i18n_domain="plone.tiles"
|
6
|
+
>
|
7
|
+
|
8
|
+
<!-- Data manager -->
|
9
|
+
<adapter factory=".data.transientTileDataManagerFactory" />
|
10
|
+
<adapter factory=".data.PersistentTileDataManager" />
|
11
|
+
<adapter factory=".data.defaultTileDataContext" />
|
12
|
+
<adapter factory=".data.defaultTileDataStorage" />
|
13
|
+
<adapter factory=".data.defaultPersistentTileDataStorage" />
|
14
|
+
|
15
|
+
<!-- Absolute URL -->
|
16
|
+
<view
|
17
|
+
name="absolute_url"
|
18
|
+
factory=".absoluteurl.TransientTileAbsoluteURL"
|
19
|
+
allowed_interface="zope.traversing.browser.interfaces.IAbsoluteURL"
|
20
|
+
for=".interfaces.ITile"
|
21
|
+
permission="zope.Public"
|
22
|
+
type="zope.publisher.interfaces.http.IHTTPRequest"
|
23
|
+
/>
|
24
|
+
|
25
|
+
<view
|
26
|
+
factory=".absoluteurl.TransientTileAbsoluteURL"
|
27
|
+
provides="zope.traversing.browser.interfaces.IAbsoluteURL"
|
28
|
+
for=".interfaces.ITile"
|
29
|
+
permission="zope.Public"
|
30
|
+
type="zope.publisher.interfaces.http.IHTTPRequest"
|
31
|
+
/>
|
32
|
+
|
33
|
+
<view
|
34
|
+
name="absolute_url"
|
35
|
+
factory=".absoluteurl.PersistentTileAbsoluteURL"
|
36
|
+
allowed_interface="zope.traversing.browser.interfaces.IAbsoluteURL"
|
37
|
+
for=".interfaces.IPersistentTile"
|
38
|
+
permission="zope.Public"
|
39
|
+
type="zope.publisher.interfaces.http.IHTTPRequest"
|
40
|
+
/>
|
41
|
+
|
42
|
+
<view
|
43
|
+
factory=".absoluteurl.PersistentTileAbsoluteURL"
|
44
|
+
provides="zope.traversing.browser.interfaces.IAbsoluteURL"
|
45
|
+
for=".interfaces.IPersistentTile"
|
46
|
+
permission="zope.Public"
|
47
|
+
type="zope.publisher.interfaces.http.IHTTPRequest"
|
48
|
+
/>
|
49
|
+
|
50
|
+
<!-- ESI -->
|
51
|
+
<browser:page
|
52
|
+
name="esi-head"
|
53
|
+
for=".interfaces.IESIRendered"
|
54
|
+
class=".esi.ESIHead"
|
55
|
+
permission="zope.Public"
|
56
|
+
/>
|
57
|
+
|
58
|
+
<browser:page
|
59
|
+
name="esi-body"
|
60
|
+
for=".interfaces.IESIRendered"
|
61
|
+
class=".esi.ESIBody"
|
62
|
+
permission="zope.Public"
|
63
|
+
/>
|
64
|
+
|
65
|
+
<configure zcml:condition="installed plone.protect">
|
66
|
+
<adapter
|
67
|
+
factory=".esi.ESIProtectTransform"
|
68
|
+
provides="plone.transformchain.interfaces.ITransform"
|
69
|
+
for=".esi.ESIHead
|
70
|
+
*"
|
71
|
+
name="plone.protect.autocsrf"
|
72
|
+
zcml:condition="installed plone.transformchain"
|
73
|
+
/>
|
74
|
+
|
75
|
+
<adapter
|
76
|
+
factory=".esi.ESIProtectTransform"
|
77
|
+
provides="plone.transformchain.interfaces.ITransform"
|
78
|
+
for=".esi.ESIBody
|
79
|
+
*"
|
80
|
+
name="plone.protect.autocsrf"
|
81
|
+
zcml:condition="installed plone.transformchain"
|
82
|
+
/>
|
83
|
+
|
84
|
+
<adapter
|
85
|
+
factory=".tile.TileProtectTransform"
|
86
|
+
provides="plone.transformchain.interfaces.ITransform"
|
87
|
+
for=".tile.Tile
|
88
|
+
*"
|
89
|
+
name="plone.protect.autocsrf"
|
90
|
+
zcml:condition="installed plone.transformchain"
|
91
|
+
/>
|
92
|
+
</configure>
|
93
|
+
|
94
|
+
<adapter
|
95
|
+
factory=".tile.TileThemingTransform"
|
96
|
+
provides="plone.transformchain.interfaces.ITransform"
|
97
|
+
for=".tile.Tile
|
98
|
+
*"
|
99
|
+
name="plone.tiles.tiletheming"
|
100
|
+
zcml:condition="installed plone.transformchain"
|
101
|
+
/>
|
102
|
+
|
103
|
+
<!-- Field Type converters -->
|
104
|
+
<adapter
|
105
|
+
factory="plone.tiles.fieldtypeconverters.NoConverter"
|
106
|
+
for="zope.schema.interfaces.IBytesLine"
|
107
|
+
/>
|
108
|
+
|
109
|
+
<adapter
|
110
|
+
factory="plone.tiles.fieldtypeconverters.NoConverter"
|
111
|
+
for="zope.schema.interfaces.IASCIILine"
|
112
|
+
/>
|
113
|
+
|
114
|
+
<adapter
|
115
|
+
factory="plone.tiles.fieldtypeconverters.NoConverter"
|
116
|
+
for="zope.schema.interfaces.ITextLine"
|
117
|
+
/>
|
118
|
+
|
119
|
+
<adapter
|
120
|
+
factory="plone.tiles.fieldtypeconverters.NoConverter"
|
121
|
+
for="zope.schema.interfaces.IURI"
|
122
|
+
/>
|
123
|
+
|
124
|
+
<adapter
|
125
|
+
factory="plone.tiles.fieldtypeconverters.NoConverter"
|
126
|
+
for="zope.schema.interfaces.IId"
|
127
|
+
/>
|
128
|
+
|
129
|
+
<adapter
|
130
|
+
factory="plone.tiles.fieldtypeconverters.NoConverter"
|
131
|
+
for="zope.schema.interfaces.IDottedName"
|
132
|
+
/>
|
133
|
+
|
134
|
+
<adapter
|
135
|
+
factory="plone.tiles.fieldtypeconverters.NoConverter"
|
136
|
+
for="zope.schema.interfaces.IChoice"
|
137
|
+
/>
|
138
|
+
|
139
|
+
<adapter
|
140
|
+
factory="plone.tiles.fieldtypeconverters.TextConverter"
|
141
|
+
for="zope.schema.interfaces.IBytes"
|
142
|
+
/>
|
143
|
+
|
144
|
+
<adapter
|
145
|
+
factory="plone.tiles.fieldtypeconverters.TextConverter"
|
146
|
+
for="zope.schema.interfaces.IText"
|
147
|
+
/>
|
148
|
+
|
149
|
+
<adapter
|
150
|
+
factory="plone.tiles.fieldtypeconverters.TextConverter"
|
151
|
+
for="zope.schema.interfaces.IASCII"
|
152
|
+
/>
|
153
|
+
|
154
|
+
<adapter
|
155
|
+
factory="plone.tiles.fieldtypeconverters.LongConverter"
|
156
|
+
for="zope.schema.interfaces.IInt"
|
157
|
+
/>
|
158
|
+
|
159
|
+
<adapter
|
160
|
+
factory="plone.tiles.fieldtypeconverters.FloatConverter"
|
161
|
+
for="zope.schema.interfaces.IFloat"
|
162
|
+
/>
|
163
|
+
|
164
|
+
<adapter
|
165
|
+
factory="plone.tiles.fieldtypeconverters.BoolConverter"
|
166
|
+
for="zope.schema.interfaces.IBool"
|
167
|
+
/>
|
168
|
+
|
169
|
+
<adapter
|
170
|
+
factory="plone.tiles.fieldtypeconverters.TupleConverter"
|
171
|
+
for="zope.schema.interfaces.ITuple"
|
172
|
+
/>
|
173
|
+
|
174
|
+
<adapter
|
175
|
+
factory="plone.tiles.fieldtypeconverters.ListConverter"
|
176
|
+
for="zope.schema.interfaces.IList"
|
177
|
+
/>
|
178
|
+
|
179
|
+
<adapter
|
180
|
+
factory="plone.tiles.fieldtypeconverters.DictConverter"
|
181
|
+
for="zope.schema.interfaces.IDict"
|
182
|
+
/>
|
183
|
+
|
184
|
+
</configure>
|