By default the contents of a folder is versioned independently of the folder.
This may be changed through the ZMI and for specific cases on python level.
Basic support for Archetypes references is built in.

The current strategy is to save everything of the content item (incl. security
information, workflow state, etc.). On retrieve some of these information are
filtered out. This policy may completely be changed depending on specific needs
(see modifiers below).

Extensibility

CMFEditions was from the beginning developed with extensibility in mind.
A handful of tools provide the whole functionality:

repository layer: This is the public main API. The repository layer
cares about recursive storing and retrieving of content items from/to
Zope 2’s Object File System (OFS).

modifiers: They’re invoked by the archivist and know what to clone.
This the main customization point. A modifier knows about what
information on an object is a reference and if the referenced object
has to be versioned also.

storage: Is responsible of storing content items versions in a
history. The current storage implementation is a ZODB storage (it
uses Zope Version Control Product from ZC). Other storages may be
written (svn, file based, xml based, etc.). The storage API is quite
simple and the storage implementation doesn’t have to care about
reference stuff as this is already done by the upper layers.

purge policy: The purge policy is called on every save operations
and has full control over the version to save and the whole history.
The current implementation may be configured to only hold the n
current versions by purging the older versions from the repository.
This functionality is by default disabled. It may be enabled through
the ZMI. You should take care when you’re saving objects with a lot
of interrelations. Purging functionality is quite new!

Additional Documentation

A couple of presentations and ReSt documents may be found in
documentation package that has to be downloaded separately (or the
doc folder of CMFEditions).

The CMFEditions team also started adding documentation in the download
area <http://plone.org/products/cmfeditions/documentation> of plone.org.
You’re welcome to help out.

Dependencies

CMFEditions is part of the Plone distribution and all dependencies are already
included. Please refer to the dependency information of Plone for any details.

Migrating from Older Versions of CMFEditions

We know there are severe problems when migrating from 1.0alpha3,
1.0alpha4 or trunk checkout from May 2006 and before.
Please contact us <mailto:collective-versioning@lists.sourceforge.net>
for assistance. We’re interested in making migrations bullet proof.

Feedback

Please report bugs <http://plone.org/products/cmfeditions/issues>
to the CMFEditions tracker on plone.org.

For feedback and questions the developers may be contacted on the
mailing list <mailto:collective-versioning@lists.sourceforge.net>.

Contributing

Just do it and communicate with us over the
mailing list <mailto:collective-versioning@lists.sourceforge.net>!

Credits & Sponsoring

Several people and organizations have made CMFEditions possible:

See CREDITS.txt

Changelog

2.2.8 (2013-03-05)

Fix modifier check that made AT assumptions about Dexterity
content.
[rpatterson]

Remove hard dependency on Archetypes.
[davisagli]

2.2.7 (2013-01-01)

put back the history legend for compare/diff versions, fixes #9371
[maartenkling]

Site administrators do revisioning

2.2.6 (2012-10-16)

Update IPossibleSite import to zope.component.
[elro]

2.2.5 (2012-08-11)

Fixed version file preview for empty files.
[thomasdesvenain]

Fixed versions history form:
title and description aren’t displayed two times.
[thomasdesvenain]

Fixed version file preview:
some displayed values of a previous version were values of current version.
[thomasdesvenain]

2.2.4 (2012-06-27)

Skip blob files from plone.namedfile even when they no longer
extend the classes from z3c.blobfile.
[davisagli]

Declare missing dependency on zope.copy.
[hannosch]

2.2.3 (2012-01-26)

Changed the get_macros python skin script into a browser view. This
avoids an Unauthorized exception when viewing revisions when using
five.pt (Chameleon).
[maurits]

Implement a special base modifier that allows retention of specific
annotation elements from the working copy. Use this in the OM
modifiers to ensure we don’t stomp annotations for folders on retrieval.
[alecm]

If an object has a component registry (AKA site manager), make sure
the bases of that registry are not recursively copied when saving
versions.
[rossp]

2.2.1 (2011-09-19)

2.2 (2011-08-23)

Make Zope 2 permissions available as Zope 3-style permissions.
[rafaelbco]

Changed @@history to be protected by CMFEditions.AccessPreviousVersions instead of
cmf.ModifyPortalContent.
[rafaelbco]

Only show the “Revert to this version” button if the user has the Revert to previous versions
permission in versions_history_form.
[rafaelbco]

2.1.5 (2011-09-19)

Translate the commit message, so version id is substituted.
[lentinj]

Only save an initial version before edit when content is not yet versioned,
rather than every time there are unsaved changes. Otherwise there is an
“Initial version” generated for every edit after publish/retract, as these
change the publishing date without a new version being saved. Possibly a
version should be saved on publish, but not sure the extra versioning noise
is useful.
[lentinj]

2.1.4 (2011-08-31)

Remove references to blobs when cloning blob fields. They are handled as
referenced attributes anyway. This eliminates the creation of an additional
empty blob when cloning blob fields.
[buchi]

No longer store references in the ZVC wrapper. They are stored in the shadow
history and retrieved from there. This eliminates the creation of an
additional empty blob when cloning blob fields.
[buchi]

Allow to translate the string “current” in the diff view (@@history) and in the
version_diff template.
[rafaelbco]

2.1.3 (2011-04-03)

Fixed: Unauthorized error on versions history form for non managers.
[thomasdesvenain]

2.1.2 (2011-03-25)

remove UniqueIdHandlerTool, it was not used anymore;
nobody (including vds and hannosch) seems to remember what it was for.
[gotcha]

2.1.1 - 2011-02-25

2.1.0 - 2011-02-25

Generic Setup export/import support.
[elro]

2.0.5 - 2011-02-25

Workaround some potential issues with event handlers and
transaction.savepoint which can cause exceptions when, for example,
zope.sendmail is used to send mail in the same transaction as saving
an edition.
[rossp]

2.0.4 - 2011-01-03

Depend on Products.CMFPlone instead of Plone.
[elro]

Do not provide “Compare to … revision” link in versions history actions
if content type has no diffable field.
[thomasdesvenain]

Add Site Administrator role to various permissions, for forward compatibility
with Plone 4.1.
[davisagli]

2.0a1 - 2009-11-14

Only make a copy of a BLOB if it’s changed since the last save.
Otherwise, just reference the BLOB from the prior revision.
[alecm]

Made the ZVCStorage store references directly in the shadow instead
of simply passing them to ZVC. This way real references can be used
in the storage instead of copies, so that BLOB revisions can work.
[alecm]

Add modifiers to handle AT blob fields from plone.app.blob. One
handler skips the blobs and the other copies them.
[alecm]

Enable both inside and outside children modifiers by default for
folder objects. Using the INonStructuralFolder interface to determine
which to use.
[alecm]

Fixes for reference handling in plone.folder and other BTree based folder implementations.
[alecm]

Fixed a bug in the file_download_version that prevented successful download
of anterior version of files if the filename contained spaces. Anyway, the
filename param of Content-Disposition header SHOULD NEVER come without
double-quotes.
[drjnut]

Register GenericSetup steps via ZCML.
[wichert]

Use the new archetypes.edit.afterfieldsets viewlet manager to add our
field to the AT edit template. The customized edit_macros is now no longer
needed.
[wichert]

1.1.6 (March 26, 2008)

1.1.5 (March 8, 2008)

Fix bug in wrapper assignment for some modifiers.
[encolpe, alecm]

Added metadata.xml file to the profile.
[hannosch]

1.1.4 (December 6, 2007)

Add modifiers to avoid pickling extremely large files. The
AbortVersioningOfLargeFilesAndImages modifier is enabled by default
for Files and Images. It will skip saving versions of objects when
they contain a large file (‘file’ or ‘image’ field in Attribute or
AnnotationStorage). The SkipVersioningOfLargeFilesAndImages will
simply not version the large file, but will version all other data.
On retrieval it will put the file from the working copy in place.
This is disabled by default, but can be enabled easily.
Workaround for: http://dev.plone.org/plone/ticket/7223
[alecm]

1.1.3 (December 2, 2007)

Make sure that we attempt to handle Inside Refs which have no
portal_type, as well as retrieving revisions that once used the
InsideRefsModifier but now use the OutsideRefsModifier.
Related to: http://dev.plone.org/plone/ticket/7295
[alecm]

Handle ArchivistUnregisteredErrors during save. This occurs when an
object has been imported, or when the version information has been
destroyed. Fixes http://dev.plone.org/plone/ticket/7334.
[alecm]

Reflect changes in base_edit.cpt asnd edit_macros.pt in r8683 of
Archetypes: Skip the ‘metadata’ schema in base_edit, like we used to
do it pre-1.5. Also, do not render fieldset and legend elements
when we’re only displaying one fieldset, i.e. the ‘default’ one.
[nouri]

Add back special portal_historyidhandler / portal_uidhandler handling. If a
portal_uidhandler tool is found during install, it should be renamed to
portal_historyidhandler. The missing tools should be created as normal then.

1.1-alpha2 (February 08, 2007)

Removed specialized document byline.

Switch to Plone control panel category

1.1-alpha1 (November 22, 2006)

Internal Changes

Two minor updates for CMF 2.1 compatibility. [hannosch]

Use a GenericSetup Extension profile for installation instead of an external
method. [hannosch]

Cleaned up tests. As these are based on PloneTestCase and Plone 3.0 we don’t
have to set up anything special anymore. [hannosch, alecm]

Removed ActionProviderBase as a base class from all tools. In CMF 2.1 actions
are usually only stored on the actions tool. [hannosch]

Updated dependency information for Plone 3.0 inclusion. [hannosch]

1.0 (SVN)

Bugs fixed

Fixed OMInsideChildrensModifier InitializeClass. [encolpe]

Internal Changes

Replaced usage of zLOG with Python’s logging framework. [hannosch]

Removed lots of unused import statements, found by pyflakes. [hannosch]

1.0beta1 (2006-06-24)

Security Policy was for manage_setPolicies but the method name
was manage_setTypePolicies. Corrected. [gregweb]

The storage now stores ZVC’s __vc_info__ for every version
avoiding wrong information is attached to a working copy when
previewing a version. Fix for ToDo.txt item #48. [gregweb]

Replaced all occurences of rollback with revert. Brought into
sync internal names with UI. Rollback may suggest a transaction
rollback which is something different. Including i18n label
label_rollback which is now label_revert. Added backwards
compatibility code for configuration. Translations not updated.
[gregweb]

Minor refactorings of the version history view. Notably replaced
(show below) by preview without jumping to the preview target
on the page by default. Instead the link name of the previewed version
changes to jump down. [gregweb]

The storage is now more immune against non int selectors. [gregweb]

Features Added

The approximate size of a version is now recorded also at save time
(and calculated at storage migartion).
[gregweb]

RetainWorkflowStateAndHistory now adds the review_state to the
sys_metadata at save time because at retreive time the workflow tool
picks the working copies state. I didn’t find any other way to do it
without digging into workflows internals (which would have been a bad
idea anyway). Had to extend the IModifier.ISaveRetrieveModifier
interface to allow a modifier enhance sys_metadata at save time.
[gregweb]

Added purge support [gregweb]:

Enhanced storage API with a purge method that inevitabely
removes a version from the history. See added IPurgeSupport
and IPurgePolicy interfaces.

Purging raises an exception if no purge policy is installed. This
will avoid a lot of future tracker items caused by people having
removed the purge policy but nevertheless providing purge support
to users. The reason is that the archivist and repo layer can’t
handle yet the empty placeholder object beeing returned by the
storage for the purged version. This rule may be relaxed in future
versions if the archivist and repo layer support handling of those
empty placeholder objects.

The UI doesn’t expose manual purge functionality. Through the ZMI a
number n may be configured representing the maximum number of
version per content item that have to be preserved. Older ones are
automatically purged from the storage at save time.

There is a new purge permission that may be used to restrict purging
to special roles if necessary (applicable to manual purging only).

On the repo layer (portal_repository) retrieving an object or
iterating over the history always returns a valid (unpurged)
version. The returned object may be a substitute. Two numbering
schematas exist. Numbering counting purged versions and not
counting purged versions (passing True or False to countPurged).
The default numbering schema is countPurged=True. The UI
history onyl shows unpurged versions (countPurged=False).

If the storage is asked to retreive a removed version it may be
instructed to return a substitute for the removed version. The
substitution policy itself is implemented in the new purge policy
tool. This strategy allows to keep most purge implementation
details out of the upper layers (archivist, modifiers, repository).

The new purge policy tool may be instructed to only keep n versions
of a content item. Thus at save time the oldest version is purged
if the save operation would result in more than n version reside in
the storage.

The new purge policy tool substitutes a removed version with the
next older version. If no other version is available the next
newer is used as substitute. If none is available … well this
isn’t yet tested :-)

The archivist and storage may be asked to also retreive the empty
placeholder of a purged version. This functionality is yet exposed
to the repo layer. This may change in a future release.

Added isValid method on the vdata object that allows to ask if
the retrieved object it is valid or not (empty placeholder object
or a real version).

At save time a version aware reference to the parent node is saved
also. Without it would be very ineffective or even impossible to
find out the parents which potentially would prevent adding usefull
features like retrieving the a whole site from one object in the
tree. [gregweb]

The histories default order has changed: It now returns the newest
version as first item and the oldest as last item. The old behaviour
is still available by passing oldestFirst=True. [gregweb]

Inserted the oldestFirst parameter before the already existing
preserve parameter. This will cause changes of 3rd party products
that are using preserve (None know at the moment, it’s better to
change now than later). [gregweb]

Adding purge support caused heavy refactoring the version storage.
ZVC is still used to store the contents history but now additional
data is stored in a parallel shadow storage. The layout of the data
in the ZVC didn’t change, only ZVC and purge related metadata has
been added to the parallel shadow storage. [gregweb]

Garbage collected a lot of code that was commented out, outdated
triple-X’s and items in ToDo.txt. [gregweb]

The storage tests now tests ZVCSTorageTool only once and additionally
tests the dummy memory storage. This was the intended behaviour but
a bug prevented running the tests with the dummy storage and instead
run the tests with ZVCStorageToll twice. [gregweb]

1.0alpha4 (2006-06-24)

Bugs fixed

fixed bug with AT references causing ref catalog having been inconsistent
[sunew]

Features added

Comment is now taken from request if any. [sunew]

Added storage statistics ZMI view. [gregweb]

Added functionality to create a test hierarchy. [gregweb]

1.0alpha3 (2006-06-03)

Bugs fixed

Fixed tracker issue #15 [alecm, gregweb]

When previewing a version the expandable history link is removed as this
doesn’t make sense at all and caused double fetching of history items.
[gregweb]

Use the default view of the retrieved object, as it may be different from
that of the current object. [alecm]

The expandable version link is only shown for users having the permission
to view the history. [rafrombrc]

Added RetainATRefs modifier [vds]

Fixed broken isUpToDate [gregweb]

version_id wasn’t correctly set at the working copy at save time.
Because of this it may happen that the wrong version info was saved
with the version aware reference. The version_id is now set at the end
of the save operation. [alecm, gregweb]

Handle usecase where an inside reference is moved outside its container.
Still need to handle case where it has been replaced by another object
with the same id. [alecm]

Changed API for Archivist methods and the dereference utility method so
that they now accept an optional history_id, rather than implicitly
allowing the ‘obj’ parameter to be a history_id. As side effect this
will help in supporting multi location checkout in the future.
[alecm, gregweb]

Fixed various UI issues. [rlemmi, vds, alecm]

Fixed SF issue #1376836. [alecm]

restored at’s extra_buttons slot (some others slots are still missing
because of this template override) [syt]

Totally refactored recursive retrieve of an ancient version of an object.
Fixed a lot of folderish bugs with this refactoring. [gregweb]

The storage now returns obj.modified() instead of
obj.getModificationDate() because it’s more fine graned. [gregweb]

Added ReferenceFactoriesTool.py which in essence knows how to
instatiate a reference. The current implementation is inflexible and
knows only how to instantiate object into an ObjectManager. This
is the first step in preparation for AT reference handling. [gregweb]

Added modifier to copy permissions from working copy onto retrieved
versions, otherwise retaining workflow can have some very strange
consequences. [alecm]

Fixed a number of bugs involving handling of adding and deleting subobjects
of versioned folders.
[alecm]

Fixed a permissions bug which made the versions_history_form inaccessible if
any of the versions were saved while private (or otherwise had
‘Access contents information’ disabled).
[alecm]

Made quickinstalled product reinstall/uninstall work without issue. Fixed
unit tests for Plone 2.1. Use mutators in templates and tests where
applicable rather than direct attribute access. Was Issue #9, #10 and #11.
Thanks to Andrew Lewis for the patches and reports. [Andrew Lewis, alecm]

Corrected bugs in RetainWorkflowStateAndHistory modifier and the
modifier registry avoiding the review state and the workflow history
from beeing retained on retrieve and revert.

Features added

Added danish translation. [stonor]

Retrieving an object just for preview (without replacing the working copy)
caused a lot of headaches and got more and more complex und ununderstandable.
Everything got much simpler by just using a savepoint/abort pair at the right
place while retrieving. [alecm]

I18N tuned (diff-legend untested), french added
[Gpgi, gotcha]

Added more tests to improve coverage. [azy, vds, alecm]

Added support for ATCT (Archetypes Content Types). [azy]

Added ZMI interface for modifiers. [rlemmi]

It’s now possible to save a new version in the edit view. As soon as a
version sahll be saved a comment field is inserted to add a comment.
[rlemmi]

Added expandable version history to document_byline. [rlemmi]

Made the ModifierRegistryTool make use of any preserve dict passed back to
it by afterRetrieveModifiers.
[alecm]

Added optional CMFDiffTool support for generating diffs between object
versions. For this to work you need to setup the diffable fields on each
type in portal_diff. In the ‘alecm-at-schema-diffs’ branch of CMFDiffTool
there is a diff type that can be applied to any AT object which will
automatically setup diffs for all fields in the schema (when using this
any value can be entered for the field in portal_diff).
[alecm]

Added a versioning policy (at_edit_autoversion) which automatically creates
new versions on edit for AT types which are configured to support the policy
in the configlet. This is implemented using a simple macro override on
AT’s edit_macros, and a new entry in the AT edit form controller chain.
[alecm]

Added new interface IContentTypeVersionPolicySupport and implemented it in
portal_repository. It allows products to register versioning policies
(classes which implement IVersionPolicy), and to associate those policies
with specific portal types. IVersionPolicy objects may define methods
(setupPolicyHook, removePolicyHook, enablePolicyOnTypeHook,
disablePolicyOnTypeHook) which can be used to install/uninstall policy
specific behavior in the portal, on adding/removing the policy, or enabling/
disabling the policy on a specific type.
[alecm]