def beforeChange_patchNotifyWorkflowCreatedMethod(self): def notifyWorkflowCreated(self): """ Do not notifyWorkflowCreated... """ pass patch(WorkflowAware, 'notifyWorkflowCreated', notifyWorkflowCreated)
def patchNotifyModified(self): """Patch notifyModified to prevent setModificationDate() on changes notifyModified lives in several places and is also used on folders when their content changes. So when we migrate Documents before Folders the folders ModifiedDate gets changed. """ for klass in PATCH_NOTIFY: patch(klass, 'notifyModified', pass_fn)
def __call__(self): catalog = getToolByName(self.portal, 'portal_catalog') self.patch_notify_modified() patch(UUIDIndex, 'insertForwardIndexEntry', patched_insertForwardIndexEntry) subsite_migrator(self.portal) catalog.clearFindAndRebuild() restore_language_references(self.portal)
def __call__(self): catalog = getToolByName(self.portal, 'portal_catalog') self.patch_notify_modified() patch( UUIDIndex, 'insertForwardIndexEntry', patched_insertForwardIndexEntry) subsite_migrator(self.portal) catalog.clearFindAndRebuild() restore_language_references(self.portal)
def patch_before_migration(patch_searchabletext=False): """Patch various things that make migration harder.""" # Switch linkintegrity off ptool = queryUtility(IPropertiesTool) site_props = getattr(ptool, 'site_properties', None) if site_props and site_props.hasProperty( 'enable_link_integrity_checks'): link_integrity = site_props.getProperty( 'enable_link_integrity_checks', False) site_props.manage_changeProperties( enable_link_integrity_checks=False) else: # Plone 5 registry = getUtility(IRegistry) editing_settings = registry.forInterface( IEditingSchema, prefix='plone') link_integrity = editing_settings.enable_link_integrity_checks editing_settings.enable_link_integrity_checks = False # Patch notifyModified to prevent setModificationDate() on changes # notifyModified lives in several places and is also used on folders # when their content changes. # So when we migrate Documents before Folders the folders # ModifiedDate gets changed PATCH_NOTIFY = [ DexterityContent, DefaultDublinCoreImpl, ExtensibleMetadata ] for klass in PATCH_NOTIFY: patch(klass, 'notifyModified', pass_fn) # Disable queueing of indexing/reindexing/unindexing queue_indexing = os.environ.get('CATALOG_OPTIMIZATION_DISABLED', None) os.environ['CATALOG_OPTIMIZATION_DISABLED'] = '1' # Patch UUIDIndex patch( UUIDIndex, 'insertForwardIndexEntry', patched_insertForwardIndexEntry) # Patch SearchableText index if patch_searchabletext: patch_indexing_at_blobs() patch_indexing_dx_blobs() return link_integrity, queue_indexing, patch_searchabletext
def patch_before_migration(patch_searchabletext=False): """Patch various things that make migration harder.""" # Switch linkintegrity off ptool = queryUtility(IPropertiesTool) site_props = getattr(ptool, 'site_properties', None) if site_props and site_props.hasProperty('enable_link_integrity_checks'): link_integrity = site_props.getProperty('enable_link_integrity_checks', False) site_props.manage_changeProperties(enable_link_integrity_checks=False) else: # Plone 5 registry = getUtility(IRegistry) editing_settings = registry.forInterface(IEditingSchema, prefix='plone') link_integrity = editing_settings.enable_link_integrity_checks editing_settings.enable_link_integrity_checks = False # Patch notifyModified to prevent setModificationDate() on changes # notifyModified lives in several places and is also used on folders # when their content changes. # So when we migrate Documents before Folders the folders # ModifiedDate gets changed PATCH_NOTIFY = [ DexterityContent, DefaultDublinCoreImpl, ExtensibleMetadata ] for klass in PATCH_NOTIFY: patch(klass, 'notifyModified', pass_fn) # Disable queueing of indexing/reindexing/unindexing queue_indexing = os.environ.get('CATALOG_OPTIMIZATION_DISABLED', None) os.environ['CATALOG_OPTIMIZATION_DISABLED'] = '1' # Patch UUIDIndex patch(UUIDIndex, 'insertForwardIndexEntry', patched_insertForwardIndexEntry) # Patch SearchableText index if patch_searchabletext: patch_indexing_at_blobs() patch_indexing_dx_blobs() return link_integrity, queue_indexing, patch_searchabletext
def patch_indexing_dx_blobs(): from Products.contentmigration.utils import patch from Products.ZCTextIndex.ZCTextIndex import ZCTextIndex # from plone.app.blob.content import ATBlob patch(ZCTextIndex, 'index_object', patched_index_object)
def patch_indexing_at_blobs(): from plone.app.blob.content import ATBlob from Products.contentmigration.utils import patch patch(ATBlob, 'getIndexValue', pass_fn)
def patch_indexing_dx_blobs(): from Products.ZCTextIndex.ZCTextIndex import ZCTextIndex patch(ZCTextIndex, 'index_object', patched_index_object)
def patch_indexing_at_blobs(): from plone.app.blob.content import ATBlob patch(ATBlob, 'getIndexValue', pass_fn)
def __call__(self, migrate=False, content_types="all", migrate_schemaextended_content=False, migrate_references=True, from_form=False): portal = self.context if content_types == 'all': content_types = DEFAULT_TYPES if not from_form and migrate not in ['1', 'True', 'true', 1]: url1 = '{0}/@@migrate_from_atct?migrate=1'.format( portal.absolute_url()) url2 = '{0}/@@atct_migrator'.format(portal.absolute_url()) msg = u'Warning \n' msg += u'-------\n' msg += u'You are accessing "@@migrate_from_atct" directly. ' msg += u'This will migrate all content to dexterity!\n\n' msg += u'Really migrate all content now: {0}\n\n'.format(url1) msg += u'First select what to migrate: {0}'.format(url2) return msg helpers = getMultiAdapter((portal, self.request), name="atct_migrator_helpers") if helpers.linguaplone_installed(): msg = 'Warning\n' msg += 'Migration aborted since Products.LinguaPlone is ' msg += 'installed. See ' msg += 'http://github.com/plone/plone.app.contenttypes#migration ' msg += 'for more information.' return msg stats_before = self.stats() starttime = datetime.now() catalog = portal.portal_catalog # switch linkintegrity temp off ptool = queryUtility(IPropertiesTool) site_props = getattr(ptool, 'site_properties', None) link_integrity = site_props.getProperty('enable_link_integrity_checks', False) site_props.manage_changeProperties(enable_link_integrity_checks=False) # switch of setModificationDate on changes self.patchNotifyModified() # patch UUIDIndex patch( UUIDIndex, 'insertForwardIndexEntry', patched_insertForwardIndexEntry) not_migrated = [] migrated_types = {} for (k, v) in ATCT_LIST.items(): if k not in content_types: not_migrated.append(k) continue # test if the ct is extended beyond blobimage and blobfile if len(isSchemaExtended(v['iface'])) > len(v['extended_fields']) \ and not migrate_schemaextended_content: not_migrated.append(k) continue query = { 'object_provides': v['iface'].__identifier__, 'meta_type': v['old_meta_type'], } if HAS_MULTILINGUAL and 'Language' in catalog.indexes(): query['Language'] = 'all' amount_to_be_migrated = len(catalog(query)) starttime_for_current = datetime.now() logger.info("Start migrating %s objects from %s to %s" % ( amount_to_be_migrated, v['old_meta_type'], v['type_name'])) installTypeIfNeeded(v['type_name']) # call the migrator v['migrator'](portal) # logging duration_current = datetime.now() - starttime_for_current duration_human = str(timedelta(seconds=duration_current.seconds)) logger.info("Finished migrating %s objects from %s to %s in %s" % ( amount_to_be_migrated, v['old_meta_type'], v['type_name'], duration_human)) # some data for the results-page migrated_types[k] = {} migrated_types[k]['amount_migrated'] = amount_to_be_migrated migrated_types[k]['old_meta_type'] = v['old_meta_type'] migrated_types[k]['type_name'] = v['type_name'] # if there are blobnewsitems we just migrate them silently. migration.migrate_blobnewsitems(portal) catalog.clearFindAndRebuild() # rebuild catalog, restore references and cleanup migration.restoreReferences(portal, migrate_references, content_types) # switch linkintegrity back to what it was before migrating site_props.manage_changeProperties( enable_link_integrity_checks=link_integrity ) # switch on setModificationDate on changes self.resetNotifyModified() # unpatch UUIDIndex undoPatch(UUIDIndex, 'insertForwardIndexEntry') duration = str(timedelta(seconds=(datetime.now() - starttime).seconds)) if not_migrated: msg = ("The following types were not migrated: \n %s" % "\n".join(not_migrated)) else: msg = "Migration successful\n\n" msg += '\n-----------------------------\n' msg += 'Migration finished in: %s' % duration msg += '\n-----------------------------\n' msg += 'Migration statictics:\n' msg += pformat(migrated_types) msg += '\n-----------------------------\n' msg += 'State before:\n' msg += pformat(stats_before) msg += '\n-----------------------------\n' msg += 'Stats after:\n' msg += pformat(self.stats()) msg += '\n-----------------------------\n' if not from_form: logger.info(msg) return msg else: stats = { 'duration': duration, 'before': stats_before, 'after': self.stats(), 'content_types': content_types, 'migrated_types': migrated_types, } logger.info(msg) return stats
def __call__(self, migrate=False, content_types='all', migrate_schemaextended_content=False, migrate_references=True, from_form=False): portal = self.context if content_types == 'all': content_types = DEFAULT_TYPES if not from_form and migrate not in ['1', 'True', 'true', 1]: url1 = '{0}/@@migrate_from_atct?migrate=1'.format( portal.absolute_url()) url2 = '{0}/@@atct_migrator'.format(portal.absolute_url()) msg = u'Warning \n' msg += u'-------\n' msg += u'You are accessing "@@migrate_from_atct" directly. ' msg += u'This will migrate all content to dexterity!\n\n' msg += u'Really migrate all content now: {0}\n\n'.format(url1) msg += u'First select what to migrate: {0}'.format(url2) return msg helpers = getMultiAdapter((portal, self.request), name='atct_migrator_helpers') if helpers.linguaplone_installed(): msg = 'Warning\n' msg += 'Migration aborted since Products.LinguaPlone is ' msg += 'installed. See ' msg += 'http://github.com/plone/plone.app.contenttypes#migration ' msg += 'for more information.' return msg stats_before = self.stats() starttime = datetime.now() # store references on the portal if migrate_references: store_references(portal) catalog = portal.portal_catalog # switch linkintegrity temp off ptool = queryUtility(IPropertiesTool) site_props = getattr(ptool, 'site_properties', None) link_integrity_in_props = False if site_props and site_props.hasProperty( 'enable_link_integrity_checks'): link_integrity_in_props = True link_integrity = site_props.getProperty( 'enable_link_integrity_checks', False) site_props.manage_changeProperties( enable_link_integrity_checks=False) else: # Plone 5 registry = getUtility(IRegistry) editing_settings = registry.forInterface(IEditingSchema, prefix='plone') link_integrity = editing_settings.enable_link_integrity_checks editing_settings.enable_link_integrity_checks = False # switch of setModificationDate on changes self.patchNotifyModified() # patch UUIDIndex patch(UUIDIndex, 'insertForwardIndexEntry', patched_insertForwardIndexEntry) not_migrated = [] migrated_types = {} for (k, v) in ATCT_LIST.items(): if k not in content_types: not_migrated.append(k) continue # test if the ct is extended beyond blobimage and blobfile if len(isSchemaExtended(v['iface'])) > len(v['extended_fields']) \ and not migrate_schemaextended_content: not_migrated.append(k) continue query = { 'object_provides': v['iface'].__identifier__, 'meta_type': v['old_meta_type'], } if HAS_MULTILINGUAL and 'Language' in catalog.indexes(): query['Language'] = 'all' amount_to_be_migrated = len(catalog(query)) starttime_for_current = datetime.now() logger.info('Start migrating {0} objects from {1} to {2}'.format( amount_to_be_migrated, v['old_meta_type'], v['type_name'], )) installTypeIfNeeded(v['type_name']) # call the migrator v['migrator'](portal) # logging duration_current = datetime.now() - starttime_for_current duration_human = str(timedelta(seconds=duration_current.seconds)) logger.info( 'Finished migrating {0} objects from {1} to {2} in {3}'.format( amount_to_be_migrated, v['old_meta_type'], v['type_name'], duration_human), ) # some data for the results-page migrated_types[k] = {} migrated_types[k]['amount_migrated'] = amount_to_be_migrated migrated_types[k]['old_meta_type'] = v['old_meta_type'] migrated_types[k]['type_name'] = v['type_name'] # if there are blobnewsitems we just migrate them silently. migration.migrate_blobnewsitems(portal) # make sure the view-methods on the plone site are updated use_new_view_names(portal, types_to_fix=['Plone Site']) catalog.clearFindAndRebuild() # restore references if migrate_references: restore_references(portal) # switch linkintegrity back to what it was before migrating if link_integrity_in_props: site_props.manage_changeProperties( enable_link_integrity_checks=link_integrity) else: editing_settings.enable_link_integrity_checks = link_integrity # switch on setModificationDate on changes self.resetNotifyModified() # unpatch UUIDIndex undoPatch(UUIDIndex, 'insertForwardIndexEntry') duration = str(timedelta(seconds=(datetime.now() - starttime).seconds)) if not_migrated: msg = ('The following types were not migrated: \n {0}'.format( '\n'.join(not_migrated))) else: msg = 'Migration successful\n\n' msg += '\n-----------------------------\n' msg += 'Migration finished in: {0}'.format(duration) msg += '\n-----------------------------\n' msg += 'Migration statictics:\n' msg += pformat(migrated_types) msg += '\n-----------------------------\n' msg += 'State before:\n' msg += pformat(stats_before) msg += '\n-----------------------------\n' msg += 'Stats after:\n' msg += pformat(self.stats()) msg += '\n-----------------------------\n' if not from_form: logger.info(msg) return msg else: stats = { 'duration': duration, 'before': stats_before, 'after': self.stats(), 'content_types': content_types, 'migrated_types': migrated_types, } logger.info(msg) return stats