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.