From 0be62b35359d443f1dadbe4fbbf336b1b39bee6d Mon Sep 17 00:00:00 2001 From: magnus2142 <magnus.bredeli@hotmail.com> Date: Thu, 24 Mar 2022 16:50:57 +0100 Subject: [PATCH] Created announcement service and fixed some names on folders and folders --- bbcli/Services/AnnouncementService.py | 0 bbcli/Services/CourseAnnouncementService.py | 0 bbcli/Services/__init__.py | 1 - bbcli/__init__.py | 4 +- bbcli/cli.py | 12 ++- bbcli/{Entities => entities}/RequestData.py | 0 bbcli/{Entities => entities}/__init__.py | 0 .../{Services => services}/ContentService.py | 0 bbcli/services/__init__.py | 1 + bbcli/services/announcement_service.py | 81 +++++++++++++++++++ .../authorization_service.py} | 2 +- .../course_service.py} | 0 bbcli/{Utils => utils}/utils.py | 0 13 files changed, 95 insertions(+), 6 deletions(-) delete mode 100644 bbcli/Services/AnnouncementService.py delete mode 100644 bbcli/Services/CourseAnnouncementService.py delete mode 100644 bbcli/Services/__init__.py rename bbcli/{Entities => entities}/RequestData.py (100%) rename bbcli/{Entities => entities}/__init__.py (100%) rename bbcli/{Services => services}/ContentService.py (100%) create mode 100644 bbcli/services/__init__.py create mode 100644 bbcli/services/announcement_service.py rename bbcli/{Services/AuthorizationService.py => services/authorization_service.py} (99%) rename bbcli/{Services/CourseService.py => services/course_service.py} (100%) rename bbcli/{Utils => utils}/utils.py (100%) diff --git a/bbcli/Services/AnnouncementService.py b/bbcli/Services/AnnouncementService.py deleted file mode 100644 index e69de29..0000000 diff --git a/bbcli/Services/CourseAnnouncementService.py b/bbcli/Services/CourseAnnouncementService.py deleted file mode 100644 index e69de29..0000000 diff --git a/bbcli/Services/__init__.py b/bbcli/Services/__init__.py deleted file mode 100644 index 6cfb8d8..0000000 --- a/bbcli/Services/__init__.py +++ /dev/null @@ -1 +0,0 @@ -from .AuthorizationService import * \ No newline at end of file diff --git a/bbcli/__init__.py b/bbcli/__init__.py index 0b930ff..684db61 100644 --- a/bbcli/__init__.py +++ b/bbcli/__init__.py @@ -5,8 +5,8 @@ __app_name__ = "bbcli" __version__ = "0.1.0" # from .endpoints import * from .Node import * -from .Utils.utils import * -from .Services import login +from .utils.utils import * +from .services import login # from endpoints import get_user, get_course, get_assignments, get_course_contents ( diff --git a/bbcli/cli.py b/bbcli/cli.py index 38b80d5..5c95cc5 100644 --- a/bbcli/cli.py +++ b/bbcli/cli.py @@ -9,13 +9,21 @@ from dotenv import load_dotenv from bbcli import check_valid_date, check_response import click -from bbcli.Services import AuthorizationService +from bbcli.services import authorization_service +from bbcli.services import announcement_service @click.group() def entry_point(): authorize_user() pass +@click.command(name='announcements') +def get_announcements(): + response = announcement_service.update_announcement(cookies, headers, '_33050_1', '_385022_1') + click.echo(response) + + +entry_point.add_command(get_announcements) entry_point.add_command(get_user) entry_point.add_command(get_course_contents) entry_point.add_command(get_assignments) @@ -28,4 +36,4 @@ headers = {'X-Blackboard-XSRF': os.getenv('XSRF')} # @app.command(name='login', help='Authorize the user.') def authorize_user(): if check_valid_date(cookies) == False: - AuthorizationService.login() + authorization_service.login() diff --git a/bbcli/Entities/RequestData.py b/bbcli/entities/RequestData.py similarity index 100% rename from bbcli/Entities/RequestData.py rename to bbcli/entities/RequestData.py diff --git a/bbcli/Entities/__init__.py b/bbcli/entities/__init__.py similarity index 100% rename from bbcli/Entities/__init__.py rename to bbcli/entities/__init__.py diff --git a/bbcli/Services/ContentService.py b/bbcli/services/ContentService.py similarity index 100% rename from bbcli/Services/ContentService.py rename to bbcli/services/ContentService.py diff --git a/bbcli/services/__init__.py b/bbcli/services/__init__.py new file mode 100644 index 0000000..540e4cb --- /dev/null +++ b/bbcli/services/__init__.py @@ -0,0 +1 @@ +from .authorization_service import * \ No newline at end of file diff --git a/bbcli/services/announcement_service.py b/bbcli/services/announcement_service.py new file mode 100644 index 0000000..9017776 --- /dev/null +++ b/bbcli/services/announcement_service.py @@ -0,0 +1,81 @@ +import json +from subprocess import call +from typing import Dict, Any +import requests +from bbcli.services.course_service import list_courses +import click + +def list_announcements(cookies: Dict, user_name: str): + courses = list_courses(cookies=cookies, user_name=user_name) + + session = requests.Session() + announcements = [] + + for course in courses: + course_announcements = session.get('https://ntnu.blackboard.com/learn/api/public/v1/courses/{}/announcements'.format(course['id']), cookies=cookies) + course_announcements = json.loads(course_announcements.text) + + # Adds the course name to each course announcement list to make it easier to display which course the announcement comes from + if 'results' in course_announcements: + announcements.append({ + 'course_name': course['name'], + 'course_announcements': course_announcements['results'] + }) + + return announcements + +def list_course_announcements(cookies: Dict, course_id: str): + course_announcements = requests.get('https://ntnu.blackboard.com/learn/api/public/v1/courses/{}/announcements'.format(course_id), cookies=cookies) + course_announcements = json.loads(course_announcements.text)['results'] + return course_announcements + +def list_announcement(cookies: Dict, course_id: str, announcement_id: str): + announcement = requests.get('https://ntnu.blackboard.com/learn/api/public/v1/courses/{}/announcements/{}'.format(course_id, announcement_id), cookies=cookies) + announcement = json.loads(announcement.text) + return announcement + +# TODO: Add compatibility for flags and options to make a more detailed announcement +def create_announcement(cookies: Dict, headers: Dict, course_id: str, title: str): + + MARKER = '# Everything below is ignored\n' + body = click.edit('\n\n' + MARKER) + if body is not None: + body = body.split(MARKER, 1)[0].rstrip('\n') + + data = { + 'title': title, + 'body': body + } + + data = json.dumps(data) + headers['Content-Type'] = 'application/json' + + response = requests.post('https://ntnu.blackboard.com/learn/api/public/v1/courses/{}/announcements'.format(course_id), cookies=cookies, headers=headers, data=data) + + return response.text + +def delete_announcement(cookies: Dict, headers: Dict, course_id: str, announcement_id: str): + response = requests.delete('https://ntnu.blackboard.com/learn/api/public/v1/courses/{}/announcements/{}'.format(course_id, announcement_id), cookies=cookies, headers=headers) + if response.text == '': + return 'Sucessfully deleted announcement!' + else: + return response.text + +def update_announcement(cookies: Dict, headers: Dict, course_id: str, announcement_id: str): + + announcement = list_announcement(cookies=cookies, course_id=course_id, announcement_id=announcement_id) + MARKER = '# Everything below is ignored\n' + editable_data = { + 'title': announcement['title'], + 'body': announcement['body'], + 'created': announcement['created'], + 'availability': announcement['availability'], + 'draft': announcement['draft'] + } + announcement = json.dumps(editable_data, indent=2) + new_data = click.edit(announcement + '\n\n' + MARKER) + + headers['Content-Type'] = 'application/json' + response = requests.patch('https://ntnu.blackboard.com/learn/api/public/v1/courses/{}/announcements/{}'.format(course_id, announcement_id), cookies=cookies, headers=headers, data=new_data) + + return response.text \ No newline at end of file diff --git a/bbcli/Services/AuthorizationService.py b/bbcli/services/authorization_service.py similarity index 99% rename from bbcli/Services/AuthorizationService.py rename to bbcli/services/authorization_service.py index ce5d8b4..71e5de6 100644 --- a/bbcli/Services/AuthorizationService.py +++ b/bbcli/services/authorization_service.py @@ -1,7 +1,7 @@ from urllib import request import os from dotenv import load_dotenv -from bbcli.Entities.RequestData import RequestData +from bbcli.entities.RequestData import RequestData import requests import json from bs4 import BeautifulSoup diff --git a/bbcli/Services/CourseService.py b/bbcli/services/course_service.py similarity index 100% rename from bbcli/Services/CourseService.py rename to bbcli/services/course_service.py diff --git a/bbcli/Utils/utils.py b/bbcli/utils/utils.py similarity index 100% rename from bbcli/Utils/utils.py rename to bbcli/utils/utils.py -- GitLab