diff --git a/bbcli/commands/contents.py b/bbcli/commands/contents.py index f558e0bfc89460ea0e31c333d87b9c62136a88e3..2768d5ae1be9ad2635e4ba1e46c3771dee015555 100644 --- a/bbcli/commands/contents.py +++ b/bbcli/commands/contents.py @@ -93,10 +93,11 @@ def list_contents(ctx, course_id: str, folder_id: str, content_type, folders_onl @click.command(name='get', help='Get content') @click.option('-c', '--course', 'course_id', required=True, type=str, help='COURSE ID') @click.option('-co', '--content', 'node_id', required=True, type=str, help='CONTENT ID') +@click.option('-p', '--path', required=False, type=str, help='Path to be downloaded to') @click.pass_context @list_exception_handler -def get_content(ctx, course_id: str, node_id: str): - content_utils.check_content_handler(ctx, course_id, node_id) +def get_content(ctx, course_id: str, node_id: str, path: str): + content_utils.check_content_handler(ctx, course_id, node_id, path) @click.command(name='attachment', help='Add attachment to content\n\nOnly supports contents of type document and assignment') diff --git a/bbcli/services/contents_service.py b/bbcli/services/contents_service.py index b252889e53773bf241e90bc4d5ef318234fadbf6..131da08b31818d02f06e1c4bf318ea1203839e73 100644 --- a/bbcli/services/contents_service.py +++ b/bbcli/services/contents_service.py @@ -55,7 +55,7 @@ def get_attachments(session: requests.Session, course_id: str, node_id: str): response.raise_for_status() return response -def download_attachment(session: requests.Session, course_id: str, node_id: str, attachment) -> str: +def download_attachment(session: requests.Session, course_id: str, node_id: str, attachment, path) -> str: attachment_id = attachment['id'] fn = attachment['fileName'] url = url_builder.base_v1().add_courses().add_id( @@ -63,18 +63,24 @@ def download_attachment(session: requests.Session, course_id: str, node_id: str, ).add_id(attachment_id).add_download().create() response = session.get(url, allow_redirects=True) response.raise_for_status() - downloads_path = get_download_path(fn) - f = open(downloads_path, 'wb') - f.write(response.content) - f.close() - click.echo(f'\"{fn}\" was downloaded to the downloads folder.') + downloads_path = get_download_path(fn, path) + try: + f = open(downloads_path, 'wb') + f.write(response.content) + f.close() + except FileNotFoundError: + click.echo(f'\"{fn}\" could not be downloaded, please specify a valid path.') + return + path = path if path != None else 'Downloads' + click.echo(f'\"{fn}\" was downloaded to \"{path}\".') return downloads_path -def download_attachments(session: requests.Session, course_id: str, node_id: str, attachments): +def download_attachments(session: requests.Session, course_id: str, node_id: str, attachments, path): paths = [] for attachment in attachments: - path = download_attachment(session, course_id, node_id, attachment) - paths.append(path) + downloads_path = download_attachment(session, course_id, node_id, attachment, path) + if downloads_path != None: + paths.append(downloads_path) return paths def open_file(path): diff --git a/bbcli/utils/content_utils.py b/bbcli/utils/content_utils.py index db9cbb03447c3800fdac7c12d6f1724a22711a2e..88b8ac1ad3572ed7ef2cad0559997a624b455fff 100644 --- a/bbcli/utils/content_utils.py +++ b/bbcli/utils/content_utils.py @@ -106,7 +106,7 @@ def list_contents_thread( return root_node -def check_content_handler(ctx, course_id: str, node_id: str): +def check_content_handler(ctx, course_id: str, node_id: str, path: str): session = ctx.obj['SESSION'] response = contents_service.get_content( ctx.obj['SESSION'], course_id, node_id) @@ -125,7 +125,7 @@ def check_content_handler(ctx, course_id: str, node_id: str): click.confirm( "This is a document with an attachment(s), do you want to download it?", abort=True) - paths = contents_service.download_attachments(session, course_id, node_id, attachments) + paths = contents_service.download_attachments(session, course_id, node_id, attachments, path) [contents_service.open_file(path) for path in paths] else: click.echo('The document has no attachments.') @@ -158,7 +158,7 @@ def check_content_handler(ctx, course_id: str, node_id: str): "This is a file, do you want to download and open it?", abort=True) paths = contents_service.download_attachments( - session, course_id, node_id, attachments) + session, course_id, node_id, attachments, path) [contents_service.open_file(path) for path in paths] elif ch == content_handler['assignment']: click.echo('Opening assignment...') @@ -172,7 +172,7 @@ def check_content_handler(ctx, course_id: str, node_id: str): "The assignment contains attachment(s), do you want to download?", abort=True) paths = contents_service.download_attachments( - session, course_id, node_id, attachments) + session, course_id, node_id, attachments, path) [contents_service.open_file(path) for path in paths] elif ch == content_handler['blankpage']: click.echo('Opening blankpage...') diff --git a/bbcli/utils/utils.py b/bbcli/utils/utils.py index 071dabea6f80852769fcd4bf29269459a3759607..3c7171775089599f0ee9a446e3ba84d9fdcc6c0e 100644 --- a/bbcli/utils/utils.py +++ b/bbcli/utils/utils.py @@ -71,7 +71,7 @@ def format_date(date: str): click.echo('Value format is not valid, please see --help for more info.') raise click.Abort() -def get_download_path(file_name): +def get_download_path(file_name, path: str): """Returns the default downloads path for linux or windows""" if os.name == 'nt': import winreg @@ -79,9 +79,16 @@ def get_download_path(file_name): downloads_guid = '{374DE290-123F-4565-9164-39C4925E467B}' with winreg.OpenKey(winreg.HKEY_CURRENT_USER, sub_key) as key: location = winreg.QueryValueEx(key, downloads_guid)[0] - return f'{location}\{file_name}' + downloads_path = f'{location}\{file_name}' + if path == None: + return donwloads_path + else: + return downloads_path.replace('Downloads', path) else: - return os.path.join(os.path.expanduser('~'), f'Downloads/{file_name}') + if path == None: + return os.path.join(os.path.expanduser('~'), f'Downloads/{file_name}') + else: + return os.path.join(os.path.expanduser('~'), f'{path}/{file_name}') def authorization_handler(func):