class CourseAPIMixin(object): access_token = None course_api_enabled = False course_api = None course_id = None @cached_property def course_info(self): """ Returns course info. All requests for course info should be made against this property to take advantage of caching. """ return self.get_course_info(self.course_id) def dispatch(self, request, *args, **kwargs): self.course_api_enabled = switch_is_active('enable_course_api') if self.course_api_enabled and request.user.is_authenticated(): self.access_token = settings.COURSE_API_KEY or request.user.access_token self.course_api = CourseStructureApiClient( settings.COURSE_API_URL, self.access_token).courses return super(CourseAPIMixin, self).dispatch(request, *args, **kwargs) def _course_detail_cache_key(self, course_id): return sanitize_cache_key(u'course_{}_details'.format(course_id)) def get_course_info(self, course_id): """ Retrieve course info from the Course API. Retrieved data is cached. Arguments course_id -- ID of the course for which data should be retrieved """ key = self._course_detail_cache_key(course_id) info = cache.get(key) if not info: try: logger.debug("Retrieving detail for course: %s", course_id) info = self.course_api(course_id).get() cache.set(key, info) except HttpClientError as e: logger.error("Unable to retrieve course info for %s: %s", course_id, e) info = {} return info def get_courses(self): # Check the cache for the user's courses key = sanitize_cache_key(u'user_{}_courses'.format( self.request.user.pk)) courses = cache.get(key) # If no cached courses, iterate over the data from the course API. if not courses: courses = [] page = 1 while page: try: logger.debug('Retrieving page %d of course info...', page) response = self.course_api.get(page=page, page_size=100) course_details = response['results'] # Cache the information so that it doesn't need to be retrieved later. for course in course_details: course_id = course['id'] _key = self._course_detail_cache_key(course_id) cache.set(_key, course) courses += course_details if response['next']: page += 1 else: page = None logger.debug( 'Completed retrieval of course info. Retrieved info for %d courses.', len(courses)) except HttpClientError as e: logger.error("Unable to retrieve course data: %s", e) page = None break cache.set(key, courses) return courses
class CourseAPIMixin(object): access_token = None course_api_enabled = False course_api = None course_id = None @cached_property def course_info(self): """ Returns course info. All requests for course info should be made against this property to take advantage of caching. """ return self.get_course_info(self.course_id) def dispatch(self, request, *args, **kwargs): self.course_api_enabled = switch_is_active('enable_course_api') if self.course_api_enabled and request.user.is_authenticated(): self.access_token = settings.COURSE_API_KEY or request.user.access_token self.course_api = CourseStructureApiClient(settings.COURSE_API_URL, self.access_token).courses return super(CourseAPIMixin, self).dispatch(request, *args, **kwargs) def _course_detail_cache_key(self, course_id): return sanitize_cache_key(u'course_{}_details'.format(course_id)) def get_course_info(self, course_id): """ Retrieve course info from the Course API. Retrieved data is cached. Arguments course_id -- ID of the course for which data should be retrieved """ key = self._course_detail_cache_key(course_id) info = cache.get(key) if not info: try: logger.debug("Retrieving detail for course: %s", course_id) info = self.course_api(course_id).get() cache.set(key, info) except HttpClientError as e: logger.error("Unable to retrieve course info for %s: %s", course_id, e) info = {} return info def get_courses(self): # Check the cache for the user's courses key = sanitize_cache_key(u'user_{}_courses'.format(self.request.user.pk)) courses = cache.get(key) # If no cached courses, iterate over the data from the course API. if not courses: courses = [] page = 1 while page: try: logger.debug('Retrieving page %d of course info...', page) response = self.course_api.get(page=page, page_size=100) course_details = response['results'] # Cache the information so that it doesn't need to be retrieved later. for course in course_details: course_id = course['id'] _key = self._course_detail_cache_key(course_id) cache.set(_key, course) courses += course_details if response['next']: page += 1 else: page = None logger.debug('Completed retrieval of course info. Retrieved info for %d courses.', len(courses)) except HttpClientError as e: logger.error("Unable to retrieve course data: %s", e) page = None break cache.set(key, courses) return courses