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        'student_ids[]': 'all',
24    }
25
26    assignment_queries = [lms.model.assignments.AssignmentQuery(id = id) for id in assignment_ids]
27    user_queries = [lms.model.users.UserQuery(id = id) for id in user_ids]
28    gradebook = lms.model.scores.Gradebook(assignment_queries, user_queries)
29
30    raw_objects = lms.backend.canvas.common.make_get_request_list(url, headers = headers, data = data)
31    if (raw_objects is None):
32        identifiers = {
33            'course_id': course_id,
34            'user_ids': user_ids,
35        }
36        backend.not_found('fetch gradebook', identifiers)
37
38        return gradebook
39
40    for raw_object in raw_objects:
41        # Check if this is an actual submission and not just a placeholder.
42        if (raw_object.get('workflow_state', None) == 'unsubmitted'):
43            continue
44
45        user_id = int(raw_object.get('user_id', -1))
46        if ((len(user_ids) != 0) and (user_id not in user_ids)):
47            continue
48
49        assignment_id = int(raw_object.get('assignment_id', -1))
50        if ((len(assignment_ids) != 0) and (assignment_id not in assignment_ids)):
51            continue
52
53        gradebook.add(lms.backend.canvas.model.assignment_score(raw_object))
54
55    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        '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            'user_ids': user_ids,
36        }
37        backend.not_found('fetch gradebook', identifiers)
38
39        return gradebook
40
41    for raw_object in raw_objects:
42        # Check if this is an actual submission and not just a placeholder.
43        if (raw_object.get('workflow_state', None) == 'unsubmitted'):
44            continue
45
46        user_id = int(raw_object.get('user_id', -1))
47        if ((len(user_ids) != 0) and (user_id not in user_ids)):
48            continue
49
50        assignment_id = int(raw_object.get('assignment_id', -1))
51        if ((len(assignment_ids) != 0) and (assignment_id not in assignment_ids)):
52            continue
53
54        gradebook.add(lms.backend.canvas.model.assignment_score(raw_object))
55
56    return gradebook

Fetch a gradebook for the given users and assignments.