WARNING: THIS SITE IS A MIRROR OF GITHUB.COM / IT CANNOT LOGIN OR REGISTER ACCOUNTS / THE CONTENTS ARE PROVIDED AS-IS / THIS SITE ASSUMES NO RESPONSIBILITY FOR ANY DISPLAYED CONTENT OR LINKS / IF YOU FOUND SOMETHING MAY NOT GOOD FOR EVERYONE, CONTACT ADMIN AT ilovescratch@foxmail.com
Skip to content

Commit 6919923

Browse files
committed
feat(recyclebin): enhance delete actions with recycle bin support and dynamic success messages
1 parent a8e5d10 commit 6919923

File tree

2 files changed

+66
-4
lines changed

2 files changed

+66
-4
lines changed

src/plone/app/content/browser/actions.py

Lines changed: 35 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
from plone.base.utils import get_user_friendly_types
77
from plone.base.utils import safe_text
88
from plone.locking.interfaces import ILockable
9+
from plone.registry.interfaces import IRegistry
910
from Products.CMFCore.utils import getToolByName
1011
from Products.Five.browser import BrowserView
1112
from Products.Five.browser.pagetemplatefile import ViewPageTemplateFile
@@ -19,6 +20,8 @@
1920
from zope import schema
2021
from zope.component import getMultiAdapter
2122
from zope.component import queryMultiAdapter
23+
from zope.component import queryUtility
24+
from zope.component.hooks import getSite
2225
from zope.container.interfaces import INameChooser
2326
from zope.event import notify
2427
from zope.interface import Interface
@@ -85,9 +88,38 @@ def handle_delete(self, action):
8588
# unlock object as it is locked by current user
8689
ILockable(self.context).unlock()
8790
parent.manage_delObjects(self.context.getId())
88-
IStatusMessage(self.request).add(
89-
_("${title} has been deleted.", mapping={"title": title})
90-
)
91+
92+
# Check if recycle bin is enabled and show appropriate message
93+
try:
94+
recyclebin_enabled_view = getMultiAdapter(
95+
(getSite(), self.request), name="recyclebin-enabled"
96+
)
97+
recycling_enabled = recyclebin_enabled_view()
98+
except Exception:
99+
recycling_enabled = False
100+
101+
if recycling_enabled:
102+
# Get retention period from registry (default to 30 days if not found)
103+
registry = queryUtility(IRegistry)
104+
retention_period = 30 # default
105+
if registry is not None:
106+
try:
107+
retention_period = registry.get(
108+
"plone-recyclebin.retention_period", 30
109+
)
110+
except Exception:
111+
retention_period = 30
112+
113+
IStatusMessage(self.request).add(
114+
_(
115+
"${title} has been moved to the recycle bin. It can be restored by administrators and will be permanently deleted after ${days} days.",
116+
mapping={"title": title, "days": retention_period},
117+
)
118+
)
119+
else:
120+
IStatusMessage(self.request).add(
121+
_("${title} has been deleted.", mapping={"title": title})
122+
)
91123
else:
92124
IStatusMessage(self.request).add(
93125
_('"${title}" has already been deleted', mapping={"title": title})

src/plone/app/content/browser/contents/delete.py

Lines changed: 31 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,11 @@
44
from plone.app.content.interfaces import IStructureAction
55
from plone.base import PloneMessageFactory as _
66
from plone.locking.interfaces import ILockable
7+
from plone.registry.interfaces import IRegistry
78
from Products.CMFCore.utils import getToolByName
89
from Products.Five.browser.pagetemplatefile import ViewPageTemplateFile
910
from zope.component import getMultiAdapter
11+
from zope.component import queryUtility
1012
from zope.component.hooks import getSite
1113
from zope.i18n import translate
1214
from zope.interface import implementer
@@ -43,9 +45,37 @@ def get_options(self):
4345

4446
class DeleteActionView(ContentsBaseAction):
4547
required_obj_permission = delete_objects
46-
success_msg = _("Successfully delete items")
4748
failure_msg = _("Failed to delete items")
4849

50+
@property
51+
def success_msg(self):
52+
"""Dynamic success message that includes recycle bin information."""
53+
# Check if recycle bin is enabled
54+
try:
55+
recyclebin_enabled_view = getMultiAdapter(
56+
(getSite(), self.request), name="recyclebin-enabled"
57+
)
58+
recycling_enabled = recyclebin_enabled_view()
59+
except Exception:
60+
recycling_enabled = False
61+
62+
if not recycling_enabled:
63+
return _("Successfully deleted items")
64+
65+
# Get retention period from registry (default to 30 days if not found)
66+
registry = queryUtility(IRegistry)
67+
retention_period = 30 # default
68+
if registry is not None:
69+
try:
70+
retention_period = registry.get("plone-recyclebin.retention_period", 30)
71+
except Exception:
72+
retention_period = 30
73+
74+
return _(
75+
"Successfully moved items to recycle bin. Items can be restored by administrators and will be permanently deleted after ${days} days.",
76+
mapping={"days": retention_period},
77+
)
78+
4979
def __call__(self):
5080
if self.request.form.get("render") == "yes":
5181
confirm_view = getMultiAdapter(

0 commit comments

Comments
 (0)