From f719c7ac9263de86c0ea60656bf95785debe9055 Mon Sep 17 00:00:00 2001 From: Fateme Khodayari Date: Tue, 13 Feb 2024 13:01:38 +0330 Subject: [PATCH] feat: get grades for a course --- openedx_rest_api_client/client.py | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/openedx_rest_api_client/client.py b/openedx_rest_api_client/client.py index d1800fd..e0c25f5 100644 --- a/openedx_rest_api_client/client.py +++ b/openedx_rest_api_client/client.py @@ -41,6 +41,8 @@ URL_BULKENROLL = '/api/bulk_enroll/v1/bulk_enroll' +URL_COURSE_GRADES = '/api/grades/v1/courses/{course_id}/' + class OpenedxRESTAPIClient: """ A client to access Open edX REST API endpoints. @@ -241,3 +243,23 @@ def change_enrollment(self, response.raise_for_status() return response.json() + + def get_course_grades(self, course_id, username=None) -> List[dict]: + def _get_course_grades(url, _course_id, _params=None): + """ Recursively load all grades for a course. """ + response = self.session.get(urljoin(url, URL_COURSE_GRADES.format(course_id=_course_id)), params=_params) + response.raise_for_status() + data = response.json() + if isinstance(data, dict): + results = data.get('results', []) + if next_page_url := data.get('next'): + results += _get_course_grades(next_page_url, _course_id, parse_qs(urlparse(next_page_url).query)) + else: + results = data + return results + + params = {} + if username: + params['username'] = username + + return _get_course_grades(self._base_url, course_id, params)