ftw.trash
is a Plone addon which modifies Plone's behavior when content is deleted. When a user deletes content, it will not actually be deleted but rather marked as trashed. Trashed content can then be restored when needed.
Table of Contents
- Be aware that
ftw.trash
requires and installscollective.deletepermission
. Add
ftw.trash
to the eggs in your buildout configuration:[instance] eggs += ... ftw.trash
- Install the
ftw.trash
addon in Plone (Addons control panel or portal_setup or quickinstaller). - Deleting content looks exactly as in standard Plone, but it does not actually delete the content but only hides it.
- Administrators can restore content with a global trash view, accessible via the user menu.
- Personal trashes are not implemented at the moment.
The catalog is patched, so that it includes the default query {'trashed': False}
. This makes sure that we only work with 'untrashed' objects by default.
If you want to access trashed objects, you can simply use the query keyword trashed
with one of these values:
False
: only return objects which are not trashed.True
: only return objects which are trashed.None
: do not apply "trashed" filter, return both trashed and 'untrashed' objects.
These filters only apply when portal_catalog.searchResults
is used. When using portal_catalog.unrestrictedSearchResults
the behavior is different, especially for trashed=None
, since this method is not patched.
ftw.trash
patches manage_delObjects
so that it trashes the content instead of deleting it. ftw.trash
also adds new methods:
parent.manage_trashObjects([id1, id2, ..])
: trashes the contents.parent.manage_immediatelyDeleteObjects(([id1, id2, ..])
: immediately deletes the contents without trashing it.parent.manage_delObjects([id1, id2, ..])
: trashes the contents. If called from ZMI (or within link integrity checker), the content is immediately deleted.
The patches are applied on the site root, on DX- and on AT-folders when ftw.trash
is installed in the path. For the methods to work properly, the Generic Setup profile must be installed as well.
You can either set the env variable DISABLE_FTW_TRASH
manually, or use the provided context manager.
from ftw.trash.utils import temporary_disable_trash
with temporary_disable_trash():
self.portal.manage_delObjects([container1.getId()])
Restoring a page can be compared to adding a new page to its container. Therefore by default we require the Add portal content
permission on the parent in order to restore content.
However this can depend on the application and the content type - there are some content types which can be seen as part of the content of their parents, in which case we'd like to require the Modify portal content
permission for the parent instead. This can be modelled by simply registering an IIsRestoreAllowedAdapter for the content type being restored. For example:
@implementer(IIsRestoreAllowedAdapter)
@adapter(IMyType, IMyBrowserLayer)
def is_restore_allowed_for_my_type(context, request):
parent = aq_parent(aq_inner(context))
return getSecurityManager().checkPermission('Modify portal content', parent)
The following object events are fired:
- `ftw.trash.interfaces.IBeforeObjectTrashedEvent`: the object will be trashed.
- `ftw.trash.interfaces.IObjectTrashedEvent`: the object has been trashed.
- `ftw.trash.interfaces.IBeforeObjectRestoredEvent`: the object will be restored.
- `ftw.trash.interfaces.IObjectRestoredEvent`: the object has been restored.
- When content is deleted, it is marked as
ITrashed
andIRestorable
, children are only marked asITrashed
. - Only the root node of the deleted structure can be restored and thus provides
IRestorable
. Restoring children without their deleted parents is not possible since their parent(s) would be missing. - Trashed content is not moved.
- The catalog's
searchResults
method is patched so that it filters trashed objects by default. - The
contentItems
method is patched to exclude trashed content. It is used forlistFolderContents
andgetFolderContents
. - Trashed content is prevented from being published / accessed through the browser unless the user has the
Manager
role. - For restoring content, the permissions
Restore trashed content
andAdd portal content
are required. TheRestore trashed content
is granted by default to the rolesManager
andSite Administrator
on the site root.
- Fork this repo
- Clone your fork
- Shell:
ln -s development.cfg buildout.cfg
- Shell:
python bootstrap.py
- Shell:
bin/buildout
Run bin/test
to test your changes.
Or start an instance by running bin/instance fg
.
- Github: https://github.com/4teamwork/ftw.trash
- Issues: https://github.com/4teamwork/ftw.trash/issues
- Pypi: http://pypi.python.org/pypi/ftw.trash
This package is copyright by 4teamwork.
ftw.trash
is licensed under GNU General Public License, version 2.