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