Mobile API: Modularize VideoOutline code
This commit is contained in:
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user