def convertToBlobs(context): """Convert files and images to blobs. We disable link integrity checks here, as the migration only removes objects to recreate them fresh, so in the end nothing is permanently removed. """ logger.info('Started migration of files to blobs.') from plone.app.blob.migrations import migrateATBlobFiles sprop = getToolByName(context, 'portal_properties').site_properties if sprop.hasProperty('enable_link_integrity_checks'): ori_enable_link_integrity_checks = sprop.getProperty('enable_link_integrity_checks') if ori_enable_link_integrity_checks: logger.info('Temporarily disabled link integrity checking') sprop.enable_link_integrity_checks = False else: ori_enable_link_integrity_checks = None output = migrateATBlobFiles(context) count = len(output.split('\n')) - 1 logger.info('Migrated %s files to blobs.' % count) logger.info('Started migration of images to blobs.') from plone.app.blob.migrations import migrateATBlobImages output = migrateATBlobImages(context) count = len(output.split('\n')) - 1 logger.info('Migrated %s images to blobs.' % count) if ori_enable_link_integrity_checks: logger.info('Restored original link integrity checking setting') sprop.enable_link_integrity_checks = ori_enable_link_integrity_checks
def testFileMigration(self): foo = self.folder[self.folder.invokeFactory('ATFile', id='foo', title='a file', file='plain text', subject=('foo', 'bar'), contributors=('me'))] # fake old content from before applying the replacement profile foo._setPortalTypeName('File') foo.reindexObject(idxs=('portal_type', )) # check to be migrated content self.assertTrue(isinstance(foo, ATFile), 'not a file?') self.assertEqual(foo.Title(), 'a file') self.assertEqual(foo.getContentType(), 'text/plain') self.assertEqual(foo.getPortalTypeName(), 'File') self.assertEqual(foo.Subject(), ('foo', 'bar')) self.assertEqual(foo.Contributors(), ('me', )) # migrate & check migrated content item self.assertEqual(migrateATBlobFiles(self.portal), 'Migrating /plone/Members/test_user_1_/foo (File -> File)\n') foo = self.folder['foo'] self.assertTrue(isinstance(foo, ATBlob), 'not a blob?') self.assertTrue(isinstance(foo.getField('file'), BlobField), 'no blob?') self.assertEqual(foo.Title(), 'a file') self.assertEqual(foo.getContentType(), 'text/plain') self.assertEqual(foo.getPortalTypeName(), 'File') self.assertEqual(foo.Subject(), ('foo', 'bar')) self.assertEqual(foo.Contributors(), ('me', )) blob = foo.getImage().getBlob().open('r') self.assertEqual(blob.read(), 'plain text')
def testFileMigration(self): foo = self.folder[self.folder.invokeFactory( 'ATFile', id='foo', title='a file', file='plain text', subject=('foo', 'bar'), contributors=('me', ), )] # fake old content from before applying the replacement profile foo._setPortalTypeName('File') foo.reindexObject(idxs=('portal_type', )) # check to be migrated content self.assertTrue(isinstance(foo, ATFile), 'not a file?') self.assertEqual(foo.Title(), 'a file') self.assertEqual(foo.getContentType(), 'text/plain') self.assertEqual(foo.getPortalTypeName(), 'File') self.assertEqual(foo.Subject(), ('foo', 'bar')) self.assertEqual(foo.Contributors(), ('me', )) # migrate & check migrated content item self.assertEqual( migrateATBlobFiles(self.portal), 'Migrating /plone/Members/test_user_1_/foo (File -> File)\n', ) foo = self.folder['foo'] self.assertTrue(isinstance(foo, ATBlob), 'not a blob?') self.assertTrue(isinstance(foo.getField('file'), BlobField), 'no blob?') self.assertEqual(foo.Title(), 'a file') self.assertEqual(foo.getContentType(), 'text/plain') self.assertEqual(foo.getPortalTypeName(), 'File') self.assertEqual(foo.Subject(), ('foo', 'bar')) self.assertEqual(foo.Contributors(), ('me', )) blob = foo.getImage().getBlob().open('r') self.assertEqual(blob.read(), 'plain text')
def convertToBlobs(context): """Convert files and images to blobs. We disable link integrity checks here, as the migration only removes objects to recreate them fresh, so in the end nothing is permanently removed. """ logger.info('Started migration of files to blobs.') from plone.app.blob.migrations import migrateATBlobFiles sprop = getToolByName(context, 'portal_properties').site_properties if sprop.hasProperty('enable_link_integrity_checks'): ori_enable_link_integrity_checks = sprop.getProperty( 'enable_link_integrity_checks') if ori_enable_link_integrity_checks: logger.info('Temporarily disabled link integrity checking') sprop.enable_link_integrity_checks = False else: ori_enable_link_integrity_checks = None output = migrateATBlobFiles(context) count = len(output.split('\n')) - 1 logger.info('Migrated %s files to blobs.' % count) logger.info('Started migration of images to blobs.') from plone.app.blob.migrations import migrateATBlobImages output = migrateATBlobImages(context) count = len(output.split('\n')) - 1 logger.info('Migrated %s images to blobs.' % count) if ori_enable_link_integrity_checks: logger.info('Restored original link integrity checking setting') sprop.enable_link_integrity_checks = ori_enable_link_integrity_checks
def testCatalogAfterFileMigration(self): foo = self.folder[self.folder.invokeFactory('ATFile', id='foo', title='a file', file='plain text', subject=('foo', 'bar'), contributors=('me'))] # fake old content from before applying the replacement profile foo._setPortalTypeName('File') foo.reindexObject(idxs=('portal_type',)) # remember the catalog data so it can be checked catalog = self.portal.portal_catalog rid = catalog(id='foo')[0].getRID() index_data = catalog.getIndexDataForRID(rid) meta_data = catalog.getMetadataForRID(rid) # migrate & check migrated content item self.assertEqual(migrateATBlobFiles(self.portal), 'Migrating /plone/Members/test_user_1_/foo (File -> File)\n') foo = self.folder['foo'] brain = catalog(id='foo')[0] self.assertEqual(foo.UID(), brain.UID) self.assertEqual(foo.getObjSize(), brain.getObjSize) self.assertEqual(foo.getPortalTypeName(), brain.Type) # compare pre-migration and current catalog data... okay = ('meta_type', 'Type', 'object_provides', 'SearchableText', 'Language') for key, value in catalog.getIndexDataForRID(brain.getRID()).items(): if not key in okay: self.assertEqual(index_data[key], value, 'index: %s' % key) okay = ('meta_type',) for key, value in catalog.getMetadataForRID(brain.getRID()).items(): if not key in okay: self.assertEqual(meta_data[key], value, 'meta: %s' % key) # also make sure the `Type` index has been updated correctly brains = catalog(Type='File') self.assertEqual([b.getObject() for b in brains], [foo])
def testCatalogAfterFileMigration(self): foo = self.folder[self.folder.invokeFactory('ATFile', id='foo', title='a file', file='plain text', subject=('foo', 'bar'), contributors=('me'))] # fake old content from before applying the replacement profile foo._setPortalTypeName('File') foo.reindexObject(idxs=('portal_type', )) # remember the catalog data so it can be checked catalog = self.portal.portal_catalog rid = catalog(id='foo')[0].getRID() index_data = catalog.getIndexDataForRID(rid) meta_data = catalog.getMetadataForRID(rid) # migrate & check migrated content item self.assertEqual(migrateATBlobFiles(self.portal), 'Migrating /plone/Members/test_user_1_/foo (File -> File)\n') foo = self.folder['foo'] brain = catalog(id='foo')[0] self.assertEqual(foo.UID(), brain.UID) self.assertEqual(foo.getObjSize(), brain.getObjSize) self.assertEqual(foo.getPortalTypeName(), brain.Type) # compare pre-migration and current catalog data... okay = ('meta_type', 'Type', 'object_provides', 'SearchableText', 'Language') for key, value in catalog.getIndexDataForRID(brain.getRID()).items(): if not key in okay: self.assertEqual(index_data[key], value, 'index: %s' % key) okay = ('meta_type', ) for key, value in catalog.getMetadataForRID(brain.getRID()).items(): if not key in okay: self.assertEqual(meta_data[key], value, 'meta: %s' % key) # also make sure the `Type` index has been updated correctly brains = catalog(Type='File') self.assertEqual([b.getObject() for b in brains], [foo])