Upgrading Plone 4.x To 5.0¶
Description
Instructions and tips for upgrading to a newer Plone version.
Note
If you want to upgrade add-ons to Plone 5, also see Upgrade a custom add-on to Plone 5.0
General Information¶
Before you upgrade read Upgrading Plone and Preparations.
Always upgrade from the latest version of 4.x to the latest version of 5.x (at the time of writing 4.3.7 to 5.0.2). This will resolve many migration-specific issues.
If you have problems don’t be afraid to ask for help on http://community.plone.org
There is a video of a talk “How to upgrade sites to Plone 5” and slides.
Changes Due To Implemented PLIPS¶
PLIPs are PLone Improvement Proposals. These are about larger changes to Plone, discussed beforehand by the community.
PLIP 13350 “Define Extra Member Properties TTW”¶
In Plone 5, the custom fields displayed in the user profile form and the registration form are managed by plone.schemaeditor.
They are dynamically editable from the Plone control panel, and can be imported from a Generic Setup profile file named userschema.xml.
If you have some custom member properties in your Plone site, be aware that:
extra attributes defined in memberdata_properties.xml will be preserved, but they will not be automatically shown in the user profile form or the registration form,
if you have implemented some custom forms in order to display your custom member attributes, they will not work anymore as plone.app.users is now based on z3c.form. You can replace them by declaring their schema in userschema.xml.
Note
When a custom field is defined in userschema.xml, its corresponding attribute is automatically created in the portal_memberdata tool, so there is no need to declare it in memberdata_properties.xml.
memberdata_properties.xml will only handled attributes that are not related to the user profile form or the registration form.
PLIP 13419 “Improvements For User Ids And Login Names”¶
Since Plone 4.0 you could switch to using email as login in the security control panel. In Plone 5.0 some related improvements were made. When you are already using email as login, during the Plone 5.0 migration the login names will be transformed to lowercase.
When the email addresses are not unique,
for example you have both joe@example.org
and JOE@example.org
,
the migration will fail.
Best is to fix this in your site in Plone 4, by changing email addresses or removing no longer needed users. When there are only a few users, you can do this manually. To assist you in sites with many users, in Plone 4.1 and higher, you can add the collective.emaillogin4 package to the eggs of your Plone instance.
With that package, even without installing it in the add-ons control panel,
you can call the @@migrate-to-emaillogin
page to look for duplicate email addresses.
Note
This PLIP basically integrates the collective.emaillogin4
package in Plone 5.
Other PLIP Changes¶
PLIPs that resulted in changes that will have to be documented in this upgrade-guide.
- plone.api
Todo: Tell people to use it. Explain how to configure plone.recipe.codeanalysis to check for old-style code Roel
- plone.app.multilingual
Todo: How to migrate from LP to PAM
- Convert control panels to use z3c.form
Todo: How to migrate your custom control-panels Who: Tisto
- Main_template rebirth to HTML5 bloodbare
Todo: What to do when you customized your main_templates. Who: ?
- Automatic CSRF Protection
Todo: How to protect your existing forms Who: Nathan
- Linkintegrity in Plone 5
Who: pbauer
Security Setting Changes¶
complex, look betas.py TODO
Mail Setting Changes¶
Markup Setting Changes¶
User And Group Setting Changes¶
Imaging Changes¶
Login Setting Changes¶
Changed Imports And Functions¶
Products.CMFPlone.interfaces.IFactoryTool¶
This is now moved to ATContentTypes.
Example:
try:
# Plone 4
from Products.CMFPlone.interfaces import IFactoryTool
except ImportError:
# Plone 5
from Products.ATContentTypes.interfaces.factory import IFactoryTool
plone.app.multilingual¶
Note
The preferred translation add-on for Plone 5 is plone.app.multilingual. This package supersedes LinguaPlone.
Warning
This is still work in progress
There are 3 different parts to the migration from LinguaPlone to plone.app.multilingual:
From LP to PAM 2.X - on Plone 4 and than to Plone 5 (PAM 3.X)
See: https://github.com/plone/plone.app.multilingual/issues/181
From PAM 1.X to 2.X - on Plone 4 and than to Plone 5 (PAM 3.X)
Step 1: plone.multilingual is merged into plone.app.multilingual. Imports in your custom code needs to be changed: See:https://github.com/plone/plone.app.multilingual/issues/181#issuecomment-141661848
Step 2: Removed plone.multilingualbehavior: https://github.com/plone/plone.app.multilingual/issues/183
Step 3: TODO
From PAM 2.X on Plone 4 to Plone 5 (PAM 3.X)
Step 1: plone.multilingual is merged into plone.app.multilingual. Imports in your custom code needs to be changed: See:https://github.com/plone/plone.app.multilingual/issues/181#issuecomment-141661848 https://github.com/plone/Products.CMFPlone/issues/1187
Archetypes¶
Plone 5 now uses dexterity as the content type engine instead of Archetypes.
For packages that still use Archetypes, you’ll need to install the ATContentTypes base package.
The easiest way to get the dependencies for Archetypes (uuid_catalog, reference_catalog, archetypes_tool) is to add the following profile to your dependencies in metadata.xml
:
<dependencies>
...
<dependency>Products.ATContentTypes:base</dependency>
</dependencies>
See https://github.com/smcmahon/Products.PloneFormGen/blob/master/Products/PloneFormGen/profiles/default/metadata.xml for a working example.
Resource Registry¶
Plone 5 introduces some new concepts, for some, with working with JavaScript in Plone. Plone 5 utilizes Asynchronous Module Definition (AMD) with requirejs.
We chose AMD over other module loading implementations(like commonjs) because AMD can be used in non-compiled form in the browser.
This way, someone can click “development mode” in the resource registry control panel and work with the non-compiled JavaScript files directly.
Getting back on point, much of Plone’s JavaScript was or still is using JavaScript in a non-AMD form. Scripts that expect JavaScript dependency scripts and objects to be globally available and not loaded synchronously will have a difficult time figuring out what is going on when upgrading to Plone 5.
There are two scenarios where this will happen that we’ll tackle in this post. - 1) You have JavaScript registered in portal_javascripts that are not AMD compatible. - 2) You have JavaScript included in the head tag of your theme and/or specific page templates that are not AMD compatible.
Working With Deprecated Portal_javascripts¶
The deprecated resource registries(and portal_javascripts) has no concept of dependency management. It allowed you to specify an order in which JavaScript files should be included on your site.
It also would combined and minify them for you in deployment mode.
Registration Changes¶
Prior to Plone 5, JavaScript files were added to the registry by using a Generic Setup Profile and including a jsregistry.xml file to it.
This would add your JavaScript to the registry, with some options and potentially set ordering.
In Plone 5.0, Plone will still recognize these jsregistry.xml files. Plone tries to provide a shim for them. It does this by adding all jsregistry.xml JavaScripts into the “plone-legacy” Resource Registry bundle.
This bundle includes a global jQuery object and includes the resources in sequential order after it.
However, you should consider at least migrating your resources as described in https://github.com/collective/example.p4p5 to gain control over your dependencies or if you want to keep backward compatibility to older Plone versions in your Add-ons.
Old Style jsregistry.xml¶
An old style Resource Registry would look like this:
<?xml version="1.0"?>
<object name="portal_javascripts">
<javascript
id="++resource++foobar.js"
inline="False"
/>
</object>
To migrate this to Plone 5, resource registrations are all done in the Configuration Registry.
New Style With registry.xml¶
The new registration will look something like:
<?xml version="1.0"?>
<registry>
<records prefix="plone.resources/foobar"
interface='Products.CMFPlone.interfaces.IResourceRegistry'>
<value key="js">.++resource++foobar.js</value>
<value key="deps">jquery</value>
</records>
</registry>
Notice how I’ve now added the deps property of “jquery”. This is not necessary – I’m just giving an example that this script needs a global jQuery available.
This alone will not get your JavaScript included however. In order to modernize our JavaScript stack, Plone needed to make some changes with how it included JavaScript. All we’ve done so far is define a resource.
For a resource to be included, it needs to be part of a bundle. A bundle defines a set of resources that should be compiled together and distributed to the browser.
You either need to add your resource to an existing bundle or create your own bundle.
In this post, we’ll describe the process of creating your own bundle. Again, we use registry.xml for configuration:
<records prefix="plone.bundles/foobar"
interface='Products.CMFPlone.interfaces.IBundleRegistry'>
<value key="resources">
<element>foobar</element>
</value>
<value key="enabled">True</value>
<value key="jscompilation">++resource++foobar-compiled.min.js</value>
<value key="last_compilation">2015-02-06 00:00:00</value>
</records>
One important aspect here is the “jscompilation” settings. This defines the compiled resource used in production mode.
But, It’s A Bit More Work¶
Yes, we know. We tried very hard to figure out the easiest way to modernize Plone’s JavaScript development stack. The old, sequential inclusion is not useful these days.
That being said, adding resources, bundles and compiling them can all be done Through The Web(TTW) in the new Resource Registries configuration panel. That way you can turn on development mode, compile your resources and then copy that compiled version into your package for distribution and not need to know any newfangled nodejs technologies like grunt, gulp, bower, npm, etc.
Updating Non-AMD Scripts¶
If you are not including your JavaScript in the Resource Registries and need it to work alongside Plone’s JavaScript because you’re manually including the JavaScript files in one way or another(page templates, themes), there are a number of techniques available to read on the web that describe how to make your scripts conditionally work with AMD.
For the sake of this post, I will describe one technique used in Plone core to fix the JavaScript.
The change we’ll be investigating can be seen with in a commit to plone.app.registry.
plone.app.registry has a control panel that allows some Ajax searching and modals for editing settings.
To utilize the dependency management that AMD provides and have the JavaScript depend on jQuery, we can wrap the script in an AMD require function.
This function allows you to define a set of dependencies and a function that takes as arguments, those dependencies you defined. After the dependencies are loaded, the function you defined is called.
Example:
require([
'jquery',
'pat-registry'
], function($, Registry) {
'use strict';
...
// All my previous JavaScript file code here
...
});
Here, the two dependencies we have are jQuery and the pattern registry. I will not get into the pattern registry as it’s off topic for this discussion –it is basically a registry of JavaScript components.
The necessity for using it here is with Ajax calls and binding new DOM elements dynamically added to the page.
Additionally, above this require call, I provide some backward compatible code that you can inspect.
It’s not necessary in this case but I added it to show how someone could make their script work when requirejs was available and when it was not.
Caveats¶
Compilation¶
Prior to Plone 5, when a resource was changed or added to the JavaScript registry, the registry would automatically re-compile all your JavaScript files.
In switching to AMD, the compile step is much more resource intensive. It takes so long, there is no way we could do this real-time. Additionally, it can not be done in Python.
When changes are made to existing bundles, re-compilation will need to be done TTW (Trough-The-Web) in the Resource Registries control panel.
There is a build button next to each bundle. For advanced users, compilation can be done using a tool like grunt in your development environment.
Conditional Resources¶
In Plone 5, individual resources can not be registered conditionally to certain page. This is due to the way we build JavaScript with AMD.
Instead we have Python helper-methods in the Resource Registry to add custom JS and CSS to your views or forms.
Instead of using the legacy fill-slot like this (Plone 4):
<metal:slot fill-slot="javascript_head_slot">
...
</metal:slot>
<metal:slot fill-slot="css_slot">
...
</metal:slot>
In Plone 5 it’s recommended to instead use the new Python methods you can find in Products.CMFPlone.resources
:
from Products.CMFPlone.resources import add_bundle_on_request
from Products.CMFPlone.resources import add_resource_on_request
add_resource_on_request(self.request, 'jquery.recurrenceinput')
add_bundle_on_request(self.request, 'thememapper')
This is better than always loading a resource or bundle for your whole site.
Only bundles can be conditionally included. If you have a resource that needs to be conditionally included, it will likely need its own bundle.
Control Panel¶
In Plone 4.x, the Plone configuration settings have been stored as portal properties spread across the Management Interface. In Plone 5, those settings are all stored as plone.app.registry entries in registry.xml.
There are now sections in the control panel, this can be set from the controlpanel.xml. See the current definitions for more information.
The display of icons for control panels is now controlled by css. The name of the control panel is normalized into a css class, which is applied to the link in the main layout of all control panels.
For example, if the “appId” of your control panel (as set in controlpanel.xml in your install profile) is “MyPackage” then the css class that will be generated is “.icon-controlpanel-MyPackage”.
To have an icon for your control panel you must make sure that a css rule exists for that generated css class.
An example might be
.icon-controlpanel-MyPackage:before { content: ‘\e844’; }
The value you use for this css rule should identify one of the fontello icons included in Plone, or a font-based icon provided by your package itself.
It is not possible at this time to set an icon for your add-on package control panels without including css in your package.
For documentation on how to use it in your own add-ons see Training materials
Properties¶
In the past editor settings were part of the portal properties which contained a site properties object with the relevant attributes.
site properties allowed direct attribute access, so you could access the available_editors via:
ptools.site_properties.available editors
Now you can access the property via get_registry_record()
>>> from plone import api
>>> api.portal.get_registry_record('plone.available_editors')
The keys mostly the same, they are only prefixed with plone. now. Normally, you do not modify or access these records.
Instead you change the settings in your genericsetup profile in the file propertiestool.xml
Old Property Sheet |
Old Key |
New Property |
navtree_properties |
sortAttribute |
TBD |
navtree_properties |
sortOrder |
TBD |
navtree_properties |
sitemapDepth |
TBD |
navtree_properties |
root |
TBD |
navtree_properties |
currentFolderOnlyInNavtree |
TBD |
navtree_properties |
includeTop |
TBD |
navtree_properties |
topLevel |
TBD |
navtree_properties |
bottomLevel |
TBD |
navtree_properties |
showAllParents |
TBD |
navtree_properties |
idsNotToList |
TBD |
navtree_properties |
parentMetaTypesNotToQuery |
TBD |
navtree_properties |
metaTypesNotToList |
TBD |
navtree_properties |
enable_wf_state_filtering |
TBD |
navtree_properties |
wf_states_to_show |
TBD |
site_properties |
allowAnonymousViewAbout |
plone.allow_anon_views_about |
site_properties |
displayPublicationDateInByline |
plone.display_publication_date_byline |
site_properties |
default_language |
plone.default_language |
site_properties |
default_charset |
TBD |
site_properties |
ext_editor |
plone.ext_editor |
site_properties |
available_editors |
plone.available_editors |
site_properties |
default_editor |
plone.default_editor |
site_properties |
allowRolesToAddKeywords |
TBD |
site_properties |
autho_cookie_length |
plone.auth_cookie_length |
site_properties |
calendar_starting_year |
TBD |
site_properties |
calender_future_years_available |
TBD |
site_properties |
invalid_ids |
TBD |
site_properties |
default_page |
TBD |
site_properties |
search_results_description_length |
plone.search_results_description_length |
site_properties |
ellipsis |
TBD |
site_properties |
typesLinkToFolderContentsInFC |
TBD |
site_properties |
visible_ids |
TBD |
site_properties |
exposeDCMetaTags |
plone.exposeDCMetaTags |
site_properties |
types_not_searched |
plone.types_not_searched |
site_properties |
search_review_state_for_anon |
REMOVED |
site_properties |
search_enable_description_search |
REMOVED |
site_properties |
search_enable_sort_on |
REMOVED |
site_properties |
search_enable_batch_size |
REMOVED |
site_properties |
search_collapse_options |
REMOVED |
site_properties |
disable_folder_section |
SPECIAL |
site_properties |
disable_nonfolderish_sections |
REMOVED |
site_properties |
typesUseViewActionInListings |
plone.types_use_view_action_in_listings |
site_properties |
verify_login_name |
plone.verify_login_name |
site_properties |
many_users |
plone.many_users |
site_properties |
many_groups |
plone.many_groups |
site_properties |
enable_livesearch |
plone.enable_livesearch |
site_properties |
default_page_types |
TBD |
site_properties |
use_folder_contents |
REMOVED |
site_properties |
forbidden_contenttypes |
TBD |
site_properties |
default_contenttype |
REMOVED |
site_properties |
enable_sitemap |
plone.enable_sitemap |
site_properties |
number_of_days_to_keep |
REMOVED |
site_properties |
enable_inline_editing |
REMOVED |
site_properties |
lock_on_ttw_edit |
plone.lock_on_ttw_edit |
site_properties |
enable_link_integrity_checks |
plone.enable_link_integrity_checks |
site_properties |
webstats_js |
plone.webstats_js |
site_properties |
external_links_open_new_window |
TBD |
site_properties |
icon_visibility |
plone.icon_visibility |
site_properties |
mark_special_links |
TBD |
site_properties |
redirect_links |
TBD |
site_properties |
use_email_as_login |
plone.use_email_as_login |
site_properties |
user_registration_fields |
SPECIAL |
site_properties |
allow_external_login_sites |
plone.allow_external_login_sites |
site_properties |
external_login_url |
plone.external_login_url |
site_properties |
external_logout_url |
plone.extenal_logout_url |
site_properties |
external_login_iframe |
plone.external_login_iframe |
disable_folder_sections¶
This property has been removed and the logic is different. You can influence the portal tab generation with the property plone.generate_tabs This controls, if the tabs are generated from the content in the root folder.
In addition, you can control if non folders will create entries or not with the property plone.nonfolderish_tabs. If you want to disable_folder_sections, you will want to set plone.generate_tabs to false.
Generic Setup¶
All settings for control panels are stored in the registry.xml Generic Setup file. This file can be exported through the Management Interface.
Go to the Plone Site Setup, choose Management Interface from the “Advanced” section. Click on portal_setup. Go to the “export” tab. Choose the Export the configuration registry schemata check-box and click the Export selected steps button.
The registry.xml file will contain entries like this
<record name="plone.available_editors"
interface="Products.CMFPlone.interfaces.controlpanel.IEditingSchema" field="available_editors">
<value>
<element>TinyMCE</element>
<element>None</element>
</value>
</record>
<record name="plone.available_languages" interface="Products.CMFPlone.interfaces.controlpanel.ILanguageSchema" field="available_languages">
<value>
<element>en-us</element>
</value>
</record>
Drop the settings you want to change into registry.xml in you Generic Setup profile folder.
Re-install your add-on product and the settings will be available.
Python Code¶
All Generic Setup settings can be looked up with Python code.
First we lookup the registry utility
>>> from zope.component import getUtility
>>> from plone.registry.interfaces import IRegistry
>>> registry = getUtility(IRegistry)
Now we use the schema ‘ISearchSchema’ to lookup for a RecordProxy object with all fields
>>> from Products.CMFPlone.interfaces import ISearchSchema
>>> search_settings = registry.forInterface(ISearchSchema, prefix='plone')
Now we an get and set all fields of the schema above like
>>> search_settings.enable_livesearch
True
If you want to change a setting, change the attribute
>>> search_settings.enable_livesearch = False
Now the enable_livesearch should disabled
>>> search_settings.enable_livesearch
False
Editing Control Panel¶
Plone 5.x
>>> from Products.CMFPlone.interfaces import IEditingSchema
>>> editing_settings = registry.forInterface(IEditingSchema, prefix='plone')
>>> editing_settings.default_editor
u'TinyMCE'
>>> editing_settings.ext_editor
False
>>> editing_settings.enable_link_integrity_checks
True
>>> editing_settings.lock_on_ttw_edit
True
Language Control Panel¶
All settings were managed with the tool portal_languages and with the GenericSetup file portal_languages.xml. Now these attributes are managed with Plone properties.
As Plone 5 has full migration during an upgrade, please perform the upgrade and export the registry settings in GenericSetup to get the right settings.
If you access attributes directly in your code, you must change your accessors. You know already how to get attributes from the portal_languages tool.
The new attributes can be accessed via plone.api as described above.
old attribute |
new attribute |
root.portal_languages.supported_langs |
plone.available_languages |
site.portal_properties.site_properties.default_language or site.default_language |
plone.default_language |
root.portal_languages.use_combined_language_codes |
plone.use_combined_language_codes |
root.portal_languages.display_flags |
plone.display_flags |
portal_languages.use_path_negotiation |
plone.use_path_negotiation |
portal_languages.use_content_negotiation |
plone.use_content_negotiation |
portal_languages.use_cookie_negotiation |
plone.use_cookie_negotiation |
portal_languages.set_cookie_everywhere |
plone.set_cookie_always |
portal_languages.authenticated_users_only |
plone.authenticated_users_only |
portal_languages.use_request_negotiation |
plone.use_request_negotiation |
portal_languages.use_cctld_negotiation |
plone.use_cctld_negotiation |
portal_languages.use_subdomain_negotiation |
plone.use_subdomain_negotiation |
portal_languages.always_show_selector |
plone.always_show_selector |
Plone 5.x
>>> from Products.CMFPlone.interfaces import ILanguageSchema
>>> language_settings = registry.forInterface(ILanguageSchema, prefix='plone')
>>> language_settings.available_languages
['en']
Mail Control Panel¶
All settings were managed with the tool MailHost and with the GenericSetup file portal_languages.xml. Now these attributes are managed with Plone properties.
As Plone 5 has full migration during an upgrade, please perform the upgrade and export the registry settings in GenericSetup to get the right settings.
If you access attributes directly in your code, you must change your accessors.
You know already how to get attributes from the portal_languages tool. The new attributes can be accessed via plone.api as described above.
old attribute |
new attribute |
MailHost.smtp_host |
plone.smtp_host |
MailHost.smtp_port |
plone.smtp_port |
MailHost.smtp_user_id |
plone.smtp_user_id |
MailHost.smtp_pass |
plone.smtp_pass |
MailHost.email_from_address |
plone.email_from_address |
MailHost.email_from_name |
plone.email_from_name |
Maintenance Control Panel¶
Plone 5.x
>>> from Products.CMFPlone.interfaces import IMaintenanceSchema
>>> maintenance_settings = registry.forInterface(IMaintenanceSchema, prefix='plone')
>>> maintenance_settings.days
7
Search Control Panel¶
Plone 5.x
>>> from Products.CMFPlone.interfaces import ISearchSchema
>>> search_settings = registry.forInterface(ISearchSchema, prefix='plone')
>>> search_settings.enable_livesearch
False
>>> search_settings.types_not_searched
(...)
Site Control Panel¶
Plone 4.x
>>> portal = getSite()
>>> portal_properties = getToolByName(portal, "portal_properties")
>>> site_properties = portal_properties.site_properties
>>> portal.site_title = settings.site_title
>>> portal.site_description = settings.site_description
>>> site_properties.enable_sitemap = settings.enable_sitemap
>>> site_properties.exposeDCMetaTags = settings.exposeDCMetaTags
>>> site_properties.webstats_js = settings.webstats_js
>>> settings.enable_sitemap -> plone.app.layout
Plone 5.x
>>> from Products.CMFPlone.interfaces import ISiteSchema
>>> site_settings = registry.forInterface(ISiteSchema, prefix='plone')
>>> site_settings.site_title
u'Plone site'
>>> site_settings.exposeDCMetaTags
False
>>> site_settings.enable_sitemap
False
>>> site_settings.webstats_js
u''
Overview Control Panel¶
Plone 5.x
>>> from Products.CMFPlone.interfaces.controlpanel import IDateAndTimeSchema
>>> tz_settings = registry.forInterface(IDateAndTimeSchema, prefix='plone')
>>> tz_settings.portal_timezone = 'UTC'
Markup Control Panel¶
Plone 5.x
>>> from Products.CMFPlone.interfaces import IMarkupSchema
>>> markup_settings = registry.forInterface(IMarkupSchema, prefix='plone')
>>> markup_settings.default_type
u'text/html'
>>> markup_settings.allowed_types
('text/html', 'text/x-web-textile')
User and Groups Control Panel¶
Plone 5.x
>>> from Products.CMFPlone.interfaces import IUserGroupsSettingsSchema
>>> usergroups_settings = registry.forInterface(IUserGroupsSettingsSchema, prefix='plone')
>>> usergroups_settings.many_groups
False
>>> usergroups_settings.many_users
False
portal_languages is now a utility¶
Part of the work on PLIP 13091 (plone.app.multilingual) required to move portal_languages
to a utility.
Code that used to look like this:
# OLD 4.x approach
portal.portal_languages.getDefaultLanguage()
Now it should look like this:
# NEW in 5.0
language_tool = api.portal.get_tool('portal_languages')
language_tool.getDefaultLanguage()
Tests Changes¶
In Plone 4.x a date or date time widget used to be rendered as a set of input fields
# OLD 4.x approach
browser_manager.getControl(name='form.widgets.IPublication.effective-year').value = '2015'
browser_manager.getControl(name='form.widgets.IPublication.effective-month').value = ['10']
browser_manager.getControl(name='form.widgets.IPublication.effective-day').value = '11'
browser_manager.getControl(name='form.widgets.IPublication.effective-hour').value = '15'
browser_manager.getControl(name='form.widgets.IPublication.effective-min').value = '14'
Now the same input field will be rendered as a single string input
# NEW in 5.0
browser_manager.getControl(name='form.widgets.IPublication.effective').value = '2015-10-11 15:14'
Deprecation Of portal_properties.xml
¶
portal_properties.xml
Generic Setup import step is now deprecated and has been moved to plone.registry.
parentMetaTypesNotToQuery¶
# OLD 4.x approach
<object name="portal_properties">
<object name="navtree_properties">
<property name="parentMetaTypesNotToQuery" purge="false">
<element value="my.hidden.content.type" />
</property>
</object>
</object>
Now in registry.xml
should look like
# NEW in 5.0
<?xml version="1.0"?>
<registry>
<record
name="plone.parent_types_not_to_query"
interface="Products.CMFPlone.interfaces.controlpanel.INavigationSchema"
field="parent_types_not_to_query">
<value>
<element value="my.hidden.content.type" />
</value>
</record>
</registry>
metaTypesNotToList¶
# OLD 4.x approach
<?xml version="1.0"?>
<object name="portal_properties">
<object name="navtree_properties">
<property name="metaTypesNotToList" purge="false">
<element value="my.hidden.content.type" />
</property>
</object>
nothing should be done in Plone 5.
The new setting is on Products.CMFPlone.interfaces.controlpanel.INavigationSchema.displayed_types
and it works the other way around.
Instead of blacklisting content types it whitelists them, if you don’t want your content type to show there’s nothing to do.
typesLinkToFolderContentsInFC¶
# OLD 4.x approach
<?xml version="1.0"?>
<object name="portal_properties">
<object name="site_properties">
<property name="typesLinkToFolderContentsInFC" purge="false">
<element value="my.fancy.content.type" />
</property>
</object>
</object>
Now in registry.xml
should look like
# NEW in Plone 5
<record
name="plone.types_use_view_action_in_listings"
interface="Products.CMFPlone.interfaces.controlpanel.ITypesSchema"
field="types_use_view_action_in_listings">
<value>
<element>my.fancy.content.type</element>
</value>
</record>
types_not_searched¶
# OLD 4.x approach
<?xml version="1.0"?>
<object name="portal_properties">
<object name="site_properties">
<property name="types_not_searched" purge="false">
<element value="my.fancy.content.type" />
</property>
</object>
</object>
Now in registry.xml
should look like
# NEW in Plone 5
<?xml version="1.0"?>
<registry>
<record
name="plone.types_not_searched"
interface="Products.CMFPlone.interfaces.controlpanel.ISearchSchema"
field="types_not_searched">
<value>
<element>my.fancy.content.type</element>
</value>
</record>
</registry>
Social Media Changes¶