lms.backend.canvas.courses.gradebook.fetch

 1import typing
 2
 3import lms.backend.canvas.common
 4import lms.backend.canvas.model
 5import lms.model.assignments
 6import lms.model.scores
 7import lms.model.users
 8
 9BASE_ENDPOINT = "/api/v1/courses/{course_id}/students/submissions"
10
11def request(backend: typing.Any,
12        course_id: int,
13        assignment_ids: typing.List[int],
14        user_ids: typing.List[int],
15        ) -> lms.model.scores.Gradebook:
16    """ Fetch a gradebook for the given users and assignments. """
17
18    url = backend.server + BASE_ENDPOINT.format(course_id = course_id)
19    headers = backend.get_standard_headers()
20
21    data = {
22        'per_page': lms.backend.canvas.common.DEFAULT_PAGE_SIZE,
23        'assignment_ids[]': [str(assignment_id) for assignment_id in assignment_ids],
24        'student_ids[]': 'all',
25    }
26
27    assignment_queries = [lms.model.assignments.AssignmentQuery(id = id) for id in assignment_ids]
28    user_queries = [lms.model.users.UserQuery(id = id) for id in user_ids]
29    gradebook = lms.model.scores.Gradebook(assignment_queries, user_queries)
30
31    raw_objects = lms.backend.canvas.common.make_get_request_list(url, headers = headers, data = data)
32    if (raw_objects is None):
33        identifiers = {
34            'course_id': course_id,
35            'assignment_ids': assignment_ids,
36            'user_ids': user_ids,
37        }
38        backend.not_found('fetch gradebook', identifiers)
39
40        return gradebook
41
42    for raw_object in raw_objects:
43        # Check if this is an actual submission and not just a placeholder.
44        if (raw_object.get('workflow_state', None) == 'unsubmitted'):
45            continue
46
47        user_id = int(raw_object.get('user_id', -1))
48        if ((len(user_ids) != 0) and (user_id not in user_ids)):
49            continue
50
51        gradebook.add(lms.backend.canvas.model.assignment_score(raw_object))
52
53    return gradebook
BASE_ENDPOINT = '/api/v1/courses/{course_id}/students/submissions'
def request( backend: Any, course_id: int, assignment_ids: List[int], user_ids: List[int]) -> lms.model.scores.Gradebook:
12def request(backend: typing.Any,
13        course_id: int,
14        assignment_ids: typing.List[int],
15        user_ids: typing.List[int],
16        ) -> lms.model.scores.Gradebook:
17    """ Fetch a gradebook for the given users and assignments. """
18
19    url = backend.server + BASE_ENDPOINT.format(course_id = course_id)
20    headers = backend.get_standard_headers()
21
22    data = {
23        'per_page': lms.backend.canvas.common.DEFAULT_PAGE_SIZE,
24        'assignment_ids[]': [str(assignment_id) for assignment_id in assignment_ids],
25        'student_ids[]': 'all',
26    }
27
28    assignment_queries = [lms.model.assignments.AssignmentQuery(id = id) for id in assignment_ids]
29    user_queries = [lms.model.users.UserQuery(id = id) for id in user_ids]
30    gradebook = lms.model.scores.Gradebook(assignment_queries, user_queries)
31
32    raw_objects = lms.backend.canvas.common.make_get_request_list(url, headers = headers, data = data)
33    if (raw_objects is None):
34        identifiers = {
35            'course_id': course_id,
36            'assignment_ids': assignment_ids,
37            'user_ids': user_ids,
38        }
39        backend.not_found('fetch gradebook', identifiers)
40
41        return gradebook
42
43    for raw_object in raw_objects:
44        # Check if this is an actual submission and not just a placeholder.
45        if (raw_object.get('workflow_state', None) == 'unsubmitted'):
46            continue
47
48        user_id = int(raw_object.get('user_id', -1))
49        if ((len(user_ids) != 0) and (user_id not in user_ids)):
50            continue
51
52        gradebook.add(lms.backend.canvas.model.assignment_score(raw_object))
53
54    return gradebook

Fetch a gradebook for the given users and assignments.