def results(context, show_extended=False): """Helper method to create the vocabularies used below. Searches the catalog for AT-meta_types to get all Archetypes content. If show_extended is true the returned SimpleVocabulary will include types that are extended beyond what is expected. """ ext_dict = {} meta_types = [] for k, v in ATCT_LIST.items(): extendend_fields = isSchemaExtended(v['iface']) expected = v['extended_fields'] is_extended = len(extendend_fields) > len(expected) if is_extended and show_extended: meta_types.append(v['old_meta_type']) ext_dict[k] = {} if expected: extendend_fields.remove(expected[0]) ext_dict[k]['fields'] = extendend_fields elif not show_extended and not is_extended: meta_types.append(v['old_meta_type']) catalog = getToolByName(context, "portal_catalog") brains = catalog.search({'meta_type': meta_types}) counter = count(brains) return SimpleVocabulary(get_terms(context, counter, ext_dict, show_extended))
def results(context, show_extended=False): """Helper method to create the vocabularies used below. """ ext_dict = {} ifaces = [] for k, v in ATCT_LIST.items(): iface = v['iface'].__identifier__ extendend_fields = isSchemaExtended(v['iface']) expected = v['extended_fields'] is_extended = len(extendend_fields) > len(expected) if is_extended and show_extended: ifaces.append(iface) ext_dict[k] = {} if expected: extendend_fields.remove(expected[0]) ext_dict[k]['fields'] = extendend_fields elif not show_extended and not is_extended: ifaces.append(iface) catalog = getToolByName(context, "portal_catalog") brains = catalog.search({'object_provides': ifaces}) counter = count(brains) return SimpleVocabulary(get_terms(context, counter, ext_dict, show_extended))
def patch_ATCT_LIST(): for key, value in ATCT_LIST.items(): # Add 'richdescription' to all extended_fields fields ext = value.get('extended_fields', []) if 'richdescription' not in ext: # ... because patch_ATCT_LIST might be called more than once ext.append('richdescription')
def __call__(self, content_types="all", migrate_schemaextended_content=False, migrate_references=True, from_form=False): stats_before = self.stats() starttime = datetime.now() portal = self.context helpers = getMultiAdapter((portal, self.context), 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 # 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) not_migrated = [] 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 # call the migrator v['migrator'](portal) # if there are blobnewsitems we just migrate them silently. migration.migrate_blobnewsitems(portal) if migrate_references: migration.restoreReferences(portal) migration.restoreReferencesOrder(portal) # switch linkintegrity back to what it was before migrating site_props.manage_changeProperties( enable_link_integrity_checks=link_integrity ) endtime = datetime.now() duration = (endtime - starttime).seconds if not from_form: if not_migrated: msg = ("The following were not migrated as they " "have extended schemas (from " "archetypes.schemaextender): \n %s" % "\n".join(not_migrated)) else: msg = "Default content types successfully migrated\n\n" msg += 'Migration finished in %s seconds' % duration 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' return msg else: stats = { 'duration': duration, 'before': stats_before, 'after': self.stats() } return stats
def objects_to_be_migrated(self): """ Return the number of AT objects in the portal """ catalog = getToolByName(self.context, "portal_catalog") brains = catalog(portal_type=ATCT_LIST.keys()) self._objects_to_be_migrated = len(brains) return self._objects_to_be_migrated
def __call__(self, content_types="all", migrate_schemaextended_content=False, migrate_references=True, from_form=False): stats_before = self.stats() starttime = datetime.now() portal = self.context catalog = portal.portal_catalog 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 # 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 amount_to_be_migrated = len(catalog( object_provides=v['iface'].__identifier__, meta_type=v['old_meta_type']) ) 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
dst_meta_type = None # not used def migrate_folderishnewsitems(portal): return migrate(portal, FolderishNewsItemMigrator) ATCT_LIST.update({ "Folderish Document": { 'iface': IFolderishDocument, 'migrator': migrate_folderishdocuments, 'extended_fields': [], 'new_type_name': 'Document', 'old_meta_type': 'FolderishDocument', }, "Folderish Event": { 'iface': IFolderishEvent, 'migrator': migrate_folderishevents, 'extended_fields': [], 'new_type_name': 'Event', 'old_meta_type': 'FolderishEvent', }, "Folderish News Item": { 'iface': IFolderishNewsItem, 'migrator': migrate_folderishnewsitems, 'extended_fields': [], 'new_type_name': 'News Item', 'old_meta_type': 'FolderishNewsItem', }, })