lms.backend.canvas.courses.groupsets.memberships.list

 1import typing
 2
 3import lms.backend.canvas.common
 4import lms.model.groups
 5import lms.model.groupsets
 6import lms.model.users
 7
 8BASE_ENDPOINT = "/api/v1/group_categories/{groupset_id}/export"
 9
10def request(backend: typing.Any,
11        course_id: int,
12        groupset_id: int,
13        ) -> typing.List[lms.model.groupsets.GroupSetMembership]:
14    """ List group set memberships. """
15
16    url = backend.server + BASE_ENDPOINT.format(groupset_id = groupset_id)
17    headers = backend.get_standard_headers()
18
19    raw_text = lms.backend.canvas.common.make_get_request(url, headers = headers, json = False)
20    if (raw_text is None):
21        identifiers = {
22            'course_id': course_id,
23            'groupset_id': groupset_id,
24        }
25        backend.not_found('list group set memberships', identifiers)
26
27        return []
28
29    raw_objects = _parse_csv(raw_text)
30
31    groupset_query = lms.model.groupsets.GroupSetQuery(id = groupset_id)
32
33    memberships = []
34    for raw_object in raw_objects:
35        # Canvas includes unassigned users.
36        if (raw_object.get('canvas_group_id', None) is None):
37            continue
38
39        user_query = lms.model.users.UserQuery(
40            id = raw_object.get('canvas_user_id', None),
41            name = raw_object.get('name', None),
42            email = raw_object.get('user_id', None)
43        )
44        group_query = lms.model.groups.GroupQuery(
45            id = raw_object.get('canvas_group_id', None),
46            name = raw_object.get('group_name', None),
47        )
48
49        membership = lms.model.groupsets.GroupSetMembership(user = user_query, groupset = groupset_query, group = group_query)
50        memberships.append(membership)
51
52    return memberships
53
54def _parse_csv(text: str) -> typing.List[typing.Dict[str, str]]:
55    rows: typing.List[typing.Dict[str, str]] = []
56    headers = None
57
58    for line in text.splitlines():
59        if (len(line.strip()) == 0):
60            continue
61
62        parts = [part.strip() for part in line.split(',')]
63
64        if (headers is None):
65            headers = parts
66            continue
67
68        if (len(parts) != len(headers)):
69            raise ValueError("Canvas returned an improperly formatted CSV file.")
70
71        rows.append({headers[i]: parts[i] for i in range(len(headers))})
72
73    return rows
BASE_ENDPOINT = '/api/v1/group_categories/{groupset_id}/export'
def request( backend: Any, course_id: int, groupset_id: int) -> List[lms.model.groupsets.GroupSetMembership]:
11def request(backend: typing.Any,
12        course_id: int,
13        groupset_id: int,
14        ) -> typing.List[lms.model.groupsets.GroupSetMembership]:
15    """ List group set memberships. """
16
17    url = backend.server + BASE_ENDPOINT.format(groupset_id = groupset_id)
18    headers = backend.get_standard_headers()
19
20    raw_text = lms.backend.canvas.common.make_get_request(url, headers = headers, json = False)
21    if (raw_text is None):
22        identifiers = {
23            'course_id': course_id,
24            'groupset_id': groupset_id,
25        }
26        backend.not_found('list group set memberships', identifiers)
27
28        return []
29
30    raw_objects = _parse_csv(raw_text)
31
32    groupset_query = lms.model.groupsets.GroupSetQuery(id = groupset_id)
33
34    memberships = []
35    for raw_object in raw_objects:
36        # Canvas includes unassigned users.
37        if (raw_object.get('canvas_group_id', None) is None):
38            continue
39
40        user_query = lms.model.users.UserQuery(
41            id = raw_object.get('canvas_user_id', None),
42            name = raw_object.get('name', None),
43            email = raw_object.get('user_id', None)
44        )
45        group_query = lms.model.groups.GroupQuery(
46            id = raw_object.get('canvas_group_id', None),
47            name = raw_object.get('group_name', None),
48        )
49
50        membership = lms.model.groupsets.GroupSetMembership(user = user_query, groupset = groupset_query, group = group_query)
51        memberships.append(membership)
52
53    return memberships

List group set memberships.