Skip to main content

Versioning for Plone

Project description

About CMFEditions

CMFEditions provides versioning in Plone.

  • It works out of the box.

  • It’s higly extensible for specific use cases.

Out Of The Box Experience

Versionable content items edit views now allows saving a version on save (automatically or manually). The version history may be accessed quickly from the view view.

Versionable content types also have an additional tab with version related functionality:

  • save new version

  • preview an old version

  • retrieve an old version (replacing the current state in the tree)

  • diffing versions

A content panel allows configuring the versioning policy by content type:

  • enable or disable versioning

  • auto-versioning on save

  • auto-versioning on retrieve

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

  • archivist layer: It knows how to clone content items. The archivist “is Mr. Pickle”.

  • 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 disabled 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

1.2.5 - November 5, 2009

  • Show ndiff (natural diff) when neither inline diff nor html diff are available. [maurits]

1.2.4 - July 4, 2009

  • Fixed missing i18n markup in versions_history_form. [hannosch]

1.2.3 - July 4, 2009

  • Fix form action in @@history view. [vincentfretin]

1.2.2 - June 11, 2009

1.2.1 - June 8, 2009

  • Add getHistoryMetadata method to allow efficient history display without full object retrieval. Based on patches by Darryl Dixon on CMFEditions zvc_enfold_fixfailures branch r59908:60078. [alecm]

1.2 - May 16, 2009

  • Add missing PACKAGE_HOME in the init file according to tests [encolpe]

  • Add the encoding declaration (utf-8) in all python files [encolpe]

  • Internationalization of 7 strings in diff.pt (history view). [vincentfretin]

  • Fixed label_history_version msgid dynamic content in diff.pt (added i18n:name=”version”) [vincentfretin]

1.2b1 (March 7, 2009)

  • Register CMF skin layers via ZCML. [wichert]

  • Remove history action. Plone 3.3 has alternative implementations in the form of the content history viewlet so this should not be installed by default. [wichert]

  • Move import step registration to 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]

  • Some CMFEditions .py files use wrong MessageFactory (#8715) [encolpe]

  • Set some msgids to cmfeditions i18n domain in version_file_view. Renamed msgid label_existing_keywords by label_existing_categories in version_metadata_view. [vincentfretin]

1.1.8 (October 6, 2008)

  • Switch to egg-based distribution. [hannosch]

  • Fix on FileDownloadVersion : files retrieved didn’t get their version name [tbenita] Backport from trunk

  • Fix on FileDownloadVersion : files retrieved got corrupted at retrieval [drjnut] Backport from trunk

  • Merge AT changes into replacement of ‘edit_macros.pt’. See ticket http://dev.plone.org/plone/ticket/7999. [rsantos]

1.1.7 (June 2, 2008)

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]

  • Fix issue on diff form where empty entries were being shown for unchanged files. Related to http://dev.plone.org/plone/ticket/7253 [alecm]

  • Fix issues with purge policy as reported in http://dev.plone.org/plone/ticket/7300 [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]

1.1.2 (October 5, 2007)

1.1.1 (September 10, 2007)

  • Expose the extra_top, widgets and extra_bottom METAL hooks in edit_macros. [wichert]

1.1-final (August 16, 2007)

  • Prevent future off by one errors in the ui by just starting our count from 0. [alecm]

  • Fix dumb acquisition issue in the default policy scripts. [alecm]

  • Removed overly aggressive logging from update_version_before_edit.cpy. [hannosch]

1.1-rc1 (July 8, 2007)

  • Make text more consistent (use revision instead of version throughout the ui)

  • Add checks in versioning policy scripts to ensure we don’t get duplicate revisions.

  • Add controller overrides so that the correct actions happen on cancel and reference upload.

  • Add an event listener that removes the version_id attribute from copies.

  • Removed i18n folder. Translations are shipped in PloneTranslations. [hannosch]

  • Minor template corrections. [hannosch]

1.1-beta4 (April 30, 2007)

  • Updated permission mapping to account for new local roles (Editor/Contributor)

1.1-beta3 (April 29, 2007)

  • No longer register tools as utilities, since it broke the tests among other things.

1.1-beta2 (March 26, 2007)

  • Register tools as utilities

1.1-beta1 (March 5, 2007)

  • Make the AT autoversion policy save a version before the save for more

    intuitive behavior.

  • Fixed numerous ui glitches on the versions history form and started using

    statusmessages.

  • Do not install the versioning control panel anymore. You can enable versioning for a content type on the new types control panel now.

ToDo

  • Finish exportimport handlers for portal_repository and portal_modifier thus making setuphandlers importVarious unnecessary again.

  • 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]

  • Removed BBB code for old transaction handling. [hannosch]

  • Removed some BBB code for ZClasses and CMF 1.4. [hannosch]

CMFEditions 1.0rc1 (unreleased)

ToDo

  • migration from CMFEditions 1.0alpha3 doesn’t work correctly

  • some translations are not yet updated: contact translators (for changes see below. Affected translations: fr, da, pl)

  • Fix outstanding failing tests

  • Some complex integration test with deleted version. (purge support)

  • allow adding test hierarchy only if in debug mode

  • allow migration in debug mode only

  • fix issue #28

  • fix issue #25

  • fix issue #19

  • fix issue #17

  • fix issue #22

1.0beta1 (2006-06-24)

Bugs fixed

  • Fixed previewing (retrieving) files and images. [gregweb]

  • 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]

  • Added size information to storage statistics ZMI view [gregweb]

  • Added German translations [gregweb]

  • Added Polish translations provided by Piotr Furman [Piotr Furman, 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]

  • Added two new i18n labels: label_preview_version_below, label_preview_version (no translations yet) [gregweb]

  • Renamed i18n label: label_show_below to label_preview_version_link (updated labels in po-files but not the translations) [gregweb]

Internal Changes

  • Now save all metadata also in shadow storage. But currently on retrieve the metadata is still feteched from the ZVC storage. [gregweb]

  • Added migration code for 1.0alpha3 –> 1.0beta1 storage migrations [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]

  • Corrected a hairy acquisition bug that caused wrong security evaluations (ArchivistTool.py). Acquisition is a monster feature! [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]

  • Fixed tracker issue #16 RuntimeError: maximum recursion depth exceeded. I (gregweb) suspect it got fixed by: [alecm]

  • Fixed identical tracker issues #5, #6, #7, #8. I (gregweb) suspect it got fixed by: [alecm]

  • 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]

1.0alpha2 (around June 2005)

no changes recorded

Project details


Release history Release notifications | RSS feed

This version

1.2.5

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

Products.CMFEditions-1.2.5.zip (1.9 MB view hashes)

Uploaded Source

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page