class CatalogApiService(object): """The service to interface with edX catalog API""" def __init__(self, access_token, oauth_host, oauth_key, oauth_secret, api_url_root): self.access_token = access_token if not access_token: logger.info( 'No access token provided. Retrieving access token using client_credential flow...' ) try: self.access_token, expires = EdxRestApiClient.get_oauth_access_token( '{root}/access_token'.format(root=oauth_host), oauth_key, oauth_secret, token_type='jwt') except Exception: logger.exception( 'No access token provided or acquired through client_credential flow.' ) raise logger.info('Token retrieved: %s', access_token) self.api_client = EdxRestApiClient(api_url_root, jwt=self.access_token) self._programs_dictionary = {} def _get_resource_from_api(self, api_endpoint, page_size, **kwargs): page = 0 results = [] while page >= 0: response = api_endpoint.get(limit=page_size, offset=(page * page_size), **kwargs) if response.get('next'): page += 1 else: page = -1 results.extend(response.get('results')) return results def get_courses(self): logger.debug('Get Courses called') return self._get_resource_from_api(self.api_client.courses(), COURSES_PAGE_SIZE, marketable=1) def get_program_dictionary(self): if not self._programs_dictionary: program_array = self._get_resource_from_api( self.api_client.programs(), PROGRAMS_PAGE_SIZE, marketable=1, published_course_runs_only=1) for program in program_array: self._programs_dictionary[program['uuid']] = program return self._programs_dictionary
def _delete_program(self, program_id, jwt_token): """ With the JWT token, hit the program details URL with the patch to set the program status to "deleted". This is the delete program step """ url = '{0}/api/v1/'.format(PROGRAMS_URL_ROOT) delete_client = EdxRestApiClient(url, jwt=jwt_token) deleted_program = delete_client.programs(program_id).patch( {'status': 'deleted'}) # tell the caller wither the delete is successful or not. return deleted_program['status'] == 'deleted'
class CatalogApiService(object): """The service to interface with edX catalog API""" def __init__(self, access_token, oauth_host, oauth_key, oauth_secret, api_url_root): self.access_token = access_token if not access_token: logger.info( 'No access token provided. Retrieving access token using client_credential flow...' ) try: access_token_url = '{}/access_token'.format(oauth_host) self.access_token, __ = EdxRestApiClient.get_oauth_access_token( access_token_url, oauth_key, oauth_secret, token_type='jwt') except Exception: logger.exception( 'No access token provided or acquired through client_credential flow.' ) raise logger.info('Retrieved access token.') self.api_client = EdxRestApiClient(api_url_root, jwt=self.access_token) self._programs_dictionary = {} def _get_resource_from_api(self, api_endpoint, **kwargs): results = [] while True: response = api_endpoint.get(**kwargs) next_url = response.get('next') results.extend(response.get('results')) if next_url: parsed_url = urlparse(next_url) query_string_dict = parse_qs(parsed_url.query) kwargs = query_string_dict else: break return results def get_courses(self): logger.debug('Get Courses called') return self._get_resource_from_api(self.api_client.courses(), page=1, page_size=COURSES_PAGE_SIZE, exclude_utm=1) def get_marketable_only_course_runs_keys(self): logger.debug('Get marketable only course_runs called') courses = self._get_resource_from_api( self.api_client.courses(), page=1, page_size=COURSES_PAGE_SIZE, exclude_utm=1, marketable_course_runs_only=1, ) course_run_keys = [] for course in courses: course_runs = course.get('course_runs', []) for course_run in course_runs: course_run_keys.append(course_run.get('key')) logging.debug('Retrieved {} marketable course runs'.format( len(course_run_keys))) return course_run_keys def get_program_dictionary(self): if not self._programs_dictionary: program_array = self._get_resource_from_api( self.api_client.programs(), page=1, page_size=PROGRAMS_PAGE_SIZE, marketable_course_runs_only=1, marketable=1) for program in program_array: self._programs_dictionary[program['uuid']] = program return self._programs_dictionary