def testAddBeta2VersioningPermissionsToNewRoles(self): # This upgrade just uses GS to apply the role changes, # these permissions will not have been installed previously, # so this should be safe for p in ['CMFEditions: Apply version control', 'CMFEditions: Save new version', 'CMFEditions: Access previous versions', 'CMFEditions: Revert to previous versions', 'CMFEditions: Checkout to location']: self.portal.manage_permission(p, ['Manager', 'Owner'], True) # Test it twice for i in range(2): loadMigrationProfile(self.portal, 'profile-plone.app.upgrade.v30:3.0b1-3.0b2', steps=["rolemap"]) for p in ['CMFEditions: Apply version control', 'CMFEditions: Save new version', 'CMFEditions: Access previous versions']: self.assertTrue(p in [r['name'] for r in self.portal.permissionsOfRole('Contributor') if r['selected']]) self.assertTrue(p in [r['name'] for r in self.portal.permissionsOfRole('Editor') if r['selected']]) for p in ['CMFEditions: Revert to previous versions', 'CMFEditions: Checkout to location']: self.assertTrue(p in [r['name'] for r in self.portal.permissionsOfRole('Editor') if r['selected']])
def testInstallRedirectorUtility(self): sm = getSiteManager(self.portal) sm.unregisterUtility(provided=IRedirectionStorage) # Test it twice for i in range(2): loadMigrationProfile(self.portal, self.profile, ('componentregistry', )) self.assertFalse(sm.queryUtility(IRedirectionStorage) is None)
def apply_profile(context): ''' Atualiza perfil para versao 1002 ''' logger = logging.getLogger(PROJECTNAME) profile = 'profile-brasil.gov.barra.upgrades.v1002:default' loadMigrationProfile(context, profile) unregister_old_css(context) logger.info('Atualizado para versao 1002')
def beta3_beta4(context): """4.0beta3 -> 4.0beta4 """ loadMigrationProfile( context, 'profile-plone.app.upgrade.v40:4beta3-4beta4') # Prepare for blob support pt = getToolByName(context, 'portal_types') for portal_type in ('Image', 'File'): fti = pt.get(portal_type) if fti and not isinstance(fti, DexterityFTI): fti.content_meta_type = 'ATBlob' fti.product = 'plone.app.blob' fti.factory = 'addATBlob{}'.format(portal_type) pprop = getToolByName(context, 'portal_properties') site_properties = pprop.site_properties if site_properties.hasProperty('typesLinkToFolderContentsInFC'): value = site_properties.getProperty('typesLinkToFolderContentsInFC') if 'Large Plone Folder' in value: value = list(value) value.remove('Large Plone Folder') value = tuple(value) site_properties.typesLinkToFolderContentsInFC = value navtree_properties = pprop.navtree_properties if navtree_properties.hasProperty('parentMetaTypesNotToQuery'): value = navtree_properties.getProperty('parentMetaTypesNotToQuery') if 'Large Plone Folder' in value: value = list(value) value.remove('Large Plone Folder') value = tuple(value) navtree_properties.parentMetaTypesNotToQuery = value
def to502(context): """5.0.1 -> 5.0.2""" # When migrating from Plone 4.3 to 5.0 the profile-version of # plone.app.querystring is 13 at this point but the upgrade-step # upgrade_to_5 has not been run. Let's run it. loadMigrationProfile(context, 'profile-plone.app.querystring:upgrade_to_5')
def testAddedUseEmailProperty(self): tool = getToolByName(self.portal, 'portal_properties') sheet = getattr(tool, 'site_properties') #self.assertEqual(sheet.getProperty('use_email_as_login'), False) self.removeSiteProperty('use_email_as_login') loadMigrationProfile(self.portal, self.profile, ('propertiestool', )) self.assertEqual(sheet.getProperty('use_email_as_login'), False)
def to50alpha1(context): """4.3 -> 5.0alpha1""" loadMigrationProfile(context, 'profile-plone.app.upgrade.v50:to50alpha1') portal = getToolByName(context, 'portal_url').getPortalObject() # remove obsolete tools tools = [t for t in TOOLS_TO_REMOVE if t in portal] portal.manage_delObjects(tools) cleanUpToolRegistry(context) # migrate properties to portal_registry migrate_registry_settings(portal) # install plone.app.event qi = getToolByName(portal, 'portal_quickinstaller') if not qi.isProductInstalled('plone.app.event'): qi.installProduct('plone.app.event') # update the default view of the Members folder migrate_members_default_view(portal) # install the Barceloneta theme if portal.portal_skins.getDefaultSkin() == 'Sunburst Theme': if not qi.isProductInstalled('plonetheme.barceloneta'): qi.installProduct('plonetheme.barceloneta') upgrade_keyring(context)
def to41rc1(context): loadMigrationProfile(context, "profile-plone.app.upgrade.v41:to41rc1") optimize_indexes(context) # run this again to make sure we respect the blacklist, in an upgrade from # Plone < 4 we do the work earlier, so we don't have to iterate twice over # the object_provides index fix_cataloged_interface_names(context)
def apply_configurations(context): """Atualiza perfil para versao 4.""" logger = logging.getLogger(PROJECTNAME) profile = 'profile-interlegis.portalmodelo.policy.upgrades.v4:default' loadMigrationProfile(context, profile) logger.info('Atualizado para versao 4') site = api.portal.getSite() SITE_STRUCTURE = [ dict( type='Link', title=u'Caderno de Exercícios', description=u'Link para o arquivo PDF do Caderno de Exercícios do Portal Modelo 3, utilizado nas oficinas. (este link é apenas uma referência, está privado e pode ser removido)', remoteUrl='http://ftp.interlegis.leg.br/interlegis/produtos/portalmodelo/versao3.0/docs/Caderno%20de%20exercicios%20PORTAL%20MODELO%203%C2%AA%20edi%C3%A7%C3%A3o-%20Colab.pdf', _transition=None, ), ] SITE_STRUCTURE = _add_id(SITE_STRUCTURE) for item in SITE_STRUCTURE: id = item['id'] title = item['title'] description = item.get('description', u'') if id not in site: if 'creators' not in item: item['creators'] = CREATORS obj = api.content.create(site, **item) obj.setTitle(title) obj.setDescription(description) obj.reindexObject() logger.debug(u' {0} criado e publicado'.format(title)) else: logger.debug(u' pulando {0}; conteúdo existente'.format(title))
def to50rc1(context): """5.0beta4 -> 5.0rc1""" loadMigrationProfile(context, 'profile-plone.app.upgrade.v50:to50rc1') portal = getSite() # install plone.app.linkintegrity and its dependencies qi = getToolByName(portal, 'portal_quickinstaller') if not qi.isProductInstalled('plone.app.linkintegrity'): qi.installProduct('plone.app.linkintegrity') migrate_linkintegrity_relations(portal) upgrade_usergroups_controlpanel_settings(context) migrate_displayPublicationDateInByline(context) # Migrate settings from portal_properties to the configuration registry pprop = getToolByName(portal, 'portal_properties') site_properties = pprop['site_properties'] if site_properties.hasProperty('icon_visibility'): registry = getUtility(IRegistry) settings = registry.forInterface(ISiteSchema, prefix='plone') value = site_properties.getProperty('icon_visibility', 'false') settings.icon_visiblity = value # These have been migrated in previous upgrade steps. Safe to remove. properties_to_remove = ['allowAnonymousViewAbout', 'available_editors', 'default_contenttype', 'default_language', 'default_editor', 'disable_folder_sections', 'disable_nonfolderish_sections', 'enable_inline_editing', 'enable_link_integrity_checks', 'enable_livesearch', 'enable_sitemap', 'enable_wf_state_filtering', 'exposeDCMetaTags', 'ext_editor', 'forbidden_contenttypes', 'icon_visibility', 'lock_on_ttw_edit', 'many_groups', 'many_users', 'number_of_days_to_keep', 'search_collapse_options', 'search_enable_batch_size', 'search_enable_description_search', 'search_review_state_for_anon', 'search_enable_sort_on', 'search_enable_title_search', 'types_not_searched', 'use_email_as_login', 'use_folder_contents', 'use_uuid_as_userid', 'user_registration_fields', 'visible_ids', 'webstats_js'] for p in properties_to_remove: if site_properties.hasProperty(p): site_properties._delProperty(p)
def to43alpha1(context): """4.2 -> 4.3alpha1""" loadMigrationProfile(context, 'profile-plone.app.upgrade.v43:to43alpha1') reindex_sortable_title(context) upgradeTinyMCE(context) upgradePloneAppTheming(context) upgradePloneAppJQuery(context)
def to4100(context, logger=None): loadMigrationProfile(context, 'profile-Products.ILOIntranetTypes:to4100') catalog = getToolByName(context, 'portal_catalog') for brain in catalog({'portal_type': 'ILOEvent'}): obj = brain.getObject() obj.reindexObject(idxs=['to_remind']) return
def upgrade_to_v2(context): """Updates profile """ ppcas = 'plone.portlets.contextassignments' catalog = getToolByName(context, 'portal_catalog') count = 0 for brain in catalog(portal_type=['BlogEntry', 'BlogCategory', 'Blog']): obj = brain.getObject() annotations = IAnnotations(obj) if ppcas in annotations.keys(): if 'blog.portlets' in annotations[ppcas]: count += 1 if len(annotations[ppcas]) == 1: del annotations[ppcas] else: del annotations[ppcas]['blog.portlets'] logger.info("%s %s annotations removed" % (str(count), ppcas)) loadMigrationProfile(context, 'profile-ftw.blog.upgrades:to_v2') # remove blog_settings actions portal_actions = getToolByName(context, 'portal_actions') category = portal_actions.get('object_buttons', None) action_id = 'blog_settings' if category and action_id in category: del category[action_id]
def testAddSiteAdminToKeywordRoles(self): ptool = self.portal.portal_properties site_props = ptool.site_properties site_props.allowRolesToAddKeywords = ('Manager', 'Reviewer') loadMigrationProfile(self.portal, self.profile) roles = site_props.allowRolesToAddKeywords self.assertEqual(roles, ('Manager', 'Reviewer', 'Site Administrator'))
def threeX_alpha1(context): """3.x -> 4.0alpha1 """ loadMigrationProfile(context, 'profile-plone.app.upgrade.v40:3-4alpha1') loadMigrationProfile( context, 'profile-Products.CMFPlone:dependencies', steps=('controlpanel', 'jsregistry'))
def testRemovePloneCssFromRR(self): # Check to ensure that plone.css gets removed from portal_css self.css.registerStylesheet('plone.css', media='all') self.assertTrue('plone.css' in self.css.getResourceIds()) loadMigrationProfile(self.portal, self.profile, ('cssregistry', )) # plone.css removcal test self.assertFalse('plone.css' in self.css.getResourceIds())
def fullname_to_first_and_lastname(context): """Migrate subscriber fullname to separate fields.""" catalog = api.portal.get_tool("portal_catalog") subscribers = catalog(portal_type='ENLSubscriber') for subscriber in subscribers: obj = subscriber.getObject() name = '' try: name = HumanName(obj.fullname) except Exception: logger.info( 'No splitting necessary for {0}'.format(obj.getTitle())) if name: if not obj.getLastname(): obj.setLastname(name.last) if not obj.getFirstname(): obj.setFirstname(name.first) if not obj.getName_prefix(): obj.setName_prefix(name.title) obj.reindexObject() logger.info( 'Splitting fullname to first and lastname for {0}'.format( obj.getTitle() ) ) loadMigrationProfile( context, 'profile-Products.EasyNewsletter:default' )
def rc2_final(context): loadMigrationProfile(context, 'profile-plone.app.upgrade.v30:3.0rc2-3.0final') try: import plone.app.iterate except ImportError: pass else: loadMigrationProfile(context, 'profile-plone.app.upgrade.v30:3.0rc2-3.0final-iterate')
def upgrade_to_1001(context): """ reinstall """ # Reinstall loadMigrationProfile( context, 'profile-collective.markitup:default' )
def three1_beta1(portal): """3.1.7 -> 3.2beta1 """ actions = getToolByName(portal, 'portal_actions') if 'iterate_checkin' in actions.object_buttons.objectIds(): loadMigrationProfile( portal, 'profile-plone.app.upgrade.v32:3.2a1-3.2a2-iterate')
def testAddEmailCharsetProperty(self): if self.portal.hasProperty('email_charset'): self.portal.manage_delProperties(['email_charset']) # Test it twice for i in range(2): loadMigrationProfile(self.portal, self.profile, ('properties', )) self.assertTrue(self.portal.hasProperty('email_charset')) self.assertEqual(self.portal.getProperty('email_charset'), 'utf-8')
def apply_profile(context): ''' Atualiza perfil para versao 1013 ''' logger = logging.getLogger(PROJECTNAME) profile = 'profile-brasil.gov.barra.upgrades.v1013:default' loadMigrationProfile(context, profile) cook_css_resources(context) logger.info('CSS resources were cooked') logger.info('Atualizado para versao 1013')
def to42rc1(context): """4.2b2 -> 4.2rc1 """ try: import plone.app.jquerytools # noqa F401 loadMigrationProfile(context, 'profile-plone.app.jquery:default') except ImportError: pass loadMigrationProfile(context, 'profile-plone.app.upgrade.v42:to42rc1')
def migrate_from_pa_event(context): loadMigrationProfile(context, 'profile-osha.hwccontent:default') # Re-import types to get newest Event type context.runImportStepFromProfile( 'profile-osha.hwccontent:default', 'typeinfo', ) portal = context.getParentNode() migrate(portal, DXEventMigrator)
def final_two51(context): """2.5-final -> 2.5.1 """ loadMigrationProfile(context, 'profile-plone.app.upgrade.v25:2.5final-2.5.1') # Required for #5569 (is_folderish needs reindexing) and #5231 (all text # indices need to be reindexed so they are split properly) migtool = getToolByName(context, 'portal_migration') migtool._needRecatalog = True
def alpha2_beta1(context): """ 3.0-alpha2 -> 3.0-beta1 """ loadMigrationProfile(context, 'profile-plone.app.upgrade.v30:3.0a2-3.0b1') portal = getToolByName(context, 'portal_url').getPortalObject() # Install PloneLanguageTool installProduct('PloneLanguageTool', portal, hidden=True)
def testContentTypeIconExpressions(self): """ FTIs should now be using icon_expr instead of content_icon. (The former caches the expression object.) """ tt = getToolByName(self.portal, "portal_types") tt.Document.icon_expr = None loadMigrationProfile(self.portal, self.profile, ('typeinfo', )) self.assertEqual(tt.Document.icon_expr, "string:${portal_url}/document_icon.png")
def testAddSiteAdminToKeywordRoles(self): ptool = self.portal.portal_properties site_props = ptool.site_properties if not site_props.hasProperty('allowRolesToAddKeywords'): return site_props.allowRolesToAddKeywords = ('Manager', 'Reviewer') loadMigrationProfile(self.portal, self.profile) betas.to42beta1(self.portal.portal_setup) roles = site_props.allowRolesToAddKeywords self.assertEqual(roles, ('Manager', 'Reviewer', 'Site Administrator'))
def to52alpha1(context): loadMigrationProfile(context, 'profile-plone.app.upgrade.v52:to52alpha1') portal = getToolByName(context, 'portal_url').getPortalObject() cleanUpSkinsTool(portal) cleanup_resources() migrate_gopipindex(context) rebuild_memberdata(context) fix_core_behaviors_in_ftis(context)
def reinstall_gs_profile(context): loadMigrationProfile( context, 'profile-Products.EasyNewsletter:default' ) loadMigrationProfile( context, 'profile-Products.EasyNewsletter:install-base' ) logger.info("Products.EasyNewsletter generic setup profile re-installed")
def restoreTheme(context): skins = getToolByName(context, 'portal_skins') portal = getToolByName(context, 'portal_url').getPortalObject() old_default_skin = getattr(aq_base(skins), 'old_default_skin', None) if old_default_skin == 'Plone Default': v_storage = getUtility(IViewletSettingsStorage) uncustomized_layers = ( 'custom,tinymce,referencebrowser,LanguageTool,cmfeditions_views,' 'CMFEditions,kupu_plone,kupu,kupu_tests,archetypes,archetypes_kss,' 'mimetypes_icons,plone_kss,ATContentTypes,PasswordReset,' 'plone_ecmascript,plone_wysiwyg,plone_prefs,plone_templates,' 'classic_styles,plone_form_scripts,plone_scripts,plone_forms,' 'plone_images,plone_content,plone_login,plone_deprecated,' 'plone_3rdParty,cmf_legacy') if skins.selections.get('Plone Default') == uncustomized_layers: # if the old theme's layers hadn't been mucked with, we can just # use Plone Classic Theme old_default_skin = 'Plone Classic Theme' else: # otherwise, copy Plone Default to a new theme skins.selections[ 'Old Plone 3 Custom Theme'] = skins.selections.get( 'Plone Default') # copy the viewlet order v_storage._order['Old Plone 3 Custom Theme'] = dict( v_storage._order.get('Plone Default', {})) v_storage._hidden['Old Plone 3 Custom Theme'] = dict( v_storage._hidden.get('Plone Default', {})) old_default_skin = 'Old Plone 3 Custom Theme' # reset the Plone Default theme to the standard layers and viewlets skins.selections['Plone Default'] = '' v_storage._order['Plone Default'] = {} v_storage._hidden['Plone Default'] = {} loadMigrationProfile(context, 'profile-Products.CMFPlone:plone', steps=('skins', 'viewlets')) if old_default_skin is not None: setattr(aq_base(skins), 'default_skin', old_default_skin) request = aq_get(context, 'REQUEST', None) portal.changeSkin(old_default_skin, request) # The Sunburst theme is based on Plone Default. During the cleanUpSkinsTool # upgrade step we replace plone_styles with classic_styles in the default # theme. As a result Sunburst includes ``classic_styles`` at this point. theme = 'Sunburst Theme' paths = skins.selections.get(theme) if paths: new_paths = [] for path in paths.split(','): if path != 'classic_styles': new_paths.append(path) skins.selections[theme] = ','.join(new_paths)
def to501(context): """5.0 -> 5.0.1""" loadMigrationProfile(context, 'profile-plone.app.upgrade.v50:to501') def refresh_getIcon_catalog_metadata(context): """ get_icon redefined: now boolean: needs to update metadata true if item is type image or has image field (named 'image') e.g. leadimage see https://github.com/plone/Products.CMFPlone/issues/1226 """ # Attention, this relies heavily on catalog internals. # get the more visible zcatalog zcatalog = getToolByName(context, 'portal_catalog') # get the more hidden, inner (real) catalog implementation catalog = zcatalog._catalog try: # Get the getIcon index value and # check if there is a getIcon at all, this may not exist in some # customizations, who knows, but always exists in default Plone metadata_index = catalog.names.index('getIcon') except ValueError: logger.info('`getIcon` not in metadata, skip upgrade step') return cnt = 0 # search whole catalog results = zcatalog.unrestrictedSearchResults() num_objects = len(results) pghandler = ZLogHandler(1000) pghandler.init('Updating getIcon metadata', num_objects) for brain in results: pghandler.report(cnt) # First get the new value try: obj = brain._unrestrictedGetObject() except (AttributeError, KeyError, TypeError, NotFound): continue new_value = bool(getattr(aq_base(obj), 'image', False)) # We can now update the record with the new getIcon value record = list(catalog.data[brain.getRID()]) record[metadata_index] = new_value catalog.data[brain.getRID()] = tuple(record) cnt += 1 # we are curious # done pghandler.finish() logger.info('Reindexed `getIcon` for %s items' % str(cnt)) refresh_getIcon_catalog_metadata(context)
def to50alhpa3(context): """5.0alpha2 - > 5.0alpha3""" loadMigrationProfile(context, 'profile-plone.app.upgrade.v50:to50alpha3') portal = getToolByName(context, 'portal_url').getPortalObject() registry = portal.portal_registry # At alpha3 we have the registry entry so we can migrate here first_weekday = registry.get('plone.app.event.first_weekday', None) if first_weekday is not None: # Set it. Otherwise, let plone.app.event install routine set it. registry['plone.first_weekday'] = first_weekday
def setUp(self): """ Setup """ self.portal = self.layer['portal'] setRoles(self.portal, TEST_USER_ID, ['Manager']) self.portal.invokeFactory('testpage', 'test-page') setRoles(self.portal, TEST_USER_ID, ['Member']) self.page = self.portal['test-page'] self.page.edit(title="Test title", description="Test description") loadMigrationProfile(self.portal, 'profile-eea.rdfmarshaller:default')
def testGetObjPositionInParentIndex(self): from plone.app.folder.nogopip import GopipIndex catalog = self.portal.portal_catalog catalog.delIndex('getObjPositionInParent') catalog.addIndex('getObjPositionInParent', 'FieldIndex') self.assertFalse( isinstance(catalog.Indexes['getObjPositionInParent'], GopipIndex)) loadMigrationProfile(self.portal, self.profile) self.assertTrue('getObjPositionInParent' in catalog.indexes()) self.assertTrue( isinstance(catalog.Indexes['getObjPositionInParent'], GopipIndex))
def to42beta1(context): """4.2a2 -> 4.2b1 """ loadMigrationProfile(context, 'profile-plone.app.upgrade.v42:to42beta1') pprop = getToolByName(context, 'portal_properties') site_properties = pprop.site_properties if site_properties.hasProperty('allowRolesToAddKeywords'): value = site_properties.getProperty('allowRolesToAddKeywords') if 'Site Administrator' not in value: value = list(value) value.append('Site Administrator') site_properties.allowRolesToAddKeywords = tuple(value)
def testInstallNewDependencies(self): self.setRoles(['Manager']) # test for running the TinyMCE profile by checking for the skin layer # it installs (the profile is marked as noninstallable, so we can't # ask the quick installer) skins_tool = getToolByName(self.portal, 'portal_skins') del skins_tool['tinymce'] for i in range(2): loadMigrationProfile(self.portal, self.profile) self.failUnless('tinymce' in skins_tool) # sleep to avoid a GS log filename collision :-o time.sleep(1)
def prep_for_workgroups(context): ''' There is a new registry record called ploneintranet.userprofile.userprofile_hidden_info that makes the profile view configurable ''' loadMigrationProfile( context, 'profile-ploneintranet.userprofile.upgrades:to_0006', ) mt = api.portal.get_tool('membrane_tool') if 'ploneintranet.userprofile.workgroup' not in mt.membrane_types: mt.membrane_types.append('ploneintranet.userprofile.workgroup') mt._p_changed = 1
def testAddEventRegistrationJS(self): # Make sure event registration is added jsreg = self.portal.portal_javascripts # unregister first jsreg.unregisterResource('event-registration.js') script_ids = jsreg.getResourceIds() self.failIf('event-registration.js' in script_ids) loadMigrationProfile(self.portal, self.profile, ('jsregistry', )) # event registration test script_ids = jsreg.getResourceIds() self.failUnless('event-registration.js' in script_ids) after = jsreg.getResourcePosition('register_function.js') position = jsreg.getResourcePosition('event-registration.js') self.failUnless(position < after)
def tesFixObjDeleteAction(self): # Prepare delete actions test editActions = ('delete',) for a in editActions: self.removeActionFromTool(a, category='object_buttons') loadMigrationProfile(self.portal, self.profile, ('actions', )) # delete action tests actions = [x.id for x in self.actions.object_buttons.listActions() if x.id in editActions] # check that all of our deleted actions are now present for a in editActions: self.assertTrue(a in actions) # ensure that they are present only once self.assertEqual(len(editActions), len(actions))
def three0_alpha1(context): """2.5.x -> 3.0-alpha1 """ loadMigrationProfile(context, 'profile-plone.app.upgrade.v30:2.5.x-3.0a1') portal = getToolByName(context, 'portal_url').getPortalObject() # The ATCT tool has lost all type migration functionality and quite some # metadata and index information stored on it needs to be updated. if HAS_ATCT: upgradeATCTTool(portal) # Install CMFEditions and CMFDiffTool installProduct('CMFEditions', portal, hidden=True)
def uninstall_archetypes(context=None): portal_setup = api.portal.get_tool('portal_setup') loadMigrationProfile(portal_setup, 'profile-Products.ATContentTypes:uninstall') qi = api.portal.get_tool('portal_quickinstaller') addons = [ 'Archtypes', 'ATContentTypes', 'plone.app.referenceablebehavior', 'plone.app.blob', 'plone.app.imaging', ] for addon in addons: if qi.isProductInstalled(addon): qi.uninstallProducts([addon])
def to50beta3(context): """5.0beta2 -> 5.0beta3""" loadMigrationProfile(context, 'profile-plone.app.upgrade.v50:to50beta3') loadMigrationProfile(context, 'profile-plone.app.querystring:upgrade_to_8') portal = getSite() cp_tool = getToolByName(portal, 'portal_controlpanel') for configlet in cp_tool.listActions(): if configlet.id in cp_mapping: configlet.category = cp_mapping[configlet.id] configlets = cp_tool.listActions() configlet = [x for x in configlets if x.id == 'TypesSettings'][0] configlet.title = "Content Settings" configlet.setActionExpression( "string:${portal_url}/@@content-controlpanel")
def setUp(self): """ Setup """ self.portal = self.layer['portal'] setRoles(self.portal, TEST_USER_ID, ['Manager']) alsoProvides(self.portal, ILinkedDataHomepage) self.portal.invokeFactory('testpage', 'test-page') setRoles(self.portal, TEST_USER_ID, ['Member']) self.page = self.portal['test-page'] self.page.edit(title="Test title", description="Test description") # Cheat condition @@plone_context_state/is_view_template self.page.REQUEST['ACTUAL_URL'] = self.page.absolute_url() loadMigrationProfile(self.portal, 'profile-eea.rdfmarshaller:default')
def three0_beta1(portal): """3.0.6 -> 3.1-beta1 """ out = [] loadMigrationProfile(portal, 'profile-plone.app.upgrade.v31:3.0.6-3.1beta1') addBrowserLayer(portal, out) addCollectionAndStaticPortlets(portal, out) migratePortletTypeRegistrations(portal, out) removeDoubleGenericSetupSteps(portal, out) reinstallCMFPlacefulWorkflow(portal, out) replace_local_role_manager(portal) return out
def finalize(context=None): """This is run in Plone 5.2 on Python 3 """ portal_setup = api.portal.get_tool('portal_setup') # enable behaviors loadMigrationProfile( portal_setup, DEFAULT_PROFILE, steps=['typeinfo', 'catalog', 'plone.app.registry'], ) portal_setup.runAllImportStepsFromProfile( 'profile-plone.app.registry:default', purge_old=False) # set dropdown-navigation depth to 3 api.portal.set_registry_record('plone.navigation_depth', 3)
def apply_configurations(context): """Atualiza perfil para versao 5.""" logger = logging.getLogger(PROJECTNAME) profile = 'profile-interlegis.portalmodelo.policy.upgrades.v5:default' loadMigrationProfile(context, profile) logger.info('Atualizado para versao 5') q_i = api.portal.get_tool(name='portal_quickinstaller') for up in PRODUCTS: if q_i.isProductInstalled(up): q_i.uninstallProducts([up]) logger.info('Desinstalando produto de Social Like para evitar conflitos') if not q_i.isProductInstalled('sc.social.like'): q_i.installProduct('sc.social.like') logger.info('Instalado produto de Social Like.')
def to50beta2(context): """5.0beta1 -> 5.0beta2""" loadMigrationProfile(context, 'profile-plone.app.upgrade.v50:to50beta2') portal = getSite() registry = getUtility(IRegistry) settings = registry.forInterface(IImagingSchema, prefix="plone") try: iprops = portal.portal_properties.imaging_properties settings.allowed_sizes = [ s.decode('utf8') for s in iprops.getProperty('allowed_sizes') ] # noqa settings.quality = iprops.getProperty('quality') except AttributeError: # will only be there if from older plone instance pass
def testCoreContentIconExprCleared(self): types = getToolByName(self.portal, 'portal_types') catalog = getToolByName(self.portal, 'portal_catalog') # Reinstate the now-empty icon expression for the Document type doc_icon_expr = Expression('string:${portal_url}/document_icon.png') types['Document'].icon_expr_object = doc_icon_expr front = self.portal['front-page'] catalog.reindexObject(front) old_modified = front.modified() # Make sure the getIcon metadata column shows the "original" value brains = catalog(id='front-page') self.assertEqual(brains[0].getIcon, 'document_icon.png') # Run the migration loadMigrationProfile(self.portal, self.profile) updateIconMetadata(self.portal) # The getIcon column should now be empty self.assertEqual(catalog(id='front-page')[0].getIcon, '') self.assertEqual(front.modified(), old_modified)
def testReplaceReferencebrowser(self): self.setRoles(['Manager']) skins_tool = getToolByName(self.portal, 'portal_skins') sels = skins_tool._getSelections() for skinname, layer in sels.items(): layers = layer.split(',') self.failIf('ATReferenceBrowserWidget' in layers) layers.remove('referencebrowser') new_layers = ','.join(layers) sels[skinname] = new_layers loadMigrationProfile(self.portal, self.profile) setupReferencebrowser(self.portal) sels = skins_tool._getSelections() for skinname, layer in sels.items(): layers = layer.split(',') self.failUnless('referencebrowser' in layers)
def to50rc1(context): """5.0beta4 -> 5.0rc1""" loadMigrationProfile(context, 'profile-plone.app.upgrade.v50:to50rc1') portal = getSite() # install plone.app.linkintegrity and its dependencies qi = getToolByName(portal, 'portal_quickinstaller') if not qi.isProductInstalled('plone.app.linkintegrity'): qi.installProduct('plone.app.linkintegrity') migrate_linkintegrity_relations(portal) upgrade_usergroups_controlpanel_settings(context) migrate_displayPublicationDateInByline(context) # Migrate settings from portal_properties to the configuration registry pprop = getToolByName(portal, 'portal_properties') site_properties = pprop['site_properties'] if site_properties.hasProperty('icon_visibility'): registry = getUtility(IRegistry) settings = registry.forInterface(ISiteSchema, prefix='plone') value = site_properties.getProperty('icon_visibility', 'false') settings.icon_visiblity = value # These have been migrated in previous upgrade steps. Safe to remove. properties_to_remove = [ 'allowAnonymousViewAbout', 'available_editors', 'default_contenttype', 'default_language', 'default_editor', 'disable_folder_sections', 'disable_nonfolderish_sections', 'enable_inline_editing', 'enable_link_integrity_checks', 'enable_livesearch', 'enable_sitemap', 'enable_wf_state_filtering', 'exposeDCMetaTags', 'ext_editor', 'forbidden_contenttypes', 'icon_visibility', 'lock_on_ttw_edit', 'many_groups', 'many_users', 'number_of_days_to_keep', 'search_collapse_options', 'search_enable_batch_size', 'search_enable_description_search', 'search_review_state_for_anon', 'search_enable_sort_on', 'search_enable_title_search', 'types_not_searched', 'use_email_as_login', 'use_folder_contents', 'use_uuid_as_userid', 'user_registration_fields', 'visible_ids', 'webstats_js' ] for p in properties_to_remove: if site_properties.hasProperty(p): site_properties._delProperty(p)
def beta3_beta4(context): """4.0beta3 -> 4.0beta4 """ loadMigrationProfile(context, 'profile-plone.app.upgrade.v40:4beta3-4beta4') pprop = getToolByName(context, 'portal_properties') site_properties = pprop.site_properties if site_properties.hasProperty('typesLinkToFolderContentsInFC'): value = site_properties.getProperty('typesLinkToFolderContentsInFC') if 'Large Plone Folder' in value: value.remove('Large Plone Folder') site_properties.typesLinkToFolderContentsInFC = value navtree_properties = pprop.navtree_properties if navtree_properties.hasProperty('parentMetaTypesNotToQuery'): value = navtree_properties.getProperty('parentMetaTypesNotToQuery') if 'Large Plone Folder' in value: value.remove('Large Plone Folder') navtree_properties.parentMetaTypesNotToQuery = value
def move_pw_reset_tool(context): """ Move PasswordResetTool from its own product to CMFPlone """ pw_reset_tool = getToolByName(context, 'portal_password_reset') # Need to use getattr here. The _timedelta and _check_user are a class # attributes and not available in the instance dict until set # in case of defaults the do not exist in the <persistent broken ...> # object we fetch here. old_days_timeout = getattr(pw_reset_tool, '_timedelta', _marker) old_user_check = getattr(pw_reset_tool, '_user_check', _marker) portal = getToolByName(context, 'portal_url').getPortalObject() del portal['portal_password_reset'] loadMigrationProfile(context, 'profile-plone.app.upgrade.v51:to51beta1') pw_reset_tool = getToolByName(context, 'portal_password_reset') if old_days_timeout is not _marker: if old_days_timeout < 1: old_days_timeout = 7 pw_reset_tool._timedelta = int(old_days_timeout) if old_user_check is not _marker: pw_reset_tool._user_check = bool(old_user_check)
def to501(context): """5.0 -> 5.0.1""" loadMigrationProfile(context, 'profile-plone.app.upgrade.v50:to501') def reindex_getIcon(context): """ get_icon redefined: now boolean: true if dexterity item is image or has image field (named 'image') e.g. leadimage see https://github.com/plone/Products.CMFPlone/issues/1226 """ catalog = getToolByName(context, 'portal_catalog') search = catalog.unrestrictedSearchResults cnt = 0 iface = "plone.dexterity.interfaces.IDexterityContent" for brain in search(object_provides=iface): brain._unrestrictedGetObject().reindexObject(idxs=['getIcon']) cnt += 1 logger.info('Reindexed `getIcon` for %s dexterity items' % str(cnt)) reindex_getIcon(context)
def threeX_alpha1(context): """3.x -> 4.0alpha1 """ try: import plone.app.jquerytools loadMigrationProfile(context, 'profile-plone.app.jquerytools:default') except ImportError: pass loadMigrationProfile(context, 'profile-plone.app.upgrade.v40:3-4alpha1') loadMigrationProfile( context, 'profile-Products.CMFPlone:dependencies', steps=('controlpanel', 'jsregistry')) # Install plonetheme.classic profile # (if, installed, it will be removed in Plone 5) qi = getToolByName(context, 'portal_quickinstaller') stool = getToolByName(context, 'portal_setup') if 'plonetheme.classic' in qi: stool.runAllImportStepsFromProfile( 'profile-plonetheme.classic:default' ) # Install packages that are needed for Plone 4, # but don't break on Plone 5 where they are gone for profile in ('archetypes.referencebrowserwidget:default', 'plonetheme.sunburst:default', 'Products.TinyMCE:TinyMCE'): try: stool.runAllImportStepsFromProfile('profile-' + profile) except KeyError: pass
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 Exception: logger.exception('Failed to import ZEXP from old site.') else: # run upgrades self['portal'] = portal = app.test setSite(portal) 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']) portal.portal_migration.upgrade(swallow_errors=False) setSite(None)
def to50alpha1(context): """4.3 -> 5.0alpha1""" loadMigrationProfile(context, 'profile-plone.app.upgrade.v50:to50alpha1') portal = getToolByName(context, 'portal_url').getPortalObject() # remove obsolete tools tools = [t for t in TOOLS_TO_REMOVE if t in portal] if tools: portal.manage_delObjects(tools) cleanUpToolRegistry(context) # migrate properties to portal_registry migrate_registry_settings(portal) # install plone.app.event try: from Products.CMFPlone.utils import get_installer except ImportError: # BBB For Plone 5.0 and lower. qi = getToolByName(portal, 'portal_quickinstaller') else: qi = get_installer(portal) if not qi.isProductInstalled('plone.resource'): qi.installProduct('plone.resource') if not qi.isProductInstalled('plone.app.event'): qi.installProduct('plone.app.event') # update the default view of the Members folder migrate_members_default_view(portal) # install the Barceloneta theme if portal.portal_skins.getDefaultSkin() == 'Sunburst Theme': if not qi.isProductInstalled('plonetheme.barceloneta'): qi.installProduct('plonetheme.barceloneta') upgrade_keyring(context) installOrUpgradePloneAppTheming(context) installOrUpgradePloneAppCaching(context)
def to50rc2(context): """5.0rc1 -> 5.0rc2""" loadMigrationProfile(context, 'profile-plone.app.upgrade.v50:to50rc2') portal = getSite() site_properties_to_remove = [ 'email_from_address', 'email_from_name', 'enable_permalink' ] for p in site_properties_to_remove: if portal.hasProperty(p): portal._delProperty(p) # Migrate settings from portal_properties to the configuration registry pprop = getToolByName(portal, 'portal_properties') site_properties = pprop['site_properties'] registry = getUtility(IRegistry) if site_properties.hasProperty('search_results_description_length'): settings = registry.forInterface(ISearchSchema, prefix='plone') value = site_properties.getProperty( 'search_results_description_length', 160) settings.search_results_description_length = value properties_to_migrate = [ 'auth_cookie_length', 'verify_login_name', 'external_login_url', 'external_logout_url', 'external_login_iframe' ] for p in properties_to_migrate: if site_properties.hasProperty(p): value = site_properties.getProperty(p) registry['plone.%s' % p] = value site_properties._delProperty(p) if site_properties.hasProperty('allow_external_login_sites'): value = site_properties.get('allow_external_login_sites') if value is not None: registry['plone.allow_external_login_sites'] = tuple(value) site_properties._delProperty('allow_external_login_sites')