Skip to content

Commit f3c402d

Browse files
committed
feat: template management view
1 parent 31b201c commit f3c402d

File tree

20 files changed

+641
-123
lines changed

20 files changed

+641
-123
lines changed

bobtemplate.cfg

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,3 +3,7 @@ version = 6.0.13
33
template = plone_addon
44
git_init = True
55
python = python3
6+
7+
package.dottedname = cs_dynamicpages
8+
package.browserlayer = BrowserLayer
9+

src/cs_dynamicpages/api/services/apply_template/configure.zcml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
method="POST"
99
factory=".post.ApplyTemplatePost"
1010
for="zope.interface.Interface"
11-
permission="zope2.View"
11+
permission="cmf.ModifyPortalContent"
1212
name="@apply-template"
1313
/>
1414

src/cs_dynamicpages/api/services/templates/configure.zcml

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,17 @@
88
method="POST"
99
factory=".post.TemplatesPost"
1010
for="zope.interface.Interface"
11-
permission="zope2.View"
11+
permission="cmf.ModifyPortalContent"
1212
name="@templates"
1313
/>
1414

15+
<plone:service
16+
method="DELETE"
17+
factory=".delete.TemplatesDelete"
18+
for="zope.interface.Interface"
19+
permission="cmf.ModifyPortalContent"
20+
name="@templates"
21+
/>
22+
23+
1524
</configure>
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
from cs_dynamicpages import _
2+
from cs_dynamicpages.templates import Manager
3+
from plone.app.uuid.utils import uuidToObject
4+
from plone.restapi.deserializer import json_body
5+
from plone.restapi.services import Service
6+
from zope.i18n import translate
7+
from zope.interface import alsoProvides
8+
from plone.protect.interfaces import IDisableCSRFProtection
9+
10+
11+
class TemplatesDelete(Service):
12+
def reply(self):
13+
body = json_body(self.request)
14+
uid = body.get("uid")
15+
if uid is None or not uid.strip():
16+
self.request.response.setStatus(400)
17+
return {
18+
"error": {
19+
"type": "Bad Request",
20+
"message": translate(_("UID is required"), context=self.request),
21+
}
22+
}
23+
24+
alsoProvides(self.request, IDisableCSRFProtection)
25+
manager = Manager(self.context)
26+
result = manager.delete_template(uid)
27+
if result:
28+
return self.reply_no_content()
29+
30+
self.request.response.setStatus(400)
31+
return {
32+
"error": {
33+
"type": "Bad Request",
34+
"message": translate(_("Content does not exist"), context=self.request),
35+
}
36+
}

src/cs_dynamicpages/browser/static/templates.js

Lines changed: 41 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,38 @@ async function applyTemplate(uid) {
3030
}
3131
}
3232

33+
async function deleteTemplate(uid) {
34+
// The data we want to send
35+
const data = {
36+
uid: uid,
37+
};
38+
39+
try {
40+
// Make the request using fetch()
41+
let base_url = document.getElementsByTagName("body")[0].dataset["baseUrl"];
42+
const response = await fetch(`${base_url}/@templates`, {
43+
method: "DELETE", // Request method
44+
headers: {
45+
"Content-Type": "application/json",
46+
Accept: "application/json", // Type of data we are sending
47+
},
48+
body: JSON.stringify(data), // Convert data to JSON string
49+
});
50+
51+
// Handle the server's response
52+
if (response.ok) {
53+
sessionStorage.setItem("toast-message", "Template deleted succesfuly.");
54+
location.reload();
55+
} else {
56+
console.error("Server error:", response.status);
57+
alert("An error occurred while sending data.");
58+
}
59+
} catch (error) {
60+
// Handle network errors
61+
console.error("Network error:", error);
62+
}
63+
}
64+
3365
async function sendData(uid, name) {
3466
// The data we want to send
3567
const data = {
@@ -76,11 +108,17 @@ try {
76108
Array.from(document.getElementsByClassName("apply-template")).forEach(
77109
(element) => {
78110
element.addEventListener("click", (event) => {
79-
console.log(event.target);
80-
console.log(event.target.dataset);
81111
let target_uid = event.target.dataset["uid"];
82-
83112
applyTemplate(target_uid);
84113
});
85114
},
86115
);
116+
117+
Array.from(document.getElementsByClassName("confirmDeleteElement")).forEach(
118+
(element) => {
119+
element.addEventListener("click", (event) => {
120+
let target_uid = event.target.dataset["uid"];
121+
deleteTemplate(target_uid);
122+
});
123+
},
124+
);

src/cs_dynamicpages/locales/__main__.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,9 @@
1515

1616
locale_path = Path(__file__).parent.resolve()
1717
target_path = locale_path.parent.resolve()
18-
domains = [path.name[:-4] for path in locale_path.glob("*.pot")]
18+
domains = [
19+
path.name[:-4] for path in locale_path.glob("*.pot") if path.name[:-4] != "plone"
20+
]
1921

2022
i18ndude = "uvx i18ndude"
2123

@@ -63,6 +65,7 @@ def main():
6365
locale_folder_setup(domain)
6466
_rebuild(domain)
6567
_sync(domain)
68+
_sync("plone")
6669

6770

6871
if __name__ == "__main__":

src/cs_dynamicpages/locales/cs_dynamicpages.pot

Lines changed: 80 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
msgid ""
55
msgstr ""
66
"Project-Id-Version: PACKAGE VERSION\n"
7-
"POT-Creation-Date: 2025-11-10 15:42+0000\n"
7+
"POT-Creation-Date: 2026-02-20 14:03+0000\n"
88
"PO-Revision-Date: YEAR-MO-DA HO:MI +ZONE\n"
99
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
1010
"Language-Team: LANGUAGE <LL@li.org>\n"
@@ -33,19 +33,24 @@ msgstr ""
3333
msgid "4"
3434
msgstr ""
3535

36-
#: cs_dynamicpages/views/dynamic_view.pt:279
36+
#: cs_dynamicpages/views/dynamic_view.pt:315
3737
msgid "Add featured"
3838
msgstr ""
3939

40-
#: cs_dynamicpages/views/dynamic_view.pt:337
40+
#: cs_dynamicpages/views/dynamic_view.pt:374
4141
msgid "Add new row"
4242
msgstr ""
4343

44-
#: cs_dynamicpages/views/dynamic_view.pt:309
44+
#: cs_dynamicpages/views/dynamic_view.pt:345
4545
msgid "Add row"
4646
msgstr ""
4747

48-
#: cs_dynamicpages/views/dynamic_view.pt:392
48+
#: cs_dynamicpages/views/dynamic_view.pt:418
49+
msgid "Apply this template"
50+
msgstr ""
51+
52+
#: cs_dynamicpages/views/dynamic_pages_template_management.pt:67
53+
#: cs_dynamicpages/views/dynamic_view.pt:475
4954
msgid "Are you sure you want to delete this item? This action cannot be undone."
5055
msgstr ""
5156

@@ -57,23 +62,37 @@ msgstr ""
5762
msgid "CSS class for the spacer"
5863
msgstr ""
5964

60-
#: cs_dynamicpages/views/dynamic_view.pt:395
65+
#: cs_dynamicpages/views/dynamic_pages_template_management.pt:70
66+
#: cs_dynamicpages/views/dynamic_view.pt:478
6167
msgid "Cancel"
6268
msgstr ""
6369

64-
#: cs_dynamicpages/views/dynamic_view.pt:341
70+
#: cs_dynamicpages/views/dynamic_pages_template_management.pt:59
71+
#: cs_dynamicpages/views/dynamic_view.pt:378
6572
msgid "Close"
6673
msgstr ""
6774

6875
#: cs_dynamicpages/behaviors/row_columns.py:21
6976
msgid "Column count"
7077
msgstr ""
7178

72-
#: cs_dynamicpages/views/dynamic_view.pt:380
79+
#: cs_dynamicpages/views/dynamic_pages_template_management.pt:55
80+
#: cs_dynamicpages/views/dynamic_view.pt:463
7381
msgid "Confirm Deletion"
7482
msgstr ""
7583

76-
#: cs_dynamicpages/views/dynamic_view.pt:83
84+
#: cs_dynamicpages/api/services/apply_template/post.py:59
85+
#: cs_dynamicpages/api/services/templates/delete.py:34
86+
#: cs_dynamicpages/api/services/templates/post.py:38
87+
msgid "Content does not exist"
88+
msgstr ""
89+
90+
#: cs_dynamicpages/views/dynamic_pages_template_management.pt:33
91+
msgid "Content title"
92+
msgstr ""
93+
94+
#: cs_dynamicpages/views/dynamic_pages_template_management.pt:39
95+
#: cs_dynamicpages/views/dynamic_view.pt:116
7796
msgid "Delete"
7897
msgstr ""
7998

@@ -83,7 +102,15 @@ msgstr ""
83102
msgid "Dynamic Pages Control Panel"
84103
msgstr ""
85104

86-
#: cs_dynamicpages/views/configure.zcml:29
105+
#: cs_dynamicpages/behaviors/templates.py:37
106+
msgid "Dynamic Pages Templates"
107+
msgstr ""
108+
109+
#: cs_dynamicpages/views/dynamic_pages_template_management.pt:11
110+
msgid "Dynamic Pages Templates management"
111+
msgstr ""
112+
113+
#: cs_dynamicpages/views/configure.zcml:38
87114
msgid "Dynamic view"
88115
msgstr ""
89116

@@ -99,11 +126,11 @@ msgstr ""
99126
msgid "DynamicPageRowFeatured"
100127
msgstr ""
101128

102-
#: cs_dynamicpages/views/dynamic_view.pt:69
129+
#: cs_dynamicpages/views/dynamic_view.pt:102
103130
msgid "Edit"
104131
msgstr ""
105132

106-
#: cs_dynamicpages/views/dynamic_view.pt:29
133+
#: cs_dynamicpages/views/dynamic_view.pt:47
107134
msgid "Edit Mode"
108135
msgstr ""
109136

@@ -175,19 +202,23 @@ msgstr ""
175202
msgid "Link text"
176203
msgstr ""
177204

178-
#: cs_dynamicpages/views/dynamic_view.pt:247
205+
#: cs_dynamicpages/views/dynamic_view.pt:280
179206
msgid "Move actions"
180207
msgstr ""
181208

182-
#: cs_dynamicpages/views/dynamic_view.pt:120
209+
#: cs_dynamicpages/views/dynamic_view.pt:153
183210
msgid "Move down"
184211
msgstr ""
185212

186-
#: cs_dynamicpages/views/dynamic_view.pt:103
213+
#: cs_dynamicpages/views/dynamic_view.pt:136
187214
msgid "Move up"
188215
msgstr ""
189216

190-
#: cs_dynamicpages/views/dynamic_view.pt:424
217+
#: cs_dynamicpages/views/dynamic_pages_template_management.pt:32
218+
msgid "Name"
219+
msgstr ""
220+
221+
#: cs_dynamicpages/views/dynamic_view.pt:507
191222
msgid "Notification"
192223
msgstr ""
193224

@@ -199,7 +230,11 @@ msgstr ""
199230
msgid "Related image"
200231
msgstr ""
201232

202-
#: cs_dynamicpages/views/dynamic_view.pt:162
233+
#: cs_dynamicpages/views/dynamic_view.pt:392
234+
msgid "Reuse existing templates"
235+
msgstr ""
236+
237+
#: cs_dynamicpages/views/dynamic_view.pt:195
203238
msgid "Review state: ${state}"
204239
msgstr ""
205240

@@ -264,6 +299,14 @@ msgstr ""
264299
msgid "Row widths"
265300
msgstr ""
266301

302+
#: cs_dynamicpages/views/dynamic_view.pt:25
303+
msgid "Save as template"
304+
msgstr ""
305+
306+
#: cs_dynamicpages/views/dynamic_pages_template_management.pt:34
307+
msgid "See template"
308+
msgstr ""
309+
267310
#: cs_dynamicpages/behaviors/row_columns.py:22
268311
msgid "Select how many columns will be shown in this row"
269312
msgstr ""
@@ -328,14 +371,26 @@ msgstr ""
328371
msgid "Spacer padding top"
329372
msgstr ""
330373

331-
#: cs_dynamicpages/views/dynamic_view.pt:232
374+
#: cs_dynamicpages/views/dynamic_view.pt:265
332375
msgid "State"
333376
msgstr ""
334377

335-
#: cs_dynamicpages/views/dynamic_view.pt:66
378+
#: cs_dynamicpages/api/services/apply_template/post.py:35
379+
msgid "Template name is not valid"
380+
msgstr ""
381+
382+
#: cs_dynamicpages/views/dynamic_view.pt:544
383+
msgid "Template name:"
384+
msgstr ""
385+
386+
#: cs_dynamicpages/views/dynamic_view.pt:99
336387
msgid "Template: ${template_id}"
337388
msgstr ""
338389

390+
#: cs_dynamicpages/behaviors/templates.py:24
391+
msgid "Templates"
392+
msgstr ""
393+
339394
#: cs_dynamicpages/controlpanels/dynamic_pages_control_panel/controlpanel.py:73
340395
msgid "This is the label corresponding to this spacer"
341396
msgstr ""
@@ -344,6 +399,12 @@ msgstr ""
344399
msgid "This is the label corresponding to this width"
345400
msgstr ""
346401

402+
#: cs_dynamicpages/api/services/apply_template/post.py:23
403+
#: cs_dynamicpages/api/services/templates/delete.py:20
404+
#: cs_dynamicpages/api/services/templates/post.py:21
405+
msgid "UID is required"
406+
msgstr ""
407+
347408
#: cs_dynamicpages/profiles.zcml:21
348409
msgid "Uninstall cs_dynamicpages setup."
349410
msgstr ""

0 commit comments

Comments
 (0)