Skip to content

Usage Guide

This guide covers every feature of the Blackboard Integration Toolkit, from basic CRUD operations to advanced synchronisation.

Prerequisites

  • Python 3.10+
  • Blackboard Learn instance (or mock server)
  • Configured environment variables (see Configuration)

1. Python API

The toolkit provides a clean Python interface via the BlackboardClient facade.

Initialise the Client

from blackboard import BlackboardClient

client = BlackboardClient.from_env()  # reads from .env

Or manually:

from blackboard import BlackboardClient
from blackboard.interfaces.config.settings import Settings

settings = Settings.from_env()
client = BlackboardClient(settings)

Students

Get a Student

student = client.get_student("student_id")
if student:
    print(student.full_name)

List Students

# All students (paginated internally)
for student in client.list_students(limit=50):
    print(student.username)

# With filters (e.g., active only)
active_students = client.list_students(active=True)

Create or Update a Student

from blackboard.domain.entities import Student
from blackboard.domain.value_objects import StudentId

new_student = Student(
    id=StudentId("ext123"),
    username="jdoe",
    email="jdoe@example.com",
    first_name="John",
    last_name="Doe",
    active=True
)

created = client.save(new_student)  # Creates if not exists, updates otherwise

Delete a Student

client.delete(StudentId("ext123"))

Courses

Get a Course

course = client.get_course("course_id")

List Courses

courses = client.list_courses(limit=100)

Create or Update a Course

from blackboard.domain.entities import Course
from blackboard.domain.value_objects import CourseId

new_course = Course(
    id=CourseId("ext_course_1"),
    name="Python Programming",
    code="PY101",
    description="Intro to Python",
    active=True
)

created = client.save(new_course)

Delete a Course

client.delete(CourseId("ext_course_1"))

Enrollments

Get Enrollments by Course

enrollments = client.list_enrollments(course_id, active_only=True)

Get Enrollments by Student

enrollments = client.enrollments.list_by_student(student_id)

Create an Enrollment

from blackboard.domain.entities import Enrollment
from blackboard.domain.value_objects import EnrollmentId, StudentId, CourseId

enrollment = Enrollment(
    id=EnrollmentId("s1_c1"),
    student_id=StudentId("s1"),
    course_id=CourseId("c1"),
    role="student",
    active=True
)

created = client.save(enrollment)

Delete an Enrollment

client.delete(EnrollmentId("s1_c1"))

Assignments

List Assignments in a Course

assignments = client.list_assignments(course_id)

Create an Assignment

from blackboard.domain.entities import Assignment
from blackboard.domain.value_objects import AssignmentId, CourseId

assignment = Assignment(
    id=None,  # None will trigger a POST (create)
    course_id=CourseId("c1"),
    name="Homework 1",
    points_possible=100,
    description="Solve problems 1-5"
)

created = client.save(assignment)

Update an Assignment

# Get existing, modify, save
assignment = client.get_assignment("a1")  # if you have a get method
assignment.name = "Updated Homework 1"
updated = client.save(assignment)

2. Synchronisation Engines

Sync engines compare external data (from SIS, ERP, etc.) with Blackboard and perform create/update/delete operations in bulk.

Sync Students

from blackboard.application.services.sync_service import SyncService
from blackboard.application.dto import SyncOptions

service = SyncService(client.provider)

external_students = [
    {"id": "ext1", "username": "john", "email": "john@example.com", ...}
]

result = service.sync_students(
    external_students,
    SyncOptions(dry_run=False)
)

print(f"Created: {result.created}, Updated: {result.updated}")

Sync Courses

external_courses = [
    {"id": "ext_c1", "name": "Math 101", "code": "MATH101", ...}
]

result = service.sync_courses(
    external_courses,
    SyncOptions(dry_run=True)
)

Sync Enrollments

external_enrollments = [
    {
        "student_id": "ext_s1",
        "course_id": "ext_c1",
        "role": "student",
        "active": True
    }
]

result = service.sync_enrollments(external_enrollments)

Sync Grades (stub – extend as needed)

external_grades = [
    {
        "student_id": "ext_s1",
        "assignment_id": "ext_a1",
        "score": 85.0
    }
]

result = service.sync_grades(
    external_grades,
    assignment_id="ext_a1"
)

3. CLI Commands

All operations are also available via the command line.

Show Configuration

bb-toolkit config show

Validate Connection

bb-toolkit config validate

Sync Students

bb-toolkit sync-students --file students.json

With dry-run:

bb-toolkit sync-students --file students.json --dry-run

Sync Courses

bb-toolkit sync-courses --file courses.json

Sync Enrollments

bb-toolkit sync-enrollments --file enrollments.json

Start Mock Server

bb-toolkit mock-server --port 5001

4. Mock Server

For development without a real Blackboard instance, use the mock server. It fully supports all endpoints and OAuth2.

bb-toolkit mock-server --port 5001

Then set environment variables to point to http://localhost:5001 and run any command.


5. Error Handling

All methods raise custom exceptions:

  • AuthenticationError – invalid credentials or token expired.
  • ResourceNotFoundError – requested resource does not exist.
  • RateLimitExceededError – too many requests.
  • ValidationError – invalid input data.
  • BlackboardError – generic error.

Example:

from blackboard.exceptions import ResourceNotFoundError

try:
    student = client.get_student("non_existent")
except ResourceNotFoundError:
    print("Student not found")

6. Advanced: Direct Repository Access

If you need more low-level control, you can access repositories directly via client.provider:

# List all students using the repository
students = list(client.provider.students.list_all())

# Get a specific student
student = client.provider.students.get(StudentId("s1"))

7. Extending with Events

The toolkit includes an event bus for custom hooks.

from blackboard.events.event_bus import EventBus, Event

def on_sync_completed(event):
    print(f"Sync finished: {event.payload.status}")

EventBus.register("sync.students.completed", on_sync_completed)

Now your handler will be called after every student sync.


Summary

Feature Python API CLI
Get student client.get_student(id)
List students client.list_students()
Create/update student client.save(Student) bb-toolkit sync-students
Delete student client.delete(StudentId)
Get course client.get_course(id)
List courses client.list_courses()
Create/update course client.save(Course) bb-toolkit sync-courses
Delete course client.delete(CourseId)
List enrollments client.list_enrollments(course_id)
Create/update enrollment client.save(Enrollment) bb-toolkit sync-enrollments
Delete enrollment client.delete(EnrollmentId)
List assignments client.list_assignments(course_id)
Create/update assignment client.save(Assignment)
Sync students service.sync_students() bb-toolkit sync-students
Sync courses service.sync_courses() bb-toolkit sync-courses
Sync enrollments service.sync_enrollments() bb-toolkit sync-enrollments
Validate config bb-toolkit config validate
Start mock server bb-toolkit mock-server

Now you have everything you need to fully integrate Blackboard with your systems!