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