Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Dx siteroot #256

Merged
merged 5 commits into from
Sep 11, 2021
Merged
Show file tree
Hide file tree
Changes from 4 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions news/0000.breaking
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
FIXME: Upgrade to dx site root
49 changes: 46 additions & 3 deletions plone/app/upgrade/v60/alphas.py
Original file line number Diff line number Diff line change
@@ -1,19 +1,22 @@
# -*- coding: utf-8 -*-
from plone.app.upgrade.utils import loadMigrationProfile
from plone.dexterity.fti import DexterityFTI
from Products.CMFCore.utils import getToolByName
from ZODB.broken import Broken
from zope.component.hooks import getSite

import logging


logger = logging.getLogger('plone.app.upgrade')
logger = logging.getLogger("plone.app.upgrade")


def to60alpha1(context):
loadMigrationProfile(context, 'profile-plone.app.upgrade.v60:to60alpha1')
loadMigrationProfile(context, "profile-plone.app.upgrade.v60:to60alpha1")


def remove_temp_folder(context):
"""Remove temp_folder from Zope root if broken."""
from ZODB.broken import Broken

app = context.unrestrictedTraverse("/")
broken_id = "temp_folder"
Expand All @@ -34,3 +37,43 @@ def remove_temp_folder(context):
del app._mount_points[broken_id]
app._p_changed = True
logger.info("Removed %s from Zope root _mount_points.", broken_id)


def change_plone_site_fti(context):
pt = getToolByName(context, "portal_types")
fti = pt.getTypeInfo("Plone Site")

if isinstance(fti, DexterityFTI):
# We assume the fti has been already fixed ...
return

# ... otherwise we fix it
del pt["Plone Site"]
loadMigrationProfile(context, "profile-plone.app.upgrade.v60:to_dx_site_root")


def make_site_dx(context):
"""Make the Plone Site a dexterity container"""
portal = getSite()

if portal._tree is not None:
# We assume the object has been already initialized
return

portal._initBTrees()

for obj_meta in portal._objects:
obj_id = obj_meta["id"]
logger.info("Migrating object %r", obj_id)
# Load the content object ...
obj = portal.__dict__.pop(obj_id)
if not isinstance(obj, Broken) and obj_id not in (
"portal_quickinstaller",
"portal_form_controller",
):
# ...and insert it into the btree.
# Use _setOb so we don't reindex stuff: the paths stay the same.
portal._setOb(obj_id, obj)

delattr(portal, "_objects")
portal._p_changed = True
10 changes: 10 additions & 0 deletions plone/app/upgrade/v60/configure.zcml
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,16 @@
destination="6000"
profile="Products.CMFPlone:plone">

<gs:upgradeStep
title="Be sure that the Plone Site FTI is a dexterity one"
handler=".alphas.change_plone_site_fti"
/>

<gs:upgradeStep
title="Make the Plone Site a dexterity container"
handler=".alphas.make_site_dx"
/>

<gs:upgradeStep
title="Run to60alpha1 upgrade profile."
description=""
Expand Down
12 changes: 12 additions & 0 deletions plone/app/upgrade/v60/profiles.zcml
Original file line number Diff line number Diff line change
Expand Up @@ -12,4 +12,16 @@
provides="Products.GenericSetup.interfaces.EXTENSION"
/>

<!--
This is special, we want to reread the profile to create the FTI only if the old FTI
is not already a Dexterity one
-->
<genericsetup:registerProfile
name="to_dx_site_root"
title="Upgrade profile to change the FTI for the Plone Site object a dexterity one"
directory="profiles/to_dx_site_root"
for="Products.CMFPlone.interfaces.IMigratingPloneSiteRoot"
provides="Products.GenericSetup.interfaces.EXTENSION"
/>

</configure>
4 changes: 4 additions & 0 deletions plone/app/upgrade/v60/profiles/to_dx_site_root/types.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
<?xml version="1.0"?>
<object name="portal_types" meta_type="Plone Types Tool">
<object name="Plone Site" meta_type="Dexterity FTI" />
</object>
Original file line number Diff line number Diff line change
@@ -0,0 +1,79 @@
<?xml version="1.0"?>
<object
i18n:domain="plone"
meta_type="Dexterity FTI"
name="Plone Site"
xmlns:i18n="http://xml.zope.org/namespaces/i18n">

<!-- Basic properties -->
<property
i18n:translate=""
name="title">Plone Site</property>
<property
i18n:translate=""
name="description"></property>

<property name="allow_discussion">False</property>
<property name="factory">manage_addSite</property>
<property name="icon_expr"></property>
<property name="link_target"></property>

<!-- Hierarchy control -->
<property name="allowed_content_types"/>
<property name="filter_content_types">False</property>
<property name="global_allow">False</property>

<!-- Schema, class and security -->
<property name="add_permission">cmf.AddPortalContent</property>
<property name="klass">Products.CMFPlone.Portal.PloneSite</property>
<property name="model_file">plone.app.contenttypes.schema:folder.xml</property>
<property name="model_source"></property>
<property name="schema"></property>

<!-- Enabled behaviors -->
<property name="behaviors" purge="false">
<element value="plone.dublincore" />
<element value="plone.richtext" />
<element value="plone.relateditems" />
<element value="plone.locking" />
<element value="plone.allowdiscussion" />
<element value="plone.excludefromnavigation" />
<element value="plone.tableofcontents" />
</property>

<!-- View information -->
<property name="add_view_expr">string:${folder_url}/addPlone Site</property>
<property name="default_view">listing_view</property>
<property name="default_view_fallback">False</property>
<property name="immediate_view">view</property>
<property name="view_methods">
<element value="album_view"/>
<element value="event_listing"/>
<element value="full_view"/>
<element value="listing_view"/>
<element value="summary_view"/>
<element value="tabular_view"/>
</property>

<!-- Method aliases -->
<alias from="(Default)" to="(dynamic view)"/>
<alias from="edit" to="@@edit"/>
<alias from="sharing" to="@@sharing"/>
<alias from="view" to="(selected layout)"/>
<action title="View" action_id="view" category="object" condition_expr=""
url_expr="string:${object_url}" visible="True"
i18n:attributes="title">
<permission value="View"/>
</action>
<action
action_id="edit"
category="object"
condition_expr="not:object/@@plone_lock_info/is_locked_for_current_user|python:True"
i18n:attributes="title"
title="Edit"
url_expr="string:${object_url}/edit"
visible="True">
<permission value="Modify portal content"/>
</action>

</object>