diff --git a/lms/djangoapps/mobile_api/video_outlines/serializers.py b/lms/djangoapps/mobile_api/video_outlines/serializers.py index 76ed9b972e..58b882aee8 100644 --- a/lms/djangoapps/mobile_api/video_outlines/serializers.py +++ b/lms/djangoapps/mobile_api/video_outlines/serializers.py @@ -30,108 +30,17 @@ class BlockOutline(object): self.local_cache['course_videos'] = {} def __iter__(self): + def parent_or_requested_block_type(usage_key): + """ + Returns whether the usage_key's block_type is one of self.block_types or a parent type. + """ + return ( + usage_key.block_type in self.block_types or + usage_key.block_type in BLOCK_TYPES_WITH_CHILDREN + ) + child_to_parent = {} stack = [self.start_block] - - # path should be optional - def path(block): - """path for block""" - block_path = [] - while block in child_to_parent: - block = child_to_parent[block] - if block is not self.start_block: - block_path.append({ - # to be consistent with other edx-platform clients, return the defaulted display name - 'name': block.display_name_with_default, - 'category': block.category, - 'id': unicode(block.location) - }) - return reversed(block_path) - - def find_urls(block): - """ - Find the section and unit urls for a block. - - Returns: - unit_url, section_url: - unit_url (str): The url of a unit - section_url (str): The url of a section - - """ - block_path = [] - while block in child_to_parent: - block = child_to_parent[block] - block_path.append(block) - - block_list = list(reversed(block_path)) - block_count = len(block_list) - - chapter_id = block_list[1].location.block_id if block_count > 1 else None - section = block_list[2] if block_count > 2 else None - position = None - - #position is found traversing the section block - if block_count > 3: - position = 1 - for block in section.children: - if block.name == block_list[3].url_name: - break - position += 1 - - if chapter_id is None: - no_chapter_url = reverse( - "courseware", - kwargs=dict( - course_id=unicode(self.course_id), - ), - request=self.request - ) - return no_chapter_url, no_chapter_url - elif section is None: - no_section_url = reverse( - "courseware_chapter", - kwargs=dict( - course_id=unicode(self.course_id), - chapter=chapter_id - ), - request=self.request - ) - return no_section_url, no_section_url - elif position is None: - no_position_url = reverse( - "courseware_section", - kwargs=dict( - course_id=unicode(self.course_id), - chapter=chapter_id, - section=section.url_name - ), - request=self.request - ) - return no_position_url, no_position_url - else: - section_url = reverse( - "courseware_section", - kwargs=dict( - course_id=unicode(self.course_id), - chapter=chapter_id, - section=section.url_name - ), - request=self.request - ) - unit_url = reverse( - "courseware_position", - kwargs=dict( - course_id=unicode(self.course_id), - chapter=chapter_id, - section=section.url_name, - position=position - ), - request=self.request - ) - return unit_url, section_url - - user = self.request.user - while stack: curr_block = stack.pop() @@ -145,12 +54,12 @@ class BlockOutline(object): continue if curr_block.location.block_type in self.block_types: - if not has_access(user, 'load', curr_block, course_key=self.course_id): + if not has_access(self.request.user, 'load', curr_block, course_key=self.course_id): continue summary_fn = self.block_types[curr_block.category] - block_path = list(path(curr_block)) - unit_url, section_url = find_urls(curr_block) + block_path = list(path(curr_block, child_to_parent, self.start_block)) + unit_url, section_url = find_urls(self.course_id, curr_block, child_to_parent, self.request) yield { "path": block_path, @@ -160,21 +69,78 @@ class BlockOutline(object): "summary": summary_fn(self.course_id, curr_block, self.request, self.local_cache) } - def parent_or_requested_block_type(usage_key): - """ - Returns whether the usage_key's block_type is one of self.block_types or a parent type. - """ - return ( - usage_key.block_type in self.block_types or - usage_key.block_type in BLOCK_TYPES_WITH_CHILDREN - ) - if curr_block.has_children: - for block in reversed(curr_block.get_children(usage_key_filter=parent_or_requested_block_type)): + children = curr_block.get_children(usage_key_filter=parent_or_requested_block_type) + for block in reversed(children): stack.append(block) child_to_parent[block] = curr_block +def path(block, child_to_parent, start_block): + """path for block""" + block_path = [] + while block in child_to_parent: + block = child_to_parent[block] + if block is not start_block: + block_path.append({ + # to be consistent with other edx-platform clients, return the defaulted display name + 'name': block.display_name_with_default, + 'category': block.category, + 'id': unicode(block.location) + }) + return reversed(block_path) + + +def find_urls(course_id, block, child_to_parent, request): + """ + Find the section and unit urls for a block. + + Returns: + unit_url, section_url: + unit_url (str): The url of a unit + section_url (str): The url of a section + + """ + block_path = [] + while block in child_to_parent: + block = child_to_parent[block] + block_path.append(block) + + block_list = list(reversed(block_path)) + block_count = len(block_list) + + chapter_id = block_list[1].location.block_id if block_count > 1 else None + section = block_list[2] if block_count > 2 else None + position = None + + if block_count > 3: + position = 1 + for block in section.children: + if block.name == block_list[3].url_name: + break + position += 1 + + kwargs = {'course_id': unicode(course_id)} + if chapter_id is None: + no_chapter_url = reverse("courseware", kwargs=kwargs, request=request) + return no_chapter_url, no_chapter_url + + kwargs['chapter'] = chapter_id + if section is None: + no_section_url = reverse("courseware_chapter", kwargs=kwargs, request=request) + return no_section_url, no_section_url + + kwargs['section'] = section.url_name + if position is None: + no_position_url = reverse("courseware_section", kwargs=kwargs, request=request) + return no_position_url, no_position_url + + section_url = reverse("courseware_section", kwargs=kwargs, request=request) + kwargs['position'] = position + unit_url = reverse("courseware_position", kwargs=kwargs, request=request) + return unit_url, section_url + + def video_summary(course, course_id, video_descriptor, request, local_cache): """ returns summary dict for the given video module