diff --git a/news/183.bugfix b/news/183.bugfix new file mode 100644 index 00000000..3455d499 --- /dev/null +++ b/news/183.bugfix @@ -0,0 +1,2 @@ +Tolerate lack of legacy resource registry +[ksuess] diff --git a/plone/app/upgrade/__init__.py b/plone/app/upgrade/__init__.py index 1e11d673..beb03f6d 100644 --- a/plone/app/upgrade/__init__.py +++ b/plone/app/upgrade/__init__.py @@ -7,6 +7,13 @@ import sys +try: + pkg_resources.get_distribution('Products.ResourceRegistries') +except pkg_resources.DistributionNotFound: + IS_PRODUCT_RESOURCE_REGISTRIES_INSTALLED = False +else: + IS_PRODUCT_RESOURCE_REGISTRIES_INSTALLED = True + try: from zope.app.cache.interfaces.ram import IRAMCache # noqa F401 except ImportError: diff --git a/plone/app/upgrade/tests/base.py b/plone/app/upgrade/tests/base.py index 322380fc..f773d8eb 100644 --- a/plone/app/upgrade/tests/base.py +++ b/plone/app/upgrade/tests/base.py @@ -16,6 +16,7 @@ import transaction import warnings +from plone.app.upgrade import IS_PRODUCT_RESOURCE_REGISTRIES_INSTALLED # # Base TestCase for upgrades @@ -67,16 +68,18 @@ def removeActionFromTool( tool._delOb(action_id) def addResourceToJSTool(self, resource_name): - # Registers a resource with the javascripts tool - tool = getToolByName(self.portal, 'portal_javascripts') - if resource_name not in tool.getResourceIds(): - tool.registerScript(resource_name) + if IS_PRODUCT_RESOURCE_REGISTRIES_INSTALLED: + # Registers a resource with the javascripts tool + tool = getToolByName(self.portal, 'portal_javascripts') + if resource_name not in tool.getResourceIds(): + tool.registerScript(resource_name) def addResourceToCSSTool(self, resource_name): - # Registers a resource with the css tool - tool = getToolByName(self.portal, 'portal_css') - if resource_name not in tool.getResourceIds(): - tool.registerStylesheet(resource_name) + if IS_PRODUCT_RESOURCE_REGISTRIES_INSTALLED: + # Registers a resource with the css tool + tool = getToolByName(self.portal, 'portal_css') + if resource_name not in tool.getResourceIds(): + tool.registerStylesheet(resource_name) def removeSiteProperty(self, property_id): # Removes a site property from portal_properties diff --git a/plone/app/upgrade/v40/alphas.py b/plone/app/upgrade/v40/alphas.py index c83880e3..9b07bf8b 100644 --- a/plone/app/upgrade/v40/alphas.py +++ b/plone/app/upgrade/v40/alphas.py @@ -16,7 +16,6 @@ from Products.CMFCore.Expression import Expression from Products.CMFCore.interfaces import ICachingPolicyManager from Products.CMFCore.utils import getToolByName -from Products.CMFPlone.setuphandlers import addCacheForResourceRegistry from Products.CMFPlone.setuphandlers import addCacheHandlers from Products.MailHost.interfaces import IMailHost from Products.MailHost.MailHost import MailHost @@ -352,7 +351,12 @@ def removeBrokenCacheFu(context): transaction.savepoint(optimistic=True) manage_addCachingPolicyManager(portal) addCacheHandlers(portal) - addCacheForResourceRegistry(portal) + try: + from Products.CMFPlone.setuphandlers import addCacheForResourceRegistry + addCacheForResourceRegistry(portal) + except: + # legacy resource registries replaced by new type + pass logger.info('Removed CacheSetup tools.') @@ -381,7 +385,8 @@ def cleanUpToolRegistry(context): required = toolset._required.copy() existing = portal.keys() changed = False - for name, info in required.items(): + items = list(required.items()) + for name, info in items: if name not in existing: del required[name] changed = True diff --git a/plone/app/upgrade/v42/final.py b/plone/app/upgrade/v42/final.py index d7648979..3a0a1d42 100644 --- a/plone/app/upgrade/v42/final.py +++ b/plone/app/upgrade/v42/final.py @@ -1,4 +1,5 @@ # -*- coding: utf-8 -*- +from plone.app.upgrade import IS_PRODUCT_RESOURCE_REGISTRIES_INSTALLED from plone.app.upgrade.utils import loadMigrationProfile from Products.CMFCore.utils import getToolByName @@ -34,7 +35,8 @@ def to421(context): def to422(context): """4.2.1 -> 4.2.2 """ - loadMigrationProfile(context, 'profile-plone.app.upgrade.v42:to422') + if IS_PRODUCT_RESOURCE_REGISTRIES_INSTALLED: + loadMigrationProfile(context, 'profile-plone.app.upgrade.v42:to422') def to423(context): diff --git a/plone/app/upgrade/v42/profiles/to_422/registry.xml b/plone/app/upgrade/v42/profiles/to_422/registry.xml index 8565170c..c61bf1a9 100644 --- a/plone/app/upgrade/v42/profiles/to_422/registry.xml +++ b/plone/app/upgrade/v42/profiles/to_422/registry.xml @@ -1,5 +1,7 @@ - + jquery diff --git a/plone/app/upgrade/v43/profiles/to_alpha2/registry.xml b/plone/app/upgrade/v43/profiles/to_alpha2/registry.xml index c69a06b5..551007f0 100644 --- a/plone/app/upgrade/v43/profiles/to_alpha2/registry.xml +++ b/plone/app/upgrade/v43/profiles/to_alpha2/registry.xml @@ -1,12 +1,4 @@ - - - - jquery - default - - - Body class path depth diff --git a/plone/app/upgrade/v43/tests.py b/plone/app/upgrade/v43/tests.py index 7f029fc1..83d8a121 100644 --- a/plone/app/upgrade/v43/tests.py +++ b/plone/app/upgrade/v43/tests.py @@ -1,6 +1,7 @@ # -*- coding: utf-8 -*- from plone.app.upgrade.tests.base import MigrationTest from plone.app.upgrade.utils import loadMigrationProfile +from plone.app.upgrade.utils import plone_version from Products.CMFCore.utils import getToolByName from Products.CMFPlone.interfaces import INonInstallable from Products.CMFPlone.utils import getFSVersionTuple @@ -174,7 +175,7 @@ def testAddDefaultPlonePasswordPolicy(self): # now it has been added... self.assertTrue('password_policy' in portal.acl_users.objectIds()) - +@unittest.skipIf(plone_version >= '5.2', 'Plone >=5.2') class TestFakeKupuMigration(MigrationTest): def afterSetUp(self): diff --git a/plone/app/upgrade/v50/profiles/to_alpha3/registry.xml b/plone/app/upgrade/v50/profiles/to_alpha3/registry.xml index 4f22b14c..c16c6ae8 100644 --- a/plone/app/upgrade/v50/profiles/to_alpha3/registry.xml +++ b/plone/app/upgrade/v50/profiles/to_alpha3/registry.xml @@ -14,14 +14,6 @@ prefix="plone" /> - - - - jquery - default - - - Enabled diff --git a/plone/app/upgrade/v50/testing.py b/plone/app/upgrade/v50/testing.py index bef21840..63b922da 100644 --- a/plone/app/upgrade/v50/testing.py +++ b/plone/app/upgrade/v50/testing.py @@ -2,6 +2,7 @@ from plone.app.testing import PLONE_FIXTURE from plone.app.testing import PloneSandboxLayer from plone.app.upgrade.utils import loadMigrationProfile +from plone.app.upgrade.utils import plone_version from plone.testing.z2 import FunctionalTesting from plone.testing.z2 import login from zope.component.hooks import setSite @@ -29,26 +30,23 @@ def setUpZope(self, app, configurationContext): def setUpPloneSite(self, portal): app = portal.aq_parent login(app['acl_users'], 'admin') - # import old ZEXP try: path = os.path.join(os.path.abspath( os.path.dirname(__file__)), 'data', 'test-full.zexp') app._importObjectFromFile(path, verify=0) - except BaseException: + except Exception: logger.exception('Failed to import ZEXP from old site.') else: # run upgrades self['portal'] = portal = app.test setSite(portal) - try: + if plone_version >= '5.2': # for 5.2 we need tools as utilities loadMigrationProfile( portal.portal_setup, 'profile-plone.app.upgrade.v52:to52alpha1', steps=['componentregistry']) - except KeyError: - pass portal.portal_migration.upgrade(swallow_errors=False) setSite(None) diff --git a/plone/app/upgrade/v50/tests.py b/plone/app/upgrade/v50/tests.py index 913929a8..9166ad89 100644 --- a/plone/app/upgrade/v50/tests.py +++ b/plone/app/upgrade/v50/tests.py @@ -13,7 +13,6 @@ import six import unittest - try: from Products.CMFPlone.factory import _IMREALLYPLONE5 _IMREALLYPLONE5 # pyflakes @@ -92,6 +91,9 @@ def test_migrate_members_default_layout(self): self.assertEqual(members.getLayout(), '@@member-search') +@unittest.skipIf( + not six.PY2 or not PLONE_5, + "not Plone 5.0, 5.1 or 5.2 / Python 2") class TestFunctionalMigrations(unittest.TestCase): """Run an upgrade from a real Plone 4.0 ZEXP dump. @@ -179,13 +181,12 @@ def test_fix_double_smaxage(self): def test_suite(): - # Skip these tests on Plone 4 from unittest import TestSuite, makeSuite + suite = TestSuite() + suite.addTest(makeSuite(PASUpgradeTest)) + suite.addTest(makeSuite(VariousTest)) if not six.PY2 or not PLONE_5: return TestSuite() else: - suite = TestSuite() - suite.addTest(makeSuite(PASUpgradeTest)) suite.addTest(makeSuite(TestFunctionalMigrations)) - suite.addTest(makeSuite(VariousTest)) - return suite + return suite diff --git a/plone/app/upgrade/v51/profiles/to_alpha1/registry.xml b/plone/app/upgrade/v51/profiles/to_alpha1/registry.xml index ba0e3e3e..5071ab04 100644 --- a/plone/app/upgrade/v51/profiles/to_alpha1/registry.xml +++ b/plone/app/upgrade/v51/profiles/to_alpha1/registry.xml @@ -2,7 +2,8 @@ + prefix="plone" + condition="installed Products.ResourceRegistries"> diff --git a/plone/app/upgrade/v52/alphas.py b/plone/app/upgrade/v52/alphas.py index 3b3938a0..a1cb8550 100644 --- a/plone/app/upgrade/v52/alphas.py +++ b/plone/app/upgrade/v52/alphas.py @@ -86,6 +86,7 @@ def fix_core_behaviors_in_ftis(context): def to52alpha1(context): loadMigrationProfile(context, 'profile-plone.app.upgrade.v52:to52alpha1') portal = getToolByName(context, 'portal_url').getPortalObject() + cleanUpSkinsTool(portal) cleanup_resources() diff --git a/plone/app/upgrade/v52/betas.py b/plone/app/upgrade/v52/betas.py index 10897d85..7604cba4 100644 --- a/plone/app/upgrade/v52/betas.py +++ b/plone/app/upgrade/v52/betas.py @@ -1,11 +1,11 @@ # -*- coding: utf-8 -*- from Products.CMFCore.utils import getToolByName from plone.app.upgrade.utils import loadMigrationProfile +from plone.app.upgrade.v40.alphas import cleanUpToolRegistry from zc.relation.interfaces import ICatalog from zope import component from zope.intid.interfaces import IntIdMissingError - import logging @@ -29,6 +29,24 @@ def add_exclude_from_nav_index(context): catalog.manage_reindexIndex(ids=indexables) +def remove_legacy_resource_registries(context): + """Remove portal_css and portal_javascripts.""" + portal_url = getToolByName(context, 'portal_url') + portal = portal_url.getPortalObject() + + tools_to_remove = [ + 'portal_css', + 'portal_javascripts', + ] + + # remove obsolete tools + tools = [t for t in tools_to_remove if t in portal] + if tools: + portal.manage_delObjects(tools) + + cleanUpToolRegistry(context) + + def remove_interface_indexes_from_relations_catalog(): """ remove unused interface indexes from relations catalog """ catalog = component.queryUtility(ICatalog) @@ -51,4 +69,5 @@ def remove_interface_indexes_from_relations_catalog(): def to52beta1(context): loadMigrationProfile(context, 'profile-plone.app.upgrade.v52:to52beta1') add_exclude_from_nav_index(context) + remove_legacy_resource_registries(context) remove_interface_indexes_from_relations_catalog() diff --git a/plone/app/upgrade/v52/profiles/to_beta1/registry.xml b/plone/app/upgrade/v52/profiles/to_beta1/registry.xml index 707e45e4..b898a9c6 100644 --- a/plone/app/upgrade/v52/profiles/to_beta1/registry.xml +++ b/plone/app/upgrade/v52/profiles/to_beta1/registry.xml @@ -47,4 +47,8 @@ 2018-10-01 23:00:00 + diff --git a/plone/app/upgrade/v52/tests.py b/plone/app/upgrade/v52/tests.py index 71ef2370..313bed46 100644 --- a/plone/app/upgrade/v52/tests.py +++ b/plone/app/upgrade/v52/tests.py @@ -1,20 +1,14 @@ # -*- coding: utf-8 -*- -import unittest +from plone.app.upgrade.utils import plone_version +from plone.testing.z2 import Browser -try: - from Products.CMFPlone.factory import _IMREALLYPLONE5 - _IMREALLYPLONE5 # pyflakes -except ImportError: - PLONE_5 = False -else: - PLONE_5 = True +import unittest def test_suite(): # Skip these tests on Plone 4 - if not PLONE_5: + if plone_version <= '5.0': return unittest.TestSuite() - suite = unittest.TestSuite() return suite