Skip to main content

The Plone Content Management System

Project description

About Plone

Plone is a user friendly Content Management System running on top of Python, Zope and the CMF.

It benefits from all features of Zope/CMF such as: RDBMS integration, Python/Perl extensions, Object Oriented Database, Web configurable workflow, pluggable membership and authentication, Undos, Form validation, amongst many many other features. Available protocols: FTP, XMLRPC, HTTP and WEBDAV Turn it into a distributed application system by installing ZEO.

Plone shares some of the qualities of Livelink, Interwoven and Documentum. It aims to be the open source out-of-the-box publishing system.

What is Plone?

Plone is a ready-to-run content management system that is built on the powerful and free Zope application server. Plone is easy to set up, extremely flexible, and provides you with a system for managing web content that is ideal for project groups, communities, web sites, extranets and intranets.

  • Plone is easy to install. You can install Plone with a a click and run installer, and have a content management system running on your computer in just a few minutes.
  • Plone is easy to use. The Plone Team includes usability experts who have made Plone easy and attractive for content managers to add, update, and mantain content.
  • Plone is international. The Plone interface has more than 35 translations, and tools exist for managing multilingual content.
  • Plone is standard. Plone carefully follows standards for usability and accessibility. Plone pages are compliant with US Section 508, and the W3C’s AAA rating for accessibility.
  • Plone is Open Source. Plone is licensed under the GNU General Public License, the same license used by Linux. This gives you the right to use Plone without a license fee, and to improve upon the product.
  • Plone is supported. There are close to a hundred developers in the Plone Development Team around the world, and a multitude of companies that specialize in Plone development and support.
  • Plone is extensible. There is a multitude of add-on products for Plone to add new features and content types. In addition, Plone can be scripted using web standard solutions and Open Source languages.
  • Plone is technology neutral. Plone can interoperate with most relational database systems, open source and commercial, and runs on a vast array of platforms, including Linux, Windows, Mac OS X, Solaris and BSD.

Technical overview

Plone is a content management framework that works hand-in-hand and sits on top of Zope, a widely-used Open Source web application server and development system. To use Plone, you don’t need to learn anything about Zope; to develop new Plone content types, a small amount of Zope knowledge is helpful, and it is covered in the documentation.

Zope itself is written in Python, an easy-to-learn, widely-used and supported Open Source programming language. Python can be used to add new features to Plone, and used to understand or make changes to the way that Zope and Plone work.

By default, Plone stores its contents in Zope’s built in transactional object database, the ZODB. There are products and techniques, however, to share information with other sources, such as relational databases, LDAP, filesystem files, etc.

Plone runs on Windows, Linux, BSD, Mac OS X, and many other platforms; double-click installers are available for Windows and Mac OS X, and RPM packages are available for Linux. For full information, see the product page.


4.0a1 - 2009-11-19

  • Moved Image Handling control panel into the main Plone category. It’s not an add-on anymore. [hannosch]
  • Clarified the default labels shown on the site setup overview page. [hannosch]
  • Adjust tests to new Archetypes behavior, which respects the default language of the portal_languages tool. [hannosch]
  • Adjust the _createObjectByType functions in utils and FactoryTool to use the _constructInstance method of the FTI instead of duplicating pieces of its logic. [davisagli]
  • By default hide the “Subfolders” tab on collections. They don’t behave in a way understandable to users. Existing sites aren’t changed. [hannosch]
  • Converted plone_javascript_variables.js to a browser page. Dynamically generating JS using a page template was too cumbersome. This also avoids the special escape_for_js handling of the translate script. [hannosch]
  • “Relevance” was not internationalized in This closes [vincentfretin]
  • “Your Plone site is up to date” was not internationalized in This closes [vincentfretin]
  • “Preferences” link should go directly to the personal prefs, the memberprefs panel is an unnecessary abstraction here. Add-on products can easily add new links to the personal menu now, so that’s the pattern we want to encourage.
  • Removed the login portlet from the default setup now that the login link opens an inline window. [limi]
  • Fixed a DYNAMIC_CONTENT in [vincentfretin]
  • Make sure the ‘Portlets: View dashboard’ permission is set for Members. [davisagli]
  • Make sure the mock MailHost used in tests is registered as a local utility so that it can be found via getToolByName. [davisagli]
  • Moved all CSS styles to plonetheme.classic package. plonetheme.sunburst is now default theme, both are installed by default, classic theme may be uninstalled, sunburst theme can’t be uninstalled. [limi, naro]
  • Added site_encoding and bodyClass methods to the @@plone view. These should simplify main template a bit. [naro]
  • Avoid AttributeError while getting the CMF version for the plone_control_panel when enable-product-installation is off in zope.conf. [maurits]
  • Fixed bad internationalized messages in [vincentfretin]
  • Changed default message for label_show_all msgid from “Show all…” to “Show all items” in to be the same as in folder_contents view which use the same msgid. [vincentfretin]
  • Use the new pas_member view in the overview templates. This avoids getting the member info for each item in the listing from the PAS internals. [hannosch]
  • registerNotify and mailPassword now send properly encoded emails. Fixes [alecm]
  • Deprecated and join_form.cpt. This functionality has been moved to [esteele]
  • Changed listActions on the workflow tool to no longer call the listGlobalActions method on every installed workflow. This method would internally call and calculate the worklist (reviewer_queue) for every workflow. The listActions method is called by the workflow menu to show the state drop down menu on almost all pages. [hannosch]
  • Deprecated the selectedTabs script in favor of a method on the GlobalSectionsViewlet. [hannosch]
  • Micro-optimize the CatalogNavigationTabs view. [hannosch]
  • Added a more prominent upgrade warning to the top of the ZMI screen, instead of the old tiny note on the portal migration tool. [hannosch]
  • Added a new @@plone-upgrade view, which replaces the old migration tool DTML ZMI screens. [hannosch]
  • Added a simple advanced mode to the add site form. If advanced is passed as a query argument to the @@plone-addsite more options are available. The button in the ZMI uses the advanced mode by default. Currently the choice of omitting the default content and deselecting any of the default extension profiles are limited to the advanced mode. [hannosch]
  • Expose the site language in the add site form and refactor the language guessing based on the browser language into that view. The addPloneSite function takes an explicit argument for the language now. [hannosch]
  • Hardcode utf-8 for UnicodeSplitter, since Hanno says that’s all we can accept and there’s no way to use getSiteEncoding from the splitter. [alecm]
  • Added option to skip the creation of the default example content in the new add site form. Grouped the add-ons selection via a fieldset. [hannosch]
  • Refactored the old factory dispatcher / addPloneSiteForm to use a modern browser page instead. [hannosch]
  • Removed the special default page and translation handling. LinguaPlone uses a content language negotiator per default instead. [hannosch]
  • Replaced highlightsearchterms.js with the Plone trunk jquery.highlightsearchterms.js plugin. This removes the need to add searchterm= query parameters to results. Refs. [mj]
  • Add a link to log out from the logged_out template if logged in as a Zope user via basic HTTP Authentication and the standard logout failed. [davisagli]
  • Removed the cut/copy/paste icons from the action menu in new sites, as they just add noise + more HTTP requests. [limi]
  • Moved happytalk in and to bottom of emails, per [jonstahl]
  • Added precedence: bulk header to several PasswordReset’s mail_password_template, per - still haven’t added this header to CMFPlone templates. [jonstahl]
  • Added the upgrade warning to the main control panel screen. This is the same as found on the new overview page. [hannosch]
  • Changed the new default overview page to be a normal browser page and made it aware of multiple Plone sites in the root or in ZODB mountpoints. [hannosch, davisagli]
  • Overwrote the Zope quick start page, with a more helpful Plone specific version as already found in the unified installer. [hannosch]
  • Turned the new add Plone site button in the ZMI into a link. This allows us to get out of the frameset to the top. [hannosch]
  • Add jQueryTools integration, using [smcmahon]
  • Updated our add site ZMI screen. [hannosch]
  • Changed (plone_forms) and (plone_templates) so they display fullname instead of creator. [ralphjacobs]
  • Cleaned up old an unused scripts to edit the plone site object itself. This is done via the site control panel now. [hannosch]
  • Hide the TinyMCE profiles hidden from the Plone site add form. [robgietema]
  • Added ‘Use site default’ to the wysiwyg_editor field in the Personal Preferences view. [robgietema]
  • Set default value of wysiwyg_editor to blank (use site default). [robgietema]
  • Added default editor property to the site properties. [robgietema]
  • Added TinyMCE and set TinyMCE as default visual editor. [robgietema]
  • Removed getProductInfo method from the migration tool. It wasn’t used anymore and depended on the persistent product registry. [hannosch]
  • Inlined the enableSyndication function into importFinalSteps in setuphandlers. Avoid an unneeded catalog search. [hannosch]
  • Simplified portal creation code and got rid of the PloneGenerator class in setuphandlers. It was a useless closure for independent functions. [hannosch]
  • Removed the plone-site import step and stop overriding the componentregistry step. The portal object directly implements the IObjectManagerSite interface, so we don’t need to activate it as a site manager in an extra step anymore. [hannosch]
  • Updated and added various ZMI-visible tool titles. [hannosch]
  • Removed the plone-archetypes import step. This is handled via a normal GenericSetup dependency in metadata.xml. [hannosch]
  • Merged the plone_various import step into the plone-final step and install more packages directly by their profiles. [hannosch]
  • Removed the zserverPatch. There’s not many people running ZServer as the front-end web server anymore, so this isn’t particular useful. [hannosch]
  • Fixed the default portlet blacklisting for the Members folder. [hannosch]
  • Replaced Products.ATReferenceBrowserWidget with archetypes.referencebrowserwidget. This is PLIP 9258 [tom_gross]
  • Clarified help text for extension profiles on the add site form. [davisagli]
  • Added a mechanism for specifying profiles that are selected by default on the add site form. This should be kept in sync with PloneTestCase’s list of default extension profiles. [davisagli]
  • Hide the plonetheme.sunburst uninstall profile from the add site form. [davisagli]
  • Default to plonetheme.sunburst for new sites. [esteele, davisagli]
  • Allow email addresses as login name, with a switch on the security panel. This is plip 9214: Refs [maurits]
  • Extend the language specific default configuration to set a reasonable first day of week on the calendar tool. [hannosch]
  • Stop pretending to use GenericSetup’s content import. As a last item we now create the translated front-page purely in imperative code. As a bonus we moved the body text of the front-page to a page template, so i18ndude can automatically extract it. [hannosch]
  • Create and configure Members folder purely in setupPortalContent. [hannosch]
  • Converted import and export steps XML files to use ZCML registrations. [hannosch]
  • Made sure to have a complete list of non-installable profiles. No longer apply the filter to base profiles and ignore our default profile. This works in combination with the corresponding changes in quick installer to reduce portal creation time. [hannosch]
  • Make use of the new authenticated flag for ResourceRegistries entries instead of specifying verbose condition expressions. [hannosch]
  • “Categories” are now “Tags”, in line with common usage and terminology. [limi]
  • Changed workflow actor variable from user/getUserName to user/getId. [hannosch]
  • Removed the AT graphviz references action from all content types. [davisagli]
  • Finished switching tool and action icons to use PNG format. [davisagli]
  • Exclude some of the CMFDefault functionality, that isn’t used or usable inside Plone sites. The CMFDefault types are no longer supported. [hannosch]
  • Move prefs_users_overview and prefs_groups_overview pages to (@@usergroup-userprefs and @@usergroup-groupprefs respectively). [esteele]
  • Adjust to CMF’s splitting of CMFCatalogAware into separate CatalogAware, WorkflowAware, and OpaqueItemManager mixins. [davisagli]
  • Added dependency, some strings are in zope domain such as ‘Invalid value’ and ‘(no value)’ found in portlet EditForm. [vincentfretin]
  • Moved membershipRolemapping.dtml and portrait_fix.dtml to PlonePAS. [davisagli]
  • Added icon_expr property to the Plone control panel tool actions, and switched to registering configlet icons here instead of in the action icons tool. [davisagli]
  • Moved the diff tool registration to this package, so it can still be a tool for Plone 4. [davisagli]
  • Use the new zope.ramcache in favor of [hannosch]
  • Removed GroupUserFolder skin layers. [davisagli]
  • Silenced the deprecation warning about old-style actions from CMFCore’s ActionProviderBase when listing configlets with the control panel tool. [davisagli]
  • Added the _IMREALLYPLONE4 hint to for PloneTestCase to use. [hannosch]
  • Removed the calendar and review portlets from the standard global assignments. The review list is better put onto a personal dashboard and the calendar is exceptionally slow and rather user unfriendly. The news and events portlets are a better fit to show-case the portlets system. [hannosch]
  • Include the overrides.zcml from Products.PlacelessTranslationService to actually make PTS’ language negotiator available to the zope.i18n machinery. [hannosch]
  • Got rid of the ToolNames indirection and declared the meta_types directly in the relevant tool class themselves. [hannosch]
  • Moved ATCT specific exportimport code into the ATCT package itself. [hannosch]
  • Made sure the plone.indexer registration works by introducing a more specific IPloneCatalogTool marker interface and registering the indexable object wrapper for this. [optilude]
  • Added a restricted version of the opaqueItems method for CMFCatalogAware. This takes the idea of experimental.opaquespeedup one step further. [hannosch]
  • Actually made the types tool action lookup optimization effective. Slightly optimized the add items drop-down menu. [hannosch]
  • Removed the ResourceRegistries skin layer. It only contained test code. [hannosch]
  • Make use of the new IContainer API of object managers and replace objectIds and objectValues calls. [hannosch]
  • Finally removed the interfacePatch for the IContainer interface of OFS.ObjectManager after it has been merged upstream. [hannosch]
  • Removed CMFTopic from our dependency list, it turns out that we aren’t actually using any of it. [hannosch]
  • Added proper deprecation warnings for the IBrowserDefault, IDynamicViewTypeInformation and ISelectableBrowserDefault interfaces, who has always come from Products.CMFDynamicViewFTI. [hannosch]
  • Use the replace_local_role_manager method from borg.localrole. [hannosch]
  • Deprecate our own IOrderedContainer interface in favor of the original one from OFS. [hannosch]
  • Avoid dependency on the package. [hannosch]
  • Declare package dependencies and fixed deprecation warnings for use of Globals. [hannosch]
  • No longer depend on the PageTemplates.GlobalTranslationService but use zope.i18n directly. [hannosch]
  • Merged in more performance optimizations from experimental.contentcreation. We don’t restrict the permissions for the temporary folder anymore, but only care about the permissions of the actual target folder. [hannosch]
  • Use the new icon_expr for specifying icons for content types instead. [hannosch]
  • Prefer path expressions over Python expressions for persistent expressions. [hannosch]
  • Fixed the content_status_history form to include the required content table. The old_folder_contents template is gone. [hannosch]
  • Fixed the browserDefault tests to use actual traversal to look up views for content items instead of relying on Acquisition. [hannosch]
  • Moved the scale_image function from utils into the PlonePAS.utils module, as PlonePAS is the only user of it. [hannosch]
  • The remaining functionality from GroupUserFolder has been merged into the PlonePAS package. GroupUserFolder is no longer required. [hannosch]
  • Removed the groups, groupdata, membership and memberdata tools from this package. All code is now in a central place inside PlonePAS. The persistent tools have been from the PlonePAS package since Plone 2.5. [hannosch]
  • Replaced has_key method calls with containment checks via in. [hannosch]
  • Replaced a direct interface invocation with a queryAdapter call, to avoid an internal getattr call and make the pattern clearer. [hannosch]
  • Replaced here with context in all templates and scripts. The old spelling is still supported, but we need to settle on one to avoid confusion. [hannosch]
  • Optimized the types tool action lookup further to avoid Acquisition lookups. [hannosch]
  • Simplified the normalizeString method. [hannosch]
  • Optimized the action lookup code and implemented category restriction for the types tool in the same way it was available for the actions tool. [hannosch]
  • Removed remaining sys.modules hacks to provide the browser.ploneview as browser.plone. [hannosch]
  • Removed last unused external methods and PloneInitialize code. To my knowledge the Windows installer doesn’t use this code anymore. [hannosch]
  • Write the doctype definition in the main_template in a way that does not claim to be valid XML, as the main_template really isn’t. [hannosch]
  • Worked around sys._getframe call in mark_view. [malthe, hannosch]
  • Removed macro slot for changing the document type; this was not correct XML and should this flexibility be required, it’s recommended to customize [malthe]
  • Turned deprecated string ‘Unauthorized’ exceptions into real exceptions. [davisagli]
  • Removed module alias for the ploneview formerly named plone. [hannosch]
  • Clarified content language versus response language handling. [hannosch]
  • Removed unmaintained and unused Favorite content type. [hannosch]
  • Removed our own home-grown dependency checking code. [hannosch]
  • Exposed option to honour exclude from navigation even in subfolders from navtree_preferences. Request from theming sprinter at ploneconf2008. [MatthewWilkes]
  • Made the fieldset tabbing code faster on startup (especially for IE) by constructing a big string and creating the HTML elements in one bunch instead of using DOM functions to add them step by step. [fschulze]
  • Added uniqueItemIndex as a method to the plone view. [hannosch]
  • Added back as a template including the (empty) macro definition. This allows main templates to be compatible with both Plone 3.x and 4.0 at the same time. [hannosch]
  • Removed and the globalize-hack. Templates now bring in their tool and function dependency using the standard utility views or via normal Acquisition of tools. [malthe, hannosch]
  • Fixed test for editing language fields. This refs [hannosch]
  • Removed deprecated context parameter in getDefaultPage and isDefaultPage in [maurits]
  • Made sure the export order of the factory tool GS step is consistent. This closes [hannosch]
  • Replaced lock_icon with smaller version with one third of the size. [hannosch]
  • Removed backwards-compatibility code in calendar_formfields.js introduced in Plone 3.1.4. Any date-time picker not based on using the old-style (no plone.jscalendar namespace) methods will no longer work until adjusted. [mj]
  • Don’t show relevance information of one percent in the search form, since sort_on searches will always show this for all entries This closes [hannosch]
  • Removed duplicated isMemberIdAllowed method from registration tool. [hannosch]
  • Fixed mailto link in event view and enhanced the spam protect script to allow setting css ids on the generated anchor tag. This closes [hannosch]
  • Fixed contact form to be usable for authenticated users which have no email address stored in their member data. This closes [hannosch]
  • Avoid empty tags in the contact form. This closes [hannosch]
  • Avoid an empty div in login_form. This closes [hannosch]
  • Avoid an empty dd in recently This closes [hannosch]
  • Avoid an empty span in folder_summary_view. This closes [hannosch]
  • Changed wording in personalize form to remove reference to external editor icon and add a note about ZopeEditManager. This closes [hannosch]
  • Changed webstats_js in portal properties to a text field. This refs [hannosch]
  • Added option to the error log control panel to search for an error log entry by number, since the number is the only thing that is exposed to normal users. This closes [hannosch]
  • Changed title of collections control panel to plural form. This closes [hannosch]
  • Include link to the upgrade manual from the migration tool inside the ZMI. This closes [hannosch]
  • Clarify help text in content_status_history. This closes [hannosch]
  • Let default RSS list publication date, not modified date and include the body text. This closes [hannosch]
  • Updated the check_id script to disallowed content by the name of properties. This closes [hannosch]
  • Fixed invalid markup in membershipRolemapping.dtml. This closes [hannosch]
  • Removed long unused script which wasn’t functional at all anymore, since it used Zope 2 interfaces. Also simplified the getObjPositionInParent function in the CatalogTool. This closes [hannosch]
  • Removed getActionObject call from createObject script. It was a private method and would always fail. This closes [hannosch]
  • Removed testing of sendto action visibilty from sendto.cpy. There’s a permission to use to restrict sending mail. This closes [hannosch]
  • Disable external editor icon for structural folders. This closes [hannosch]
  • Updated the check_id script to disallowed content by the name of zip or plone since this shadows the views by those names. This closes [hannosch]
  • Purged old Zope 2 Interface interfaces for Zope 2.12 compatibility. [elro]
  • Make use of upgrade steps with a source ‘*’ version and an explicit destination, to register the ‘enable site’ and ‘register tools as utilities’ only once. [hannosch]
  • Added support for upgrade step groups to the migration tool and started exposing the individual upgrade methods as steps. [hannosch]
  • Changed the way messages are handled during migration. We don’t pass an out list around anymore, but use the logging framework. [hannosch]
  • Replaced our own migration step registration by using GenericSetup steps directly. Changed the migration tool to integrate with GS instead. Added BBB code to read the instance version from the migration tool if the last profile version isn’t set yet inside the GS tool. [hannosch]
  • Exposed all our migration steps as GenericSetup upgrade steps. [hannosch]
  • Hide the deprecation warning about the moved ITranslatable interface for our own code. [hannosch]
  • Use png icons instead of gif icons since they are much more flexible for styling. [dannyb, wichert]
  • Fixed the coreVersions method in MigrationTool to return strings and not bound methods for the Zope and Python version. [hannosch]
  • Fixed off-by-two error in transaction_note. This closes [hannosch]
  • Moved all icons for real actions from the action icons tool to the actions themselves. [hannosch]
  • Changed PloneTool’s getIconFor method to prefer the icon expression set on the action itself instead of looking it up in the action icons tool. This finally makes use of the new icon expression on actions introduced in CMF 2.1. [hannosch]
  • Avoid unneeded line breaks in TAL output, by effectively disabling the internal beautified wrapping inside tags. This reduces the HTML output by 5% - 10% for normal Plone pages. [hannosch]
  • Memoize the installed products and packages in App.FactoryDispatcher for the duration of the process runtime. [hannosch]
  • Hiding page history, page navigation, and busy icon (spinner) in print.css Related to [siebo]
  • Updated webdav_enabled method in to check for webdav.interfaces.IWriteLock interface in addition to the old Zope2 interface. [hannosch]
  • Use a FauxArchetypeTool which returns no catalogs for CatalogMultiplex aware objects in portal factory. This prevents most temporary objects from being indexed in the first place. [tesdal, hannosch]
  • Move our GenericSetup import step registrations to zcml. [wichert]
  • Added a ‘do-not-use’ warning to the ZMI security screen for Plone content objects. Sharing tab or workflows are what you are looking for. [hannosch]
  • Moved interface declarations for factorytool from ZCML to the class. [hannosch]
  • Added BBB code for ITranslatable, which is now part of LinguaPlone. [hannosch]
  • Added an explicit button to add a new Plone site to the ZMI for faster access. If you have installed Plone this is probably what you want to add most of the time. The button only shows up in the root folder. [hannosch]
  • Deprecate the ITranslatable interface. This interface is LinguaPlone- specific and has thus been moved to LinguaPlone. [wichert]
  • Removed tests for isRTL method of PTS. The method was deprecated in the last release and is gone now. [hannosch]
  • Removed PTSTranslationDomain utilities. PTS exposes all translation files as pure Zope3 translation utilities now, so these aren’t needed anymore. [hannosch]
  • Replaced our FasterStringIO implementation by one based on collections.deque, which is a faster than StringIO. [hannosch]
  • Removed more deprecated code, adjusted some comments. [hannosch]
  • Tweaked sortable_title method to give reasonable results for titles with many numbers in them, like ‘1.2.3 document’. [hannosch]
  • Moved CMF skins registration into configure.zcml, removed security declaration for no-longer extant listPolicies of the portal. [hannosch]
  • Refactored initial content creation into a separate extension profile, thus making it possible to skip it. This refs [hannosch]
  • Removed some outdated Extension scripts. [hannosch]
  • Removed deprecated tool related Zope2 interfaces. Extended the deprecation period for ConstrainTypes and NonStructuralFolder as these are still used in Plone Core. [hannosch]
  • Removed work-around code for insertion of non-unicode non-ascii non-utf8 encoded text in TAL. This will produce an error now. Always use Unicode when using data in page templates and TAL. [hannosch]
  • Removed lots of deprecated code and zcml registrations. [hannosch]
  • Fixed ticket #9420 not emitted if only Publishing Date is set. [jaroel]

Project details

Release history Release notifications

Download files

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

Filename, size & hash SHA256 hash help File type Python version Upload date (1.5 MB) Copy SHA256 hash SHA256 Source None

Supported by

Elastic Elastic Search Pingdom Pingdom Monitoring Google Google BigQuery Sentry Sentry Error logging AWS AWS Cloud computing DataDog DataDog Monitoring Fastly Fastly CDN SignalFx SignalFx Supporter DigiCert DigiCert EV certificate StatusPage StatusPage Status page