def migrate(targets): collections = targets.pop('collections') assert len(targets), 'Must specify object to create new guid for' assert len( targets) == 1, 'Can only create new guid for one object at a time' old_id = targets.values()[0] node = Node.load(old_id) new_guid = Guid.generate(referent=node) logger.info('* Created new guid {} for node {}'.format( new_guid._id, old_id)) logger.info('* Preparing to set references.') fix_backrefs(node) node.reload() node._id = new_guid._id node.save() new_guid.referent = node new_guid.save() for collection, _id_list in collections.iteritems(): assert type( _id_list ) == list, 'Expected type list for collection {} ids, got {}'.format( collection, type(_id_list)) for _id in _id_list: logger.info('** Updating {} ({})'.format(_id, collection)) doc = clean_dict(database[collection].find_one({'_id': _id})) replacement = json.loads( re.sub(r'\b{}\b'.format(old_id), new_guid._id, json.dumps(doc))) database[collection].find_and_modify({'_id': _id}, {'$set': replacement}) logger.info('*** Updated {} ({}): \n{}\n'.format( _id, collection, replacement)) logger.info('Successfully migrate {} to {}'.format(old_id, new_guid._id))
def test_restore_file(self): root = models.StoredFileNode( path='root', name='rootfolder', is_file=False, node=self.node, provider='test', materialized_path='/long/path/to', ).wrapped() root.save() fn = models.StoredFileNode( parent=root._id, path='afile', name='name', is_file=True, node=self.node, provider='test', materialized_path='/long/path/to/name', ).wrapped() guid = Guid.generate(fn) before = fn.to_storage() trashed = fn.delete(user=self.user) restored = trashed.restore() assert_equal(restored.to_storage(), before) assert_equal(models.TrashedFileNode.load(trashed._id), None) # Guid is repointed guid.reload() assert_equal(guid.referent, restored)
def test_restore_file(self): root = models.StoredFileNode( path='root', name='rootfolder', is_file=False, node=self.node, provider='test', materialized_path='/long/path/to', ).wrapped() root.save() fn = models.StoredFileNode( parent=root._id, path='afile', name='name', is_file=True, node=self.node, provider='test', materialized_path='/long/path/to/name', ).wrapped() guid = Guid.generate(fn) before = fn.to_storage() trashed = fn.delete(user=self.user) restored = trashed.restore() assert_equal( restored.to_storage(), before ) assert_equal(models.TrashedFileNode.load(trashed._id), None) # Guid is repointed guid.reload() assert_equal(guid.referent, restored)