def get_module_by_usage_id(request, course_id, usage_id, disable_staff_debug_info=False, course=None): """ Gets a module instance based on its `usage_id` in a course, for a given request/user Returns (instance, tracking_context) """ user = request.user try: course_id = CourseKey.from_string(course_id) usage_key = UsageKey.from_string(unquote_slashes(usage_id)).map_into_course(course_id) except InvalidKeyError: raise Http404("Invalid location") try: descriptor = modulestore().get_item(usage_key) descriptor_orig_usage_key, descriptor_orig_version = modulestore().get_block_original_usage(usage_key) except ItemNotFoundError: log.warn( "Invalid location for course id %s: %s", usage_key.course_key, usage_key ) raise Http404 tracking_context = { 'module': { 'display_name': descriptor.display_name_with_default_escaped, 'usage_key': unicode(descriptor.location), } } # For blocks that are inherited from a content library, we add some additional metadata: if descriptor_orig_usage_key is not None: tracking_context['module']['original_usage_key'] = unicode(descriptor_orig_usage_key) tracking_context['module']['original_usage_version'] = unicode(descriptor_orig_version) unused_masquerade, user = setup_masquerade(request, course_id, has_access(user, 'staff', descriptor, course_id)) field_data_cache = FieldDataCache.cache_for_descriptor_descendents( course_id, user, descriptor, read_only=CrawlersConfig.is_crawler(request), ) instance = get_module_for_descriptor( user, request, descriptor, field_data_cache, usage_key.course_key, disable_staff_debug_info=disable_staff_debug_info, course=course ) if instance is None: # Either permissions just changed, or someone is trying to be clever # and load something they shouldn't have access to. log.debug("No module %s for user %s -- access denied?", usage_key, user) raise Http404 return (instance, tracking_context)
def parse_course_and_usage_keys(course_id, usage_id): """ Convert course and usage ID strings into key objects. Return a tuple of (course_key, usage_key), or throw an InvalidKeyError if the translation fails. """ course_key = CourseKey.from_string(course_id) usage_id = unquote_slashes(usage_id) usage_key = UsageKey.from_string(usage_id).map_into_course(course_key) return course_key, usage_key
def get_chapter_from_location(usage_id, course_key): """ hawthorn backend """ usage_key = UsageKey.from_string( unquote_slashes(usage_id)).map_into_course(course_key) if usage_key: path = search.path_to_location(modulestore(), usage_key) chapter = path[ 1] # 1 is the position where path_to_location returns the chapter return chapter return None
def post(self, request, *unused_args, **unused_kwargs): """Create a new bookmark for a user. The POST request only needs to contain one parameter "usage_id". Http400 is returned if the format of the request is not correct, the usage_id is invalid or a block corresponding to the usage_id could not be found. **Example Requests** POST /api/bookmarks/v1/bookmarks/ Request data: {"usage_id": <usage-id>} """ if not request.data: return self.error_response(ugettext_noop('No data provided.'), DEFAULT_USER_MESSAGE) usage_id = request.data.get('usage_id', None) if not usage_id: return self.error_response( ugettext_noop('Parameter usage_id not provided.'), DEFAULT_USER_MESSAGE) try: usage_key = UsageKey.from_string(unquote_slashes(usage_id)) except InvalidKeyError: error_message = ugettext_noop( 'Invalid usage_id: {usage_id}.').format(usage_id=usage_id) log.error(error_message) return self.error_response(error_message, DEFAULT_USER_MESSAGE) try: bookmark = api.create_bookmark(user=self.request.user, usage_key=usage_key) except ItemNotFoundError: error_message = ugettext_noop( 'Block with usage_id: {usage_id} not found.').format( usage_id=usage_id) log.error(error_message) return self.error_response(error_message, DEFAULT_USER_MESSAGE) except BookmarksLimitReachedError: error_message = ugettext_noop( 'You can create up to {max_num_bookmarks_per_course} bookmarks.' ' You must remove some bookmarks before you can add new ones.' ).format( max_num_bookmarks_per_course=settings.MAX_BOOKMARKS_PER_COURSE) log.info('Attempted to create more than %s bookmarks', settings.MAX_BOOKMARKS_PER_COURSE) return self.error_response(error_message) return Response(bookmark, status=status.HTTP_201_CREATED)
def post(self, request): """ POST /api/bookmarks/v1/bookmarks/ Request data: {"usage_id": "<usage-id>"} """ if not request.data: return self.error_response(ugettext_noop(u'No data provided.'), DEFAULT_USER_MESSAGE) usage_id = request.data.get('usage_id', None) if not usage_id: return self.error_response( ugettext_noop(u'Parameter usage_id not provided.'), DEFAULT_USER_MESSAGE) try: usage_key = UsageKey.from_string(unquote_slashes(usage_id)) except InvalidKeyError: error_message = ugettext_noop( u'Invalid usage_id: {usage_id}.').format(usage_id=usage_id) log.error(error_message) return self.error_response(error_message, DEFAULT_USER_MESSAGE) try: bookmark = api.create_bookmark(user=self.request.user, usage_key=usage_key) except ItemNotFoundError: error_message = ugettext_noop( u'Block with usage_id: {usage_id} not found.').format( usage_id=usage_id) log.error(error_message) return self.error_response(error_message, DEFAULT_USER_MESSAGE) except BookmarksLimitReachedError: error_message = ugettext_noop( u'You can create up to {max_num_bookmarks_per_course} bookmarks.' u' You must remove some bookmarks before you can add new ones.' ).format( max_num_bookmarks_per_course=settings.MAX_BOOKMARKS_PER_COURSE) log.info(u'Attempted to create more than %s bookmarks', settings.MAX_BOOKMARKS_PER_COURSE) return self.error_response(error_message) return Response(bookmark, status=status.HTTP_201_CREATED)
def post(self, request): """ POST /api/bookmarks/v1/bookmarks/ Request data: {"usage_id": "<usage-id>"} """ if not request.data: return self.error_response(ugettext_noop(u'No data provided.'), DEFAULT_USER_MESSAGE) usage_id = request.data.get('usage_id', None) if not usage_id: return self.error_response(ugettext_noop(u'Parameter usage_id not provided.'), DEFAULT_USER_MESSAGE) try: usage_key = UsageKey.from_string(unquote_slashes(usage_id)) except InvalidKeyError: error_message = ugettext_noop(u'Invalid usage_id: {usage_id}.').format(usage_id=usage_id) log.error(error_message) return self.error_response(error_message, DEFAULT_USER_MESSAGE) try: bookmark = api.create_bookmark(user=self.request.user, usage_key=usage_key) except ItemNotFoundError: error_message = ugettext_noop(u'Block with usage_id: {usage_id} not found.').format(usage_id=usage_id) log.error(error_message) return self.error_response(error_message, DEFAULT_USER_MESSAGE) except BookmarksLimitReachedError: error_message = ugettext_noop( u'You can create up to {max_num_bookmarks_per_course} bookmarks.' u' You must remove some bookmarks before you can add new ones.' ).format(max_num_bookmarks_per_course=settings.MAX_BOOKMARKS_PER_COURSE) log.info( u'Attempted to create more than %s bookmarks', settings.MAX_BOOKMARKS_PER_COURSE ) return self.error_response(error_message) return Response(bookmark, status=status.HTTP_201_CREATED)
def test_inverse(self, test_string): assert test_string == unquote_slashes(quote_slashes(test_string))
def test_inverse(self, test_string): self.assertEquals(test_string, unquote_slashes(quote_slashes(test_string)))