def objects_to_be_migrated(self): """ Return the number of AT objects in the portal """ catalog = getToolByName(self.context, 'portal_catalog') query = {'meta_type': [i['old_meta_type'] for i in ATCT_LIST.values()]} brains = catalog(query) self._objects_to_be_migrated = len(brains) return self._objects_to_be_migrated
def objects_to_be_migrated(self): """ Return the number of AT objects in the portal """ catalog = getToolByName(self.context, "portal_catalog") query = {'meta_type': [i['old_meta_type'] for i in ATCT_LIST.values()]} if HAS_MULTILINGUAL and 'Language' in catalog.indexes(): query['Language'] = 'all' brains = catalog(query) self._objects_to_be_migrated = len(brains) return self._objects_to_be_migrated
def objects_to_be_migrated(self): """ Return the number of AT objects in the portal """ catalog = getToolByName(self.context, 'portal_catalog') query = {'meta_type': [i['old_meta_type'] for i in ATCT_LIST.values()]} if HAS_MULTILINGUAL and 'Language' in catalog.indexes(): query['Language'] = 'all' brains = catalog(query) self._objects_to_be_migrated = len(brains) return self._objects_to_be_migrated
def updateWidgets(self): """ Overload to set defaults and hide empty widgets. """ form.Form.updateWidgets(self) # 1. Select all items in the checkboxwidget ct_widget = self.widgets['content_types'] # Only override when rendering the form. When you unselect # everything the value will be [], not ()) if ct_widget.value == (): ct_widget.value = ATCT_LIST.keys() # Call update again since the list-items checked-states are # assigned in z3c.form.browser.checkbox.CheckBoxWidget.update # using the widget.value. ct_widget.update() # 2. Hide empty widget for title, widget in self.widgets.items(): if title not in ('content_types', 'extended_content'): continue if not len(widget.items): # the vocabulary is empty, we hide the widget widget.mode = HIDDEN_MODE
def __call__(self, migrate=False, content_types="all", migrate_schemaextended_content=False, migrate_references=True, from_form=False): portal = self.context 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() not_migrated = [] migrated_types = {} for (k, v) in ATCT_LIST.items(): if content_types != "all" and 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) if migrate_references: migration.restoreReferences(portal) # 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() 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, } return stats
def __call__( self, migrate=False, content_types='all', migrate_schemaextended_content=False, migrate_references=True, from_form=False, reindex_catalog=True, patch_searchabletext=False, ): portal = self.context 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() self.request['plone.app.contenttypes_migration_running'] = True msg = 'Starting Migration\n\n' msg += '\n-----------------------------\n' msg += 'Content statictics:\n' msg += pformat(stats_before) msg += '\n-----------------------------\n' msg += 'Types to be migrated:\n' msg += pformat(content_types) msg += '\n-----------------------------\n' logger.info(msg) # store references on the portal if migrate_references: store_references(portal) catalog = portal.portal_catalog # Patch various things that make migration harder (link_integrity, queue_indexing, patch_searchabletext) = patch_before_migration(patch_searchabletext) not_migrated = [] migrated_types = {} for (k, v) in ATCT_LIST.items(): if content_types != 'all' and 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'], } 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']) if reindex_catalog: catalog.clearFindAndRebuild() # restore references if migrate_references: restore_references(portal) # Revert to the original state undo_patch_after_migration(link_integrity, queue_indexing, patch_searchabletext) 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
def __call__(self, migrate=False, content_types='all', migrate_schemaextended_content=False, migrate_references=True, from_form=False, reindex_catalog=True, patch_searchabletext=False, ): portal = self.context 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() self.request['plone.app.contenttypes_migration_running'] = True msg = 'Starting Migration\n\n' msg += '\n-----------------------------\n' msg += 'Content statictics:\n' msg += pformat(stats_before) msg += '\n-----------------------------\n' msg += 'Types to be migrated:\n' msg += pformat(content_types) msg += '\n-----------------------------\n' logger.info(msg) # store references on the portal if migrate_references: store_references(portal) catalog = portal.portal_catalog # Patch various things that make migration harder (link_integrity, queue_indexing, patch_searchabletext) = patch_before_migration(patch_searchabletext) not_migrated = [] migrated_types = {} for (k, v) in ATCT_LIST.items(): if content_types != 'all' and 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'], } 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']) if reindex_catalog: catalog.clearFindAndRebuild() # restore references if migrate_references: restore_references(portal) # Revert to the original state undo_patch_after_migration( link_integrity, queue_indexing, patch_searchabletext) 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
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
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