Esempio n. 1
0
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
Esempio n. 2
0
    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'
Esempio n. 3
0
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