diff --git a/bbcli/cli.py b/bbcli/cli.py index c643a919cf2924e4c0340ec02b452162886927e2..8c0ab51f0613f4d62bda99ae1da42e491257fc01 100644 --- a/bbcli/cli.py +++ b/bbcli/cli.py @@ -10,6 +10,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, update_content, upload_attachment, get_content +from bbcli.commands.assignments import get_assignments from bbcli.services.authorization_service import login load_dotenv() @@ -77,6 +78,17 @@ announcements.add_command(create_announcement) announcements.add_command(delete_announcement) announcements.add_command(update_announcement) + +@entry_point.group() +@click.pass_context +def assignments(ctx): + """ + Commands for creating, listing and submitting assignments. + """ + pass + +assignments.add_command(get_assignments) + """ CONTENT COMMANDS ENTRY POINT """ diff --git a/bbcli/commands/assignments.py b/bbcli/commands/assignments.py new file mode 100644 index 0000000000000000000000000000000000000000..d236f6d08180be95745fbcfdbbb5e9cb1210d86e --- /dev/null +++ b/bbcli/commands/assignments.py @@ -0,0 +1,13 @@ +from email.policy import default +import click + +from bbcli.services import assignment_service + +@click.command(name='get') +@click.argument('course_id', required=True) +@click.pass_context +def get_assignments(ctx, course_id): + """ + Get assignments + """ + assignment_service.get_assignments(ctx.obj['SESSION'], course_id) \ No newline at end of file diff --git a/bbcli/services/__init__.py b/bbcli/services/__init__.py index f30c4e42d3b55b2e31bb4a281935a9f0513de3f0..aa951f169f8041caf708990893dd0631718ad8fa 100644 --- a/bbcli/services/__init__.py +++ b/bbcli/services/__init__.py @@ -1,2 +1,2 @@ from .authorization_service import * -from bbcli.utils.URL_builder import URLBuilder \ No newline at end of file +from bbcli.utils.URL_builder import URL_builder \ No newline at end of file diff --git a/bbcli/services/announcements_service.py b/bbcli/services/announcements_service.py index 9e7533f14bc5538c1fb9e77061b3da7b9335399f..48a54a4727ad7ed1065bd2e6098b30af6ce7e08e 100644 --- a/bbcli/services/announcements_service.py +++ b/bbcli/services/announcements_service.py @@ -8,9 +8,9 @@ from bbcli.services.courses_service import list_courses from bbcli.utils.utils import input_body, set_cookies import click -from bbcli.utils.URL_builder import URLBuilder +from bbcli.utils.URL_builder import URL_builder -url_builder = URLBuilder() +url_builder = URL_builder() def list_announcements(session: requests.Session, user_name: str): courses = list_courses(session, user_name=user_name) diff --git a/bbcli/services/assignment_service.py b/bbcli/services/assignment_service.py new file mode 100644 index 0000000000000000000000000000000000000000..e4755c5d3d4b2031bd6dab98b84410c8aafa6425 --- /dev/null +++ b/bbcli/services/assignment_service.py @@ -0,0 +1,37 @@ +from datetime import timezone +import json +import click +import requests +import dateutil.parser + +from bbcli.utils.URL_builder import URL_builder + +url_builder = URL_builder() + + +def get_assignments(session: requests.Session, course_id): + url = url_builder.base_v1().add_courses().add_id( + course_id).add_gradebook().add_columns().create() + response = session.get(url) + response = json.loads(response.text) + results = response['results'] + print_assignments(results) + + +def print_assignments(assignments): + for i in range(len(assignments)): + name = assignments[i]['name'] + due = 'N/A' + if ('grading' in assignments[i]): + if ('due' in assignments[i]['grading']): + due = assignments[i]['grading']['due'] + due_datetime = utc_to_local(dateutil.parser.parse(due)) + date = str(due_datetime.date()) + time = str(due_datetime.time()) + due = f'{date} {time}' + + click.echo('{:<40s} due {:<10s}'.format(name, due)) + + +def utc_to_local(utc_dt): + return utc_dt.replace(tzinfo=timezone.utc).astimezone(tz=None) diff --git a/bbcli/services/contents_service.py b/bbcli/services/contents_service.py index eb7fd35d7e4adbe17aead253930eb934dc5e162c..ce0d20e511a711a4ffe77c8e326134aeeb37ab81 100644 --- a/bbcli/services/contents_service.py +++ b/bbcli/services/contents_service.py @@ -4,7 +4,7 @@ import os from typing import Dict, Any, List import requests import magic -from bbcli.utils.URL_builder import URLBuilder +from bbcli.utils.URL_builder import URL_builder 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 @@ -12,7 +12,7 @@ import click from bbcli.utils.utils import check_response -url_builder = URLBuilder() +url_builder = URL_builder() content_builder = ContentBuilder() # User gets a tree structure view of the courses content diff --git a/bbcli/services/courses_service.py b/bbcli/services/courses_service.py index c25cbdcb1a346faff24de366b48e2447d5fa9bfc..334e68be61424134e7c9eb1e517ae6b73983a326 100644 --- a/bbcli/services/courses_service.py +++ b/bbcli/services/courses_service.py @@ -3,9 +3,9 @@ from typing import Dict, Any, List import requests from datetime import date -from bbcli.utils.URL_builder import URLBuilder +from bbcli.utils.URL_builder import URL_builder -url_builder = URLBuilder() +url_builder = URL_builder() def list_courses(session: requests.Session, user_name: str) -> Any: diff --git a/bbcli/services/utils/content_builder.py b/bbcli/services/utils/content_builder.py index 80173d5f71fe243d7bb8e0fe81c985d7e2f51730..675d131a5d1ca28bfc95fb1130a60dc73d660377 100644 --- a/bbcli/services/utils/content_builder.py +++ b/bbcli/services/utils/content_builder.py @@ -99,6 +99,12 @@ class ContentBuilder(Builder): 'title': title }) return self + + def add_name(self, name: str) -> Builder: + self._product.add({ + 'name': name + }) + return self def add_body(self, body: str) -> Builder: self._product.add({ diff --git a/bbcli/utils/URL_builder.py b/bbcli/utils/URL_builder.py index 92d28a70c8306bfa6eb91f0dca6808460db70b44..e83af410eb305cc6a028a4f4cabfac14a6e2a3c0 100644 --- a/bbcli/utils/URL_builder.py +++ b/bbcli/utils/URL_builder.py @@ -75,8 +75,16 @@ class Builder(ABC): def add_download(self) -> Builder: pass + @abstractmethod + def add_gradebook(self) -> Builder: + pass + + @abstractmethod + def add_columns(self) -> Builder: + pass + -class URLBuilder(Builder): +class URL_builder(Builder): def __init__(self) -> None: self.reset() @@ -92,35 +100,35 @@ class URLBuilder(Builder): - def base_v1(self) -> URLBuilder: + def base_v1(self) -> URL_builder: self._product.add(f'{DOMAIN}{API_BASE}/v1') return self - def base_v2(self) -> URLBuilder: + def base_v2(self) -> URL_builder: self._product.add(f'{DOMAIN}{API_BASE}/v2') return self - def base_v3(self) -> URLBuilder: + def base_v3(self) -> URL_builder: self._product.add(f'{DOMAIN}{API_BASE}/v3') return self - def add_courses(self) -> URLBuilder: + def add_courses(self) -> URL_builder: self._product.add('/courses') return self - def add_users(self) -> URLBuilder: + def add_users(self) -> URL_builder: self._product.add('/users') return self - def add_announcements(self) -> URLBuilder: + def add_announcements(self) -> URL_builder: self._product.add('/announcements') return self - def add_contents(self) -> URLBuilder: + def add_contents(self) -> URL_builder: self._product.add('/contents') return self - def add_terms(self) -> URLBuilder: + def add_terms(self) -> URL_builder: self._product.add('/terms') return self @@ -144,13 +152,20 @@ class URLBuilder(Builder): self._product.add('/download') return self - def add_id(self, id:str, id_type:str=None) -> URLBuilder: + def add_id(self, id:str, id_type:str=None) -> URL_builder: if id_type: self._product.add(f'/{id_type}:{id}') else: self._product.add(f'/{id}') return self + def add_gradebook(self) -> Builder: + self._product.add('/gradebook') + return self + + def add_columns(self) -> Builder: + self._product.add('/columns') + return self def create(self) -> str: url = self._product.get_url() diff --git a/bbcli/utils/error_handler.py b/bbcli/utils/error_handler.py index 9c5d16cc536c55e26db0ba679904cd7edd2a192a..bfa48610b75af30030d8bf62cf7abdae9f06a9f1 100644 --- a/bbcli/utils/error_handler.py +++ b/bbcli/utils/error_handler.py @@ -13,4 +13,4 @@ def exception_handler(func): except KeyError as err: click.echo(f'KeyError: key {err} does not exist.') raise click.Abort() - return inner_function \ No newline at end of file + return inner_function