Zope debug prompt¶
Interacting with Plone from the Zope debug prompt.
The Zope debug prompt is a way of starting a Zope client from the command line, and allows you to directly interact with Plone.
Some things that you can do through the debug prompt:
- Examine objects to see their properties/methods
- Update objects in bulk, as opposed to one at a time through the user interface.
- Produce reports or export data from objects
This is very similar to the Python debug prompt (just
at the command line) and the same whitespace restrictions
With great power comes great responsibility.
Interacting with Plone from the Zope debug prompt is a very powerful tool, and lets you quickly make changes that might take hours or days to implement manually.
It is also a great way to severely damage your site, in a way that might take hours or days to fix.
Precautions for developing code that makes updates via the debug prompt:
Log the changes that you're going to make using the
Only commit the transaction (
transaction.commit()) after the code has run successfully.
- Attempt to develop the code in an idempotent (able to be run multiple times with no ill effects) manner.
This assumes that you are running Plone in a ZEO
configuration on a *NIX server, and your Zope clients run
After logging into your server, start the debug prompt with:
sudo -u plone_daemon /path/to/zope/bin/client1 debug
The output will look something like:
Starting debugger (the name "app" is bound to the top-level Zope object) 2015-06-26 12:33:51 WARNING SecurityInfo Conflicting security declarations for "manage_pasteObjects" 2015-06-26 12:33:51 WARNING SecurityInfo Class "CopyContainer" had conflicting security declarations 2015-06-26 12:33:52 WARNING Init Class Products.Five.metaclass.RedirectsView has a security declaration for nonexistent method 'errors' >>>
There may be some additional warnings, based on the products installed.
From here, the
variable is equivalent to the root of your Zope instance.
A simple example:
from AccessControl.SecurityManagement import newSecurityManager from Products.CMFCore.utils import getToolByName from Testing.makerequest import makerequest from zope.component.hooks import setSite, getSite import transaction app = makerequest(app) # Enables functionality that expects a REQUEST app._p_jar.sync() # Syncs the debug prompt with any transactions site=app['mysiteid'] # Use your site id setSite(site) # Sets the current site as the active site # Simulate logging in as the Zope 'admin' user admin = app.acl_users.getUserById('admin') admin = admin.__of__(admin.acl_users) newSecurityManager(None, admin) # Grab the portal_catalog tool portal_catalog = getToolByName(site, "portal_catalog") # Query the catalog for all results. Returns 'brains' results = portal_catalog.searchResults() # Print the number of objects in the catalog print u"My site has %d objects." % len(results)