def handle(self, *args, **options): skip_ocr = options.get('skip_ocr') if options.get('location') is None: logger.error("Please add the path to your backup.tar") else: with open(options.get('location'), 'rb') as restore_file: if _can_restore(restore_file): if options.get('user') is None: username = input("Username:"******"Archive can be handled." "Please enter the user (username of) that should" " own the restored documents." ) if _is_valid_user(username): restore_documents( restore_file=restore_file, username=username, skip_ocr=skip_ocr ) else: logging.error("User %s was not valid", username) else: logging.error( "Archive cannot be restored because of" " version mismatch." )
def handle(self, *args, **options): username = options.get('user') user = None if username: try: user = User.objects.get(username=username) except User.DoesNotExist: logger.error( f"Username {username} not found." ) return if options.get('location') is None: logger.error("Please add the path to your backup.tar") else: with open(options.get('location'), 'rb') as restore_file: if _can_restore(restore_file): restore_documents( restore_file=restore_file, user=user, skip_ocr=True ) else: logging.error( "Archive cannot be restored because of" " version mismatch." )
def test_backup_single_document(self): document_path = os.path.join( BASE_DIR, "data", "berlin.pdf" ) doc = Document.create_document( user=self.testcase_user, title='berlin.pdf', size=os.path.getsize(document_path), lang='deu', file_name='berlin.pdf', parent_id=None, page_count=3 ) default_storage.copy_doc( src=document_path, dst=doc.path.url(), ) with io.BytesIO() as memoryfile: backup_documents(memoryfile, self.testcase_user) memoryfile.seek(0) self.assertTrue( _can_restore(memoryfile), 'generated backup.tar is not valid' ) memoryfile.seek(0) backup_file = tarfile.open(fileobj=memoryfile, mode='r') backup_json = backup_file.extractfile('backup.json') backup_info = json.loads(backup_json.read()) self.assertIsNotNone( backup_info.get('documents'), 'backup.json did not have a key "documents"' ) self.assertIs( len(backup_info.get('documents')), 1, 'backup.json key documents had more or less than one entry' ) self.assertIs( len(backup_file.getnames()), 2, 'backup.tar had more or less than 2 entries' ) self.assertTrue( 'berlin.pdf' in backup_file.getnames(), 'berlin.pdf was not in the backup.tar' )
def handle(self, *args, **options): if options.get('location') is None: logger.error("Please add the path to your backup.tar") else: with open(options.get('location'), 'rb') as restore_file: if _can_restore(restore_file): if options.get('user') is None: username = input("Username:"******"We can handle that archive. Please enter the user that should own the restored documents." ) if _is_valid_user(username): restore_documents(restore_file, username) else: logging.error("User %s was not valid", username) else: logging.error( "Looks like we can't understand your archive. Please make sure it is valid!" )
def test_backup_document_hierachy(self): folder_1 = Folder.objects.create(title='1', parent=None, user=self.testcase_user) folder_2 = Folder.objects.create(title='2', parent=folder_1, user=self.testcase_user) folder_3 = Folder.objects.create(title='3', parent=folder_1, user=self.testcase_user) Folder.objects.create(title='4', parent=None, user=self.testcase_user) document_path = os.path.join(BASE_DIR, "data", "berlin.pdf") doc_1 = Document.create_document(user=self.testcase_user, title='berlin.pdf', size=os.path.getsize(document_path), lang='deu', file_name='berlin.pdf', parent_id=folder_2.id, page_count=3) default_storage.copy_doc( src=document_path, dst=doc_1.path.url(), ) doc_2 = Document.create_document(user=self.testcase_user, title='berlin.pdf', size=os.path.getsize(document_path), lang='deu', file_name='berlin.pdf', parent_id=folder_3.id, page_count=3) default_storage.copy_doc( src=document_path, dst=doc_2.path.url(), ) with io.BytesIO() as memoryfile: backup_documents(memoryfile, self.testcase_user) memoryfile.seek(0) self.assertTrue(_can_restore(memoryfile), 'generated backup.tar is not valid') memoryfile.seek(0) backup_file = tarfile.open(fileobj=memoryfile, mode='r') backup_json = backup_file.extractfile('backup.json') backup_info = json.loads(backup_json.read()) self.assertIsNotNone(backup_info.get('documents'), 'backup.json did not have a key "documents"') self.assertIs( len(backup_info.get('documents')), 2, 'backup.json key documents had more or less than two entry') self.assertIs(len(backup_file.getnames()), 3, 'backup.tar had more or less than 2 entries') self.assertTrue( f"1/2/berlin.pdf__{doc_1.id}" in backup_file.getnames(), 'berlin.pdf was not in the backup.tar at folder 1/2/') self.assertTrue( f"1/3/berlin.pdf__{doc_2.id}" in backup_file.getnames(), 'berlin.pdf was not in the backup.tar at folder 1/3/') self.assertFalse( '4' in backup_file.getnames(), 'Folder 4 was in backup.tar but should have been ignored')