Fix Next Button's 404 error
MA-2305
This commit is contained in:
@@ -251,7 +251,7 @@ class @Sequence
|
||||
tab_count: @num_contents
|
||||
widget_placement: widget_placement
|
||||
|
||||
if (direction == 'next') and (@position == @contents.length)
|
||||
if (direction == 'next') and (@position >= @contents.length)
|
||||
window.location.href = @nextUrl
|
||||
else if (direction == 'previous') and (@position == 1)
|
||||
window.location.href = @prevUrl
|
||||
|
||||
@@ -176,7 +176,7 @@ class SequenceModule(SequenceFields, ProctoringFields, XModule):
|
||||
if context.get('requested_child') == 'first':
|
||||
self.position = 1
|
||||
elif context.get('requested_child') == 'last':
|
||||
self.position = len(display_items) or None
|
||||
self.position = len(display_items) or 1
|
||||
elif self.position is None or self.position > len(display_items):
|
||||
self.position = 1
|
||||
|
||||
@@ -237,16 +237,8 @@ class SequenceModule(SequenceFields, ProctoringFields, XModule):
|
||||
'position': self.position,
|
||||
'tag': self.location.category,
|
||||
'ajax_url': self.system.ajax_url,
|
||||
'next_url': _compute_next_url(
|
||||
self.location,
|
||||
parent_module,
|
||||
context.get('redirect_url_func'),
|
||||
),
|
||||
'prev_url': _compute_previous_url(
|
||||
self.location,
|
||||
parent_module,
|
||||
context.get('redirect_url_func'),
|
||||
),
|
||||
'next_url': context.get('next_url'),
|
||||
'prev_url': context.get('prev_url'),
|
||||
}
|
||||
|
||||
fragment.add_content(self.system.render_template("seq_module.html", params))
|
||||
@@ -455,88 +447,3 @@ class SequenceDescriptor(SequenceFields, ProctoringFields, MakoModuleDescriptor,
|
||||
xblock_body["content_type"] = "Sequence"
|
||||
|
||||
return xblock_body
|
||||
|
||||
|
||||
def _compute_next_url(block_location, parent_block, redirect_url_func):
|
||||
"""
|
||||
Returns the url for the next block after the given block.
|
||||
"""
|
||||
def get_next_block_location(parent_block, index_in_parent):
|
||||
"""
|
||||
Returns the next block in the parent_block after the block with the given
|
||||
index_in_parent.
|
||||
"""
|
||||
if index_in_parent + 1 < len(parent_block.children):
|
||||
return parent_block.children[index_in_parent + 1]
|
||||
else:
|
||||
return None
|
||||
|
||||
return _compute_next_or_prev_url(
|
||||
block_location,
|
||||
parent_block,
|
||||
redirect_url_func,
|
||||
get_next_block_location,
|
||||
'first',
|
||||
)
|
||||
|
||||
|
||||
def _compute_previous_url(block_location, parent_block, redirect_url_func):
|
||||
"""
|
||||
Returns the url for the previous block after the given block.
|
||||
"""
|
||||
def get_previous_block_location(parent_block, index_in_parent):
|
||||
"""
|
||||
Returns the previous block in the parent_block before the block with the given
|
||||
index_in_parent.
|
||||
"""
|
||||
return parent_block.children[index_in_parent - 1] if index_in_parent else None
|
||||
|
||||
return _compute_next_or_prev_url(
|
||||
block_location,
|
||||
parent_block,
|
||||
redirect_url_func,
|
||||
get_previous_block_location,
|
||||
'last',
|
||||
)
|
||||
|
||||
|
||||
def _compute_next_or_prev_url(
|
||||
block_location,
|
||||
parent_block,
|
||||
redirect_url_func,
|
||||
get_next_or_prev_block,
|
||||
redirect_url_child_param,
|
||||
):
|
||||
"""
|
||||
Returns the url for the next or previous block from the given block.
|
||||
|
||||
Arguments:
|
||||
block_location: Location of the block that is being navigated.
|
||||
parent_block: Parent block of the given block.
|
||||
redirect_url_func: Function that computes a redirect URL directly to
|
||||
a block, given the block's location.
|
||||
get_next_or_prev_block: Function that returns the next or previous
|
||||
block in the parent, or None if doesn't exist.
|
||||
redirect_url_child_param: Value to pass for the child parameter to the
|
||||
redirect_url_func.
|
||||
"""
|
||||
if redirect_url_func:
|
||||
index_in_parent = parent_block.children.index(block_location)
|
||||
next_or_prev_block_location = get_next_or_prev_block(parent_block, index_in_parent)
|
||||
if next_or_prev_block_location:
|
||||
return redirect_url_func(
|
||||
block_location.course_key,
|
||||
next_or_prev_block_location,
|
||||
child=redirect_url_child_param,
|
||||
)
|
||||
else:
|
||||
grandparent = parent_block.get_parent()
|
||||
if grandparent:
|
||||
return _compute_next_or_prev_url(
|
||||
parent_block.location,
|
||||
grandparent,
|
||||
redirect_url_func,
|
||||
get_next_or_prev_block,
|
||||
redirect_url_child_param,
|
||||
)
|
||||
return None
|
||||
|
||||
@@ -8,7 +8,7 @@ from xmodule.tests import get_test_system
|
||||
from xmodule.tests.xml import XModuleXmlImportTest
|
||||
from xmodule.tests.xml import factories as xml
|
||||
from xmodule.x_module import STUDENT_VIEW
|
||||
from xmodule.seq_module import _compute_next_url, _compute_previous_url, SequenceModule
|
||||
from xmodule.seq_module import SequenceModule
|
||||
|
||||
|
||||
class StubUserService(UserService):
|
||||
@@ -96,11 +96,16 @@ class SequenceBlockTestCase(XModuleXmlImportTest):
|
||||
self.assertEquals(seq_module.position, 2) # matches position set in the runtime
|
||||
|
||||
def test_render_student_view(self):
|
||||
html = self._get_rendered_student_view(self.sequence_3_1, requested_child=None)
|
||||
html = self._get_rendered_student_view(
|
||||
self.sequence_3_1,
|
||||
requested_child=None,
|
||||
next_url='NextSequential',
|
||||
prev_url='PrevSequential'
|
||||
)
|
||||
self._assert_view_at_position(html, expected_position=1)
|
||||
self.assertIn(unicode(self.sequence_3_1.location), html)
|
||||
self.assertIn("'next_url': u'{}'".format(unicode(self.chapter_4.location)), html)
|
||||
self.assertIn("'prev_url': u'{}'".format(unicode(self.chapter_2.location)), html)
|
||||
self.assertIn("'next_url': 'NextSequential'", html)
|
||||
self.assertIn("'prev_url': 'PrevSequential'", html)
|
||||
|
||||
def test_student_view_first_child(self):
|
||||
html = self._get_rendered_student_view(self.sequence_3_1, requested_child='first')
|
||||
@@ -110,7 +115,7 @@ class SequenceBlockTestCase(XModuleXmlImportTest):
|
||||
html = self._get_rendered_student_view(self.sequence_3_1, requested_child='last')
|
||||
self._assert_view_at_position(html, expected_position=3)
|
||||
|
||||
def _get_rendered_student_view(self, sequence, requested_child):
|
||||
def _get_rendered_student_view(self, sequence, requested_child, next_url=None, prev_url=None):
|
||||
"""
|
||||
Returns the rendered student view for the given sequence and the
|
||||
requested_child parameter.
|
||||
@@ -119,8 +124,9 @@ class SequenceBlockTestCase(XModuleXmlImportTest):
|
||||
sequence,
|
||||
STUDENT_VIEW,
|
||||
{
|
||||
'redirect_url_func': lambda course_key, block_location, child: unicode(block_location),
|
||||
'requested_child': requested_child,
|
||||
'next_url': next_url,
|
||||
'prev_url': prev_url,
|
||||
},
|
||||
).content
|
||||
|
||||
@@ -130,38 +136,6 @@ class SequenceBlockTestCase(XModuleXmlImportTest):
|
||||
"""
|
||||
self.assertIn("'position': {}".format(expected_position), rendered_html)
|
||||
|
||||
def test_compute_next_url(self):
|
||||
|
||||
for sequence, parent, expected_next_sequence_location in [
|
||||
(self.sequence_1_1, self.chapter_1, self.sequence_1_2.location),
|
||||
(self.sequence_1_2, self.chapter_1, self.chapter_2.location),
|
||||
(self.sequence_3_1, self.chapter_3, self.chapter_4.location),
|
||||
(self.sequence_4_1, self.chapter_4, self.sequence_4_2.location),
|
||||
(self.sequence_4_2, self.chapter_4, None),
|
||||
]:
|
||||
actual_next_sequence_location = _compute_next_url(
|
||||
sequence.location,
|
||||
parent,
|
||||
lambda course_key, block_location, child: block_location,
|
||||
)
|
||||
self.assertEquals(actual_next_sequence_location, expected_next_sequence_location)
|
||||
|
||||
def test_compute_previous_url(self):
|
||||
|
||||
for sequence, parent, expected_prev_sequence_location in [
|
||||
(self.sequence_1_1, self.chapter_1, None),
|
||||
(self.sequence_1_2, self.chapter_1, self.sequence_1_1.location),
|
||||
(self.sequence_3_1, self.chapter_3, self.chapter_2.location),
|
||||
(self.sequence_4_1, self.chapter_4, self.chapter_3.location),
|
||||
(self.sequence_4_2, self.chapter_4, self.sequence_4_1.location),
|
||||
]:
|
||||
actual_next_sequence_location = _compute_previous_url(
|
||||
sequence.location,
|
||||
parent,
|
||||
lambda course_key, block_location, child: block_location,
|
||||
)
|
||||
self.assertEquals(actual_next_sequence_location, expected_prev_sequence_location)
|
||||
|
||||
def test_tooltip(self):
|
||||
html = self._get_rendered_student_view(self.sequence_3_1, requested_child=None)
|
||||
for child in self.sequence_3_1.children:
|
||||
|
||||
Reference in New Issue
Block a user