From 8aa1df9c7d096ab3077e4a2acd8720b8c33e6aa3 Mon Sep 17 00:00:00 2001
From: magnus2142 <magnus.bredeli@hotmail.com>
Date: Mon, 28 Mar 2022 15:36:25 +0200
Subject: [PATCH] Refactored the code to just take in the session from the
 controller, so we don't have to handle cookies and headers in every service
 method

---
 bbcli/services/announcement_service.py  | 41 +++++++-------
 bbcli/services/authorization_service.py |  5 +-
 bbcli/services/course_service.py        | 73 +++++++++++++++++--------
 3 files changed, 74 insertions(+), 45 deletions(-)

diff --git a/bbcli/services/announcement_service.py b/bbcli/services/announcement_service.py
index 9fc3888..2de1420 100644
--- a/bbcli/services/announcement_service.py
+++ b/bbcli/services/announcement_service.py
@@ -3,21 +3,20 @@ from subprocess import call
 from typing import Dict, Any
 import requests
 from bbcli.services.course_service import list_courses
+from bbcli.utils.utils import set_cookies
 import click
 
 from bbcli.utils.URL_builder import URLBuilder
 
 url_builder = URLBuilder()
 
-def list_announcements(cookies: Dict, user_name: str):
-    courses = list_courses(cookies=cookies, user_name=user_name)
-
-    session = requests.Session()
+def list_announcements(session: requests.Session, user_name: str):
+    courses = list_courses(session, user_name=user_name)
     announcements = []
 
     for course in courses:
         url = url_builder.base_v1().add_courses().add_id(course['id']).add_announcements().create()
-        course_announcements = session.get(url, cookies=cookies)
+        course_announcements = session.get(url)
         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
@@ -29,21 +28,21 @@ def list_announcements(cookies: Dict, user_name: str):
     
     return announcements
 
-def list_course_announcements(cookies: Dict, course_id: str):
+def list_course_announcements(session: requests.Session, course_id: str):
     url = url_builder.base_v1().add_courses().add_id(course_id).add_announcements().create()
-    course_announcements = requests.get(url, cookies=cookies)
+    course_announcements = session.get(url)
+    course_announcements.raise_for_status()
     course_announcements = json.loads(course_announcements.text)['results']
     return course_announcements
 
-def list_announcement(cookies: Dict, course_id: str, announcement_id: str):
+def list_announcement(session: requests.Session, course_id: str, announcement_id: str):
     url = url_builder.base_v1().add_courses().add_id(course_id).add_announcements().add_id(announcement_id).create()
-    announcement = requests.get(url, cookies=cookies)
+    announcement = session.get(url)
     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):
-    
+def create_announcement(session: requests.Session, course_id: str, title: str):
     MARKER = '# Everything below is ignored\n'
     body = click.edit('\n\n' + MARKER)
     if body is not None:
@@ -55,24 +54,24 @@ def create_announcement(cookies: Dict, headers: Dict, course_id: str, title: str
     }
 
     data = json.dumps(data)
-    headers['Content-Type'] = 'application/json'
-    
+    session.headers.update({'Content-Type': 'application/json'})
+
     url = url_builder.base_v1().add_courses().add_id(course_id).add_announcements().create()
-    response = requests.post(url, cookies=cookies, headers=headers, data=data)
+    response = session.post(url, data=data)
 
     return response.text
 
-def delete_announcement(cookies: Dict, headers: Dict, course_id: str, announcement_id: str):
+def delete_announcement(session: requests.Session, course_id: str, announcement_id: str):
     url = url_builder.base_v1().add_courses().add_id(course_id).add_announcements().add_id(announcement_id).create()
-    response = requests.delete(url, cookies=cookies, headers=headers)
+    response = session.delete(url)
     if response.text == '':
         return 'Sucessfully deleted announcement!'
     else:
         return response.text
 
-def update_announcement(cookies: Dict, headers: Dict, course_id: str, announcement_id: str):
+def update_announcement(session: requests.Session, course_id: str, announcement_id: str):
 
-    announcement = list_announcement(cookies=cookies, course_id=course_id, announcement_id=announcement_id)
+    announcement = list_announcement(session=session, course_id=course_id, announcement_id=announcement_id)
     MARKER = '# Everything below is ignored\n'
     editable_data = {
         'title': announcement['title'],
@@ -84,9 +83,9 @@ def update_announcement(cookies: Dict, headers: Dict, course_id: str, announceme
     announcement = json.dumps(editable_data, indent=2)
     new_data = click.edit(announcement + '\n\n' + MARKER)
 
-    headers['Content-Type'] = 'application/json'
+    session.headers.update({'Content-Type': 'application/json'})
+
     url = url_builder.base_v1().add_courses().add_id(course_id).add_announcements().add_id(announcement_id).create()
-    response = requests.patch(url, cookies=cookies, headers=headers, data=new_data)
-    response.raise_for_status()
+    response = session.patch(url, data=new_data)
 
     return response.text
\ No newline at end of file
diff --git a/bbcli/services/authorization_service.py b/bbcli/services/authorization_service.py
index 71e5de6..3fe136b 100644
--- a/bbcli/services/authorization_service.py
+++ b/bbcli/services/authorization_service.py
@@ -292,8 +292,9 @@ def write_to_env_data(session):
     xsrf_value = xsrf[1]
 
     f = open('.env', 'w')
-    f.write("BB_ROUTER=" + BB_ROUTER + "\n")
-    f.write("XSRF=" + xsrf_value + "\n")
+    f.write(f'BB_ROUTER={BB_ROUTER}\n')
+    f.write(f'XSRF={xsrf_value}\n')
+    f.write(f'BB_USERNAME={login_username}\n')
     f.close()
 
 
diff --git a/bbcli/services/course_service.py b/bbcli/services/course_service.py
index 5ff10ef..c69fae7 100644
--- a/bbcli/services/course_service.py
+++ b/bbcli/services/course_service.py
@@ -1,5 +1,5 @@
 import json
-from typing import Dict, Any
+from typing import Dict, Any, List
 import requests
 from datetime import date
 
@@ -7,36 +7,23 @@ from bbcli.utils.URL_builder import URLBuilder
 
 url_builder = URLBuilder()
 
-def take_start_date(elem):
-    return date.fromisoformat(elem['availability']['duration']['start'].split('T')[0])
-
 
-def list_courses(cookies: Dict, user_name: str) -> Any:
-    session = requests.Session()
+def list_courses(session: requests.Session, user_name: str) -> Any:
 
-    url = url_builder.base_v1().add_terms().create()
-    terms = session.get(url, cookies=cookies)
-    terms = json.loads(terms.text)['results']
-    
-    # Sort terms by start date to get the two most recent semesters to determine which courses to show
-    for term in terms:
-        if term['availability']['duration']['type'] != 'DateRange':
-            terms.remove(term)
-    terms.sort(key=take_start_date)
+    terms = get_terms(session)    
+    sort_terms(terms)
 
     term_1 = terms[len(terms) - 1]
     term_2 = terms[len(terms) - 2]
 
-    url = url_builder.base_v1().add_users().add_id(id=user_name, id_type='userName').add_courses().create()
-    course_memberships = session.get(url, cookies=cookies)
-    course_memberships = json.loads(course_memberships.text)['results']
+    course_memberships = get_course_memberships(session, user_name)
 
     course_list = []
 
     # Get courses from the correct terms
     for course in course_memberships:
         url = url_builder.base_v3().add_courses().add_id(course['courseId']).create()
-        response = session.get(url, cookies=cookies, params={'fields': 'id, name, termId'})
+        response = session.get(url, params={'fields': 'id, name, termId'})
         response = json.loads(response.text)
         if response['termId'] == term_1['id'] or response['termId'] == term_2['id']:
             course_list.append({
@@ -48,11 +35,53 @@ def list_courses(cookies: Dict, user_name: str) -> Any:
 
     return course_list
 
-def list_course(cookies: Dict, course_id:str) -> Any:
+def list_all_courses(session: requests.Session, user_name: str) -> Any:
+    course_memberships = get_course_memberships(session, user_name)
+
+    course_list = []
+
+    for course in course_memberships:
+        url = url_builder.base_v3().add_courses().add_id(course['courseId']).create()
+        response = session.get(url, params={'fields': 'id, name'})
+        response = json.loads(response.text)
+        course_list.append(response)
+    
+    return course_list
+
+def list_course(session: requests.Session, course_id:str) -> Any:
     url = url_builder.base_v3().add_courses().add_id(course_id).create()
-    response = requests.get(url, cookies=cookies)
+    response = session.get(url)
     return json.loads(response.text)
 
-def list_favorite_courses(cookies: Dict, user_name: str) -> Any:
+def list_favorite_courses(session: requests.Session, user_name: str) -> Any:
     return "Blackboard rest api do not have an option for this yet"
     # response = requests.get('https://ntnu.blackboard.com/learn/api/public/v1/users/userName:{}/courses'.format(user_name), cookies=cookies)
+
+
+"""
+
+HELPER FUNCTIONS
+
+"""
+
+def take_start_date(elem):
+    return date.fromisoformat(elem['availability']['duration']['start'].split('T')[0])
+
+def get_terms(session: requests.Session):
+    url = url_builder.base_v1().add_terms().create()
+    terms = session.get(url)
+    terms = json.loads(terms.text)['results']
+    return terms
+
+def sort_terms(terms):
+    # Sort terms by start date to get the two most recent semesters to determine which courses to show
+    for term in terms:
+        if term['availability']['duration']['type'] != 'DateRange':
+            terms.remove(term)
+    terms.sort(key=take_start_date)
+
+def get_course_memberships(session: requests.Session, user_name: str):
+    url = url_builder.base_v1().add_users().add_id(id=user_name, id_type='userName').add_courses().create()
+    course_memberships = session.get(url)
+    course_memberships = json.loads(course_memberships.text)['results']
+    return course_memberships
\ No newline at end of file
-- 
GitLab