lms.backend.blackboard.model

 1import re
 2import typing
 3
 4import lms.model.courses
 5import lms.model.users
 6
 7COURSE_ROLE_MAPPING: typing.Dict[str, lms.model.users.CourseRole] = {
 8    'Guest': lms.model.users.CourseRole.OTHER,
 9    'Student': lms.model.users.CourseRole.STUDENT,
10    'Grader': lms.model.users.CourseRole.GRADER,
11    'TeachingAssistant': lms.model.users.CourseRole.ADMIN,
12    'Instructor': lms.model.users.CourseRole.OWNER,
13}
14
15def parse_id(text: str) -> str:
16    """ Blackboard tends to put other text around their ids. """
17
18    text = text.strip()
19
20    match = re.match(r'^_(\d+)_\d*', text)
21    if (match is not None):
22        return match.group(1)
23
24    return text
25
26def format_id(id: int) -> str:
27    """ Format a Blackboard primary ID. """
28
29    return f"_{id}_1"
30
31def course(data: typing.Dict[str, typing.Any]) -> lms.model.courses.Course:
32    """
33    Create a Blackboard course from raw data.
34    """
35
36    return lms.model.courses.Course(
37        id = parse_id(data['id']),
38        name = data['name'],
39    )
40
41def course_user(data: typing.Dict[str, typing.Any]) -> lms.model.users.CourseUser:
42    """
43    Create a Blackboard course from raw data.
44    """
45
46    user = data['user']
47
48    return lms.model.users.CourseUser(
49        id = parse_id(user['id']),
50        name = user['name']['given'],
51        email = user['contact']['email'],
52        raw_role = data['courseRoleId'],
53        role = COURSE_ROLE_MAPPING.get(data['courseRoleId'], None),
54    )
COURSE_ROLE_MAPPING: Dict[str, lms.model.users.CourseRole] = {'Guest': <CourseRole.OTHER: 'other'>, 'Student': <CourseRole.STUDENT: 'student'>, 'Grader': <CourseRole.GRADER: 'grader'>, 'TeachingAssistant': <CourseRole.ADMIN: 'admin'>, 'Instructor': <CourseRole.OWNER: 'owner'>}
def parse_id(text: str) -> str:
16def parse_id(text: str) -> str:
17    """ Blackboard tends to put other text around their ids. """
18
19    text = text.strip()
20
21    match = re.match(r'^_(\d+)_\d*', text)
22    if (match is not None):
23        return match.group(1)
24
25    return text

Blackboard tends to put other text around their ids.

def format_id(id: int) -> str:
27def format_id(id: int) -> str:
28    """ Format a Blackboard primary ID. """
29
30    return f"_{id}_1"

Format a Blackboard primary ID.

def course(data: Dict[str, Any]) -> lms.model.courses.Course:
32def course(data: typing.Dict[str, typing.Any]) -> lms.model.courses.Course:
33    """
34    Create a Blackboard course from raw data.
35    """
36
37    return lms.model.courses.Course(
38        id = parse_id(data['id']),
39        name = data['name'],
40    )

Create a Blackboard course from raw data.

def course_user(data: Dict[str, Any]) -> lms.model.users.CourseUser:
42def course_user(data: typing.Dict[str, typing.Any]) -> lms.model.users.CourseUser:
43    """
44    Create a Blackboard course from raw data.
45    """
46
47    user = data['user']
48
49    return lms.model.users.CourseUser(
50        id = parse_id(user['id']),
51        name = user['name']['given'],
52        email = user['contact']['email'],
53        raw_role = data['courseRoleId'],
54        role = COURSE_ROLE_MAPPING.get(data['courseRoleId'], None),
55    )

Create a Blackboard course from raw data.