diff --git a/bbcli/cli.py b/bbcli/cli.py index 55407058cafd35cf1abd01a6793a2bded3b02971..f2173c6ec0022290121cd7183e1f1a6867e97dfd 100644 --- a/bbcli/cli.py +++ b/bbcli/cli.py @@ -9,7 +9,7 @@ import click from bbcli.commands.courses import list_courses from bbcli.commands.announcements import list_announcements, create_announcement, delete_announcement, update_announcement -from bbcli.commands.contents import create_assignment, create_courselink, create_folder, delete_content, list_contents, create_document, create_file, create_web_link, upload_attachment +from bbcli.commands.contents import create_assignment, create_courselink, create_folder, delete_content, list_contents, create_document, create_file, create_web_link, update_content, upload_attachment from bbcli.services.authorization_service import login load_dotenv() @@ -91,6 +91,7 @@ def contents(ctx): contents.add_command(list_contents) contents.add_command(delete_content) +contents.add_command(update_content) """ CONTENTS CREATE COMMANDS ENTRY POINT diff --git a/bbcli/commands/contents.py b/bbcli/commands/contents.py index 7e06d54c21e32bf6449bd9891b72edbe6db945f8..8e2d7ac5bfb735718f41a15340c32f668028af41 100644 --- a/bbcli/commands/contents.py +++ b/bbcli/commands/contents.py @@ -196,6 +196,18 @@ def delete_content(ctx, course_id: str, content_id: str, delete_grades: bool): response = contents_service.delete_content(ctx.obj['SESSION'], course_id, content_id, delete_grades) click.echo(response) +@click.command(name='update') +@click.argument('course_id', required=True, type=str) +@click.argument('content_id', required=True, type=str) +@click.pass_context +def update_content(ctx, course_id: str, content_id: str): + """ + Updates a given content + Editable content types: document, files, assignments, externallinks, courselinks + """ + response = contents_service.update_content(ctx.obj['SESSION'], course_id, content_id) + click.echo(response) + """ HELPER FUNCTIONS """ diff --git a/bbcli/services/contents_service.py b/bbcli/services/contents_service.py index 52ad18dada20c8935fb0467d293b06c5c0b959b0..e7f992d5f71c573e87e4df3155d94503aee1efaa 100644 --- a/bbcli/services/contents_service.py +++ b/bbcli/services/contents_service.py @@ -8,6 +8,7 @@ from bbcli.utils.URL_builder import URLBuilder from bbcli.services.utils.content_builder import ContentBuilder from bbcli.entities.content_builder_entitites import DateInterval, FileContent, GradingOptions, StandardOptions, FileOptions, WeblinkOptions from bbcli.utils.utils import input_body +import click url_builder = URLBuilder() content_builder = ContentBuilder() @@ -182,6 +183,27 @@ def delete_content(session: requests.Session, course_id: str, content_id: str, d return response.text +def update_content(session: requests.Session, course_id: str, content_id: str): + url = url_builder.base_v1().add_courses().add_id(course_id).add_contents().add_id(content_id).create() + content = session.get(url) + content = json.loads(content.text) + if not is_editable_content_type(content['contentHandler']['id']): + click.echo('This content type is not editable') + raise click.Abort() + if 'links' in content: + del content['links'] + if 'contentHandler' in content: + del content['contentHandler'] + + MARKER = '# Everything below is ignored.\n' + editable_data = json.dumps(content, indent=2) + print(editable_data) + new_data = click.edit(editable_data + '\n\n' + MARKER) + + response = session.patch(url, data=new_data) + return response.text + + """ HELPER FUNCTIONS @@ -216,4 +238,12 @@ def generate_create_content_url(course_id: str, content_id: str): def handle_attachments(session: requests.Session, course_id: str, content_id: str, attachments: tuple or None): if attachments: for attachment in attachments: - upload_attachment(session, course_id, content_id, attachment) \ No newline at end of file + upload_attachment(session, course_id, content_id, attachment) + + +def is_editable_content_type(content_type: str): + valid_content_types = ['resource/x-bb-assignment', 'resource/x-bb-externallink', 'resource/x-bb-courselink', 'resource/x-bb-file', 'resource/x-bb-document'] + for type in valid_content_types: + if content_type == type: + return True + return False \ No newline at end of file