Prerequisites
You'll
need a Plone 3 instance and a custom product which contains at least
one Archetypes-based content-type on which you want to enable
versioning.
You'll also need to have the Working Copy Support (Iterate) product installed. This product is part of the Plone core so to install it, all you need to do it visit the Add-on Products section (a.k.a. Quickinstaller) of the Plone control panel and select it for installation.
Creating a setup handler script for GenericSetup
The
integration code we'll be writing here is best run as a setup handler
using GenericSetup. If your product doesn't already have a GenericSetup
profile and a custom setup handler, this tutorial provides instructions on how to create those.
Declaring versionable types in your setup handler
The
portal_repository tool stores a list of content-types on which version
is enabled. With the following code we create a list of the custom
types on we which we want to activate versioning and then notify the
repository tool to start versioning the types in this list.
If
you copy the code below, make sure to edit the TYPES_TO_VERSION setting
so that it contains a list of the types on which you want to activate
versioning.
from Products.CMFCore.utils import getToolByName
from Products.CMFEditions.setuphandlers import DEFAULT_POLICIES
# put your custom types in this list
TYPES_TO_VERSION = ('Scientist', 'Article', 'Presentation')
def setVersionedTypes(portal):
portal_repository = getToolByName(portal, 'portal_repository')
versionable_types = list(portal_repository.getVersionableContentTypes())
for type_id in TYPES_TO_VERSION:
if type_id not in versionable_types:
# use append() to make sure we don't overwrite any
# content-types which may already be under version control
versionable_types.append(type_id)
# Add default versioning policies to the versioned type
for policy_id in DEFAULT_POLICIES:
portal_repository.addPolicyForContentType(type_id, policy_id)
portal_repository.setVersionableContentTypes(versionable_types)
Now we call this function from the importVarious() function in our setup handler script. Make sure to pass the portal object as a parameter.
def importVarious(context):
"""Miscellanous steps import handle"""
portal = context.getSite()
setVersionedTypes(portal)
Enabling visual diffs on your versioned types
Now
that you've enabled versioning, you'll probably want to enable visual
diffs so you can compare the changes made between different versions of
an object.
Starting in Plone 3.2 the diff tool can be configured via a GenericSetup configuration file. You'll want to create or edit the diff_tool.xml
file in the /profiles directory of your product. Here's an
example confirmation file that enables compound diffs on the 3
content-types used in the example above.
<?xml version="1.0"?>
<object>
<difftypes>
<type portal_type="Scientist">
<field name="any" difftype="Compound Diff for AT types"/>
</type>
<type portal_type="Article">
<field name="any" difftype="Compound Diff for AT types"/>
</type>
<type portal_type="Presentation">
<field name="any" difftype="Compound Diff for AT types"/>
</type>
</difftypes>
</object>
For
Plone versions earlier than 3.2, there is not a GenericSetup handler
for configuring the diff tool, but you can create these settings
through the ZMI using the portal_diff tool. In the Portal Type drop-down menu select the content-type on which you want to enable diffs. In the Field name box type "any". For the Diff Type select "Compound Diff for AT Types". Finally click the Add Field button. Repeat these steps for each content-type.
Deploying your new versioning and diffs policy
To
deploy these changes you'll need to re-run you product's GenericSetup
policy. If your instance is not running in debug mode, you'll first
need to restart your Zope instance to make your new filesystem code
available.
Assuming you've used paster to create your product package, reinstalling your product in the Add-on Products section of the Plone control panel should be sufficient to re-run your GenericSetup policy. If your product's install method does not run your GenericSetup policy, you may need to visit the portal_setup tool in the ZMI and run it manually.
Verifying that versioning and visual diffs are now enabled
Visit
an instance of one of the types on which you've enabled versioning.
Make some edits to one or more of the fields save those changes.
Next, visit the history tab for the item you just
edited. You should see a list showing two versions. Click the link to
compare versions you should see a diff showing you what has been
changed between the two revisions.