Skip to content
Snippets Groups Projects
Commit 1986daad authored by williamforbrigd's avatar williamforbrigd
Browse files

content stuff

parents 2121eed9 3fad7cba
No related branches found
No related tags found
No related merge requests found
from bbcli import __app_name__ from bbcli import __app_name__
from .cli import entry_point from bbcli.cli import entry_point
def main(): def main():
entry_point() entry_point()
......
File deleted
from typing import Optional from typing import Optional
from pkg_resources import EntryPoint from pkg_resources import EntryPoint
import requests
from bbcli.utils.utils import set_cookies, set_headers
# import typer # import typer
from bbcli import __app_name__, __version__ from bbcli import __app_name__, __version__
from bbcli.endpoints import get_user, get_course_contents, get_contents from bbcli.endpoints import get_user, get_course_contents, get_contents
# from bbcli.endpoints import get_user, get_course_contents, get_assignments
import os import os
from dotenv import load_dotenv from dotenv import load_dotenv
from bbcli import check_valid_date, check_response from bbcli import check_valid_date, check_response
import click import click
from bbcli.services import authorization_service 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 list_contents, create_content
from bbcli.services.authorization_service import login
def initiate_session():
bb_cookie = {
'name':'BbRouter',
'value': os.getenv("BB_ROUTER")
}
xsrf = {'X-Blackboard-XSRF': os.getenv('XSRF')}
session = requests.Session()
set_cookies(session, [bb_cookie])
set_headers(session, [xsrf])
return session
@click.group() @click.group()
def entry_point(): @click.pass_context
def entry_point(ctx):
ctx.ensure_object(dict)
authorize_user() authorize_user()
session = initiate_session()
ctx.obj['SESSION'] = session
pass
"""
COURSE COMMANDS ENTRY POINT
"""
@entry_point.group()
@click.pass_context
def courses(ctx):
"""
Commands for listing courses
"""
pass
courses.add_command(list_courses)
"""
ANNOUNCEMENT COMMANDS ENTRY POINT
"""
@entry_point.group()
@click.pass_context
def announcements(ctx):
"""
Commands for listing, creating, deleting and updating announcements
"""
pass pass
announcements.add_command(list_announcements)
announcements.add_command(create_announcement)
announcements.add_command(delete_announcement)
announcements.add_command(update_announcement)
"""
CONTENT COMMANDS ENTRY POINT
"""
@entry_point.group()
@click.pass_context
def contents(ctx):
"""
Commands for listing, creating, deleting, updating and downloading content
"""
pass
entry_point.add_command(get_user) entry_point.add_command(get_user)
entry_point.add_command(get_course_contents) entry_point.add_command(get_course_contents)
entry_point.add_command(get_contents) entry_point.add_command(get_contents)
contents.add_command(list_contents)
contents.add_command(create_content)
load_dotenv() load_dotenv()
cookies = {'BbRouter' : os.getenv("BB_ROUTER")} cookies = {'BbRouter' : os.getenv("BB_ROUTER")}
headers = {'X-Blackboard-XSRF': os.getenv('XSRF')} headers = {'X-Blackboard-XSRF': os.getenv('XSRF')}
...@@ -29,4 +98,4 @@ headers = {'X-Blackboard-XSRF': os.getenv('XSRF')} ...@@ -29,4 +98,4 @@ headers = {'X-Blackboard-XSRF': os.getenv('XSRF')}
# @app.command(name='login', help='Authorize the user.') # @app.command(name='login', help='Authorize the user.')
def authorize_user(): def authorize_user():
if check_valid_date(cookies) == False: if check_valid_date(cookies) == False:
authorization_service.login() login()
import click
from bbcli.services import announcements_service
from bbcli.views import announcement_view
import os
@click.command(name='list')
@click.argument('course_id', required=False)
@click.argument('announcement_id', required=False)
@click.pass_context
def list_announcements(ctx,course_id=None, announcement_id=None):
"""
This command lists your announcements.
Either all announcements, all announcements from a spesific course, or one announcement.
"""
response = None
if announcement_id:
response = announcements_service.list_announcement(ctx.obj['SESSION'], course_id, announcement_id)
announcement_view.print_course_announcements([response])
elif course_id:
response = announcements_service.list_course_announcements(ctx.obj['SESSION'], course_id)
announcement_view.print_course_announcements(response)
else:
user_name = os.getenv('BB_USERNAME')
response = announcements_service.list_announcements(ctx.obj['SESSION'], user_name)
announcement_view.print_announcements(response)
@click.command(name='create')
@click.argument('course_id', required=True, type=str)
@click.argument('title', required=True, type=str)
@click.pass_context
def create_announcement(ctx, course_id: str, title: str):
"""
This command creates an announcement. Add --help
for all options available
"""
response = announcements_service.create_announcement(ctx.obj['SESSION'], course_id, title)
click.echo(response)
@click.command(name='delete')
@click.argument('course_id', required=True, type=str)
@click.argument('announcement_id', required=True, type=str)
@click.pass_context
def delete_announcement(ctx, course_id: str, announcement_id: str):
"""
This command deletes an announcement. Add --help
for all options available
"""
response = announcements_service.delete_announcement(ctx.obj['SESSION'], course_id, announcement_id)
click.echo(response)
@click.command(name='update')
@click.argument('course_id', required=True, type=str)
@click.argument('announcement_id', required=True, type=str)
@click.pass_context
def update_announcement(ctx, course_id: str, announcement_id: str):
"""
This command updates an announcement. Add --help
for all options available
"""
response = announcements_service.update_announcement(ctx.obj['SESSION'], course_id, announcement_id)
click.echo(response)
import click
from bbcli.services import contents_service
from bbcli.views import content_view
import os
#, help='List a spesific course with the corresponding id'
@click.command(name='list')
@click.argument('course_id', required=True, type=str)
@click.argument('content_id', required=False, type=str)
# @click.option('-a', '--all/--no-all', 'show_all', default=False, help='Lists all courses you have ever been signed up for')
@click.pass_context
def list_contents(ctx, course_id: str=None, content_id: str=None):
"""
This command lists contents of a course.
"""
response = None
if content_id:
print('GEtting spesific content from a course')
else:
print('Printing content tree from a course, course', course_id)
@click.command(name='create')
@click.argument('course_id', required=True, type=str)
@click.argument('content_id', required=True, type=str)
@click.pass_context
def create_content(ctx, course_id: str, content_id: str):
contents_service.test_create_assignment(ctx.obj['SESSION'], course_id, content_id)
import time import time
import requests import requests
import bbcli.cli as cli import bbcli.cli as cli
import click import click
from anytree import Node as Nd, RenderTree from anytree import Node as Nd, RenderTree
from colorama import Fore, Style
from bbcli import check_response from bbcli import check_response
from bbcli.entities.Node import Node from bbcli.entities.Node import Node
......
from email.policy import default
import click import click
from bbcli.services import course_service from bbcli.services import courses_service
from bbcli.views import course_view from bbcli.views import course_view
import os import os
import requests import requests
from bbcli.utils.utils import set_cookies, set_headers
#, help='List a spesific course with the corresponding id' #, help='List a spesific course with the corresponding id'
@click.command(name='courses') @click.command(name='list')
@click.argument('course_id', required=False) @click.argument('course_id', required=False)
@click.option('-a', '--all/--no-all', 'show_all', default=False, help='Lists all courses you have ever been signed up for') @click.option('-a', '--all/--no-all', 'show_all', default=False, help='Lists all courses you have ever been signed up for')
def list_courses(course_id=None, show_all=False): @click.pass_context
def list_courses(ctx, course_id=None, show_all=False):
""" """
This command lists your courses, by default only the courses from This command lists your courses, by default only the courses from
two last semesters two last semesters
""" """
bb_cookie = {
'name':'BbRouter',
'value': os.getenv("BB_ROUTER")
}
user_name = os.getenv('BB_USERNAME')
session = requests.Session()
set_cookies(session, [bb_cookie])
response = None response = None
if course_id: if course_id:
response = course_service.list_course(session=session, course_id=course_id) response = courses_service.list_course(session=ctx.obj['SESSION'], course_id=course_id)
course_view.print_course(response) course_view.print_course(response)
else: else:
user_name = os.getenv('BB_USERNAME')
if show_all: if show_all:
response = course_service.list_all_courses(session=session, user_name=user_name) response = courses_service.list_all_courses(session=ctx.obj['SESSION'], user_name=user_name)
else: else:
response = course_service.list_courses(session=session, user_name=user_name) response = courses_service.list_courses(session=ctx.obj['SESSION'], user_name=user_name)
course_view.print_courses(response) course_view.print_courses(response)
from email.policy import default
import click
from bbcli.services import announcement_service
from bbcli.views import announcement_view
import os
import requests
from bbcli.utils.utils import set_cookies, set_headers
@click.command(name='announcements')
@click.argument('course_id', required=False)
@click.argument('announcement_id', required=False)
def list_announcements(course_id=None, announcement_id=None):
"""
This command lists your announcements.
Either all announcements, all announcements from a spesific course, or one announcement.
"""
bb_cookie = {
'name':'BbRouter',
'value': os.getenv("BB_ROUTER")
}
xsrf = {'X-Blackboard-XSRF': os.getenv('XSRF')}
user_name = os.getenv('BB_USERNAME')
session = requests.Session()
set_cookies(session, [bb_cookie])
set_headers(session, [xsrf])
response = None
if announcement_id:
response = announcement_service.list_announcement(session, course_id, announcement_id)
announcement_view.print_course_announcements([response])
elif course_id:
response = announcement_service.list_course_announcements(session, course_id)
announcement_view.print_course_announcements(response)
else:
response = announcement_service.list_announcements(session, user_name)
announcement_view.print_announcements(response)
...@@ -2,7 +2,7 @@ import json ...@@ -2,7 +2,7 @@ import json
from subprocess import call from subprocess import call
from typing import Dict, Any from typing import Dict, Any
import requests import requests
from bbcli.services.course_service import list_courses from bbcli.services.courses_service import list_courses
from bbcli.utils.utils import set_cookies from bbcli.utils.utils import set_cookies
import click import click
......
import base64
import json import json
import os
from subprocess import call from subprocess import call
from tarfile import ENCODING
from typing import Dict, Any from typing import Dict, Any
import requests import requests
from bbcli.services.course_service import list_courses from bbcli.services.courses_service import list_courses
import click from bbcli.utils.URL_builder import URLBuilder
url_builder = URLBuilder()
# User gets a tree structure view of the courses content # User gets a tree structure view of the courses content
# where each content is listed something like this: _030303_1 Lectures Folder # where each content is listed something like this: _030303_1 Lectures Folder
...@@ -34,4 +38,49 @@ def list_assignments(cookies: Dict, course_id: str): ...@@ -34,4 +38,49 @@ def list_assignments(cookies: Dict, course_id: str):
# Delete spesific content # Delete spesific content
# Update spesific content # Update spesific content
\ No newline at end of file
def test_create_assignment(session: requests.Session, course_id: str, content_id: str):
with open('/home/magnus/Downloads/3_meeting_notes.pdf', 'rb') as f:
byte_content = f.read()
base64_bytes = base64.b64encode(byte_content)
base64_string = base64_bytes.decode(ENCODING)
data = {
"parentId": content_id,
"title": "Test file",
'body': 'jaja',
"description": "string",
"position": 0,
"launchInNewWindow": True,
"availability": {
"available": "Yes",
"allowGuests": True,
"allowObservers": True,
"adaptiveRelease": {
"start": "2022-03-29T09:32:35.571Z",
}
},
"contentHandler": {
'id':'resource/x-bb-file',
'file': base64_string
},
}
data = json.dumps(data)
session.headers.update({'Content-Type': 'application/json'})
# files = {
# 'pdf_document': open('/home/magnus/Downloads/3_meeting_notes.pdf', 'rb')
# }
# Returns the string: domain + /learn/api/public/v1/courses/{courseId}/contents/{contentId}/children
url = url_builder.base_v1().add_courses().add_id(course_id).add_contents().add_id(content_id).add_children().create()
response = session.post(url, data=data)
print(response.text)
\ No newline at end of file
...@@ -48,9 +48,17 @@ class Builder(ABC): ...@@ -48,9 +48,17 @@ class Builder(ABC):
pass pass
@abstractmethod @abstractmethod
def add_terms(slef) -> Builder: def add_terms(self) -> Builder:
pass pass
@abstractmethod
def add_children(self) -> Builder:
pass
@abstractmethod
def add_attachments(self) -> Builder:
pass
@abstractmethod @abstractmethod
def add_id(self, id: str, id_type: str = None) -> Builder: def add_id(self, id: str, id_type: str = None) -> Builder:
pass pass
...@@ -105,6 +113,14 @@ class URLBuilder(Builder): ...@@ -105,6 +113,14 @@ class URLBuilder(Builder):
self._product.add('/terms') self._product.add('/terms')
return self return self
def add_children(self) -> Builder:
self._product.add('/children')
return self
def add_attachments(self) -> Builder:
self._product.add('/attachments')
return self
def add_id(self, id:str, id_type:str=None) -> URLBuilder: def add_id(self, id:str, id_type:str=None) -> URLBuilder:
if id_type: if id_type:
self._product.add(f'/{id_type}:{id}') self._product.add(f'/{id_type}:{id}')
......
...@@ -4,11 +4,12 @@ from bbcli.utils.utils import html_to_text ...@@ -4,11 +4,12 @@ from bbcli.utils.utils import html_to_text
def print_announcements(announcements: List): def print_announcements(announcements: List):
announcements.reverse()
for course in announcements: for course in announcements:
print_course_announcements(course['course_announcements'], course['course_name']) print_course_announcements(course['course_announcements'], course['course_name'])
def print_course_announcements(course_announcements: List, course_name: str = None): def print_course_announcements(course_announcements: List, course_name: str = None):
course_announcements.reverse()
for announcement in course_announcements: for announcement in course_announcements:
if 'body' in announcement: if 'body' in announcement:
announcement_id = announcement['id'] announcement_id = announcement['id']
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment