Zope debug prompt

Description

Interacting with Plone from the Zope debug prompt.

Introduction

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 entering python at the command line) and the same whitespace restrictions apply.

Cautions

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 print statement
  • 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.

Starting the debug prompt interactively

This assumes that you are running Plone in a ZEO configuration on a *NIX server, and your Zope clients run as the plone_daemon user.

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 app 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)

Code Snippets

Sample code snippets for use in the debug prompt.