Skip to content
Snippets Groups Projects
Commit 3fad7cba authored by magnus2142's avatar magnus2142
Browse files

Merge branch 'magnus_feature_command-setup' into main

parents 07326030 564cda0c
No related branches found
No related tags found
No related merge requests found
from bbcli import __app_name__
from .cli import entry_point
from bbcli.cli import entry_point
def main():
entry_point()
......
File deleted
from typing import Optional
from pkg_resources import EntryPoint
import requests
from bbcli.utils.utils import set_cookies, set_headers
# import typer
from bbcli import __app_name__, __version__
from bbcli.endpoints import get_user, get_course_contents, get_assignments
# from bbcli.endpoints import get_user, get_course_contents, get_assignments
import os
from dotenv import load_dotenv
from bbcli import check_valid_date, check_response
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()
def entry_point():
@click.pass_context
def entry_point(ctx):
ctx.ensure_object(dict)
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
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_course_contents)
entry_point.add_command(get_assignments)
contents.add_command(list_contents)
contents.add_command(create_content)
load_dotenv()
cookies = {'BbRouter' : os.getenv("BB_ROUTER")}
......@@ -29,4 +93,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:
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)
from email.policy import default
import click
from bbcli.services import course_service
from bbcli.services import courses_service
from bbcli.views import course_view
import os
import requests
from bbcli.utils.utils import set_cookies, set_headers
#, help='List a spesific course with the corresponding id'
@click.command(name='courses')
@click.command(name='list')
@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')
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
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
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)
else:
user_name = os.getenv('BB_USERNAME')
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:
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)
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
from subprocess import call
from typing import Dict, Any
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
import click
......
import base64
import json
import os
from subprocess import call
from tarfile import ENCODING
from typing import Dict, Any
import requests
from bbcli.services.course_service import list_courses
import click
from bbcli.services.courses_service import list_courses
from bbcli.utils.URL_builder import URLBuilder
url_builder = URLBuilder()
# User gets a tree structure view of the courses content
# where each content is listed something like this: _030303_1 Lectures Folder
......@@ -34,4 +38,49 @@ def list_assignments(cookies: Dict, course_id: str):
# Delete spesific content
# Update spesific content
\ No newline at end of file
# Update spesific content
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):
pass
@abstractmethod
def add_terms(slef) -> Builder:
def add_terms(self) -> Builder:
pass
@abstractmethod
def add_children(self) -> Builder:
pass
@abstractmethod
def add_attachments(self) -> Builder:
pass
@abstractmethod
def add_id(self, id: str, id_type: str = None) -> Builder:
pass
......@@ -105,6 +113,14 @@ class URLBuilder(Builder):
self._product.add('/terms')
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:
if id_type:
self._product.add(f'/{id_type}:{id}')
......
......@@ -4,11 +4,12 @@ from bbcli.utils.utils import html_to_text
def print_announcements(announcements: List):
announcements.reverse()
for course in announcements:
print_course_announcements(course['course_announcements'], course['course_name'])
def print_course_announcements(course_announcements: List, course_name: str = None):
course_announcements.reverse()
for announcement in course_announcements:
if 'body' in announcement:
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