Merge pull request #27175 from edx/mikix/bail-early-for-hierarchy

fix: don't count hierarchy blocks as complete for assignments
This commit is contained in:
Michael Terry
2021-03-29 16:35:20 -04:00
committed by GitHub
2 changed files with 23 additions and 0 deletions

View File

@@ -443,3 +443,17 @@ class TestGetCourseAssignments(CompletionWaffleTestMixin, ModuleStoreTestCase):
assignments = get_course_assignments(course.location.context_key, self.user, None)
assert len(assignments) == 1
assert assignments[0].complete
def test_completion_does_not_count_empty_sequentials(self):
"""
Test that we treat a sequential with no content as incomplete.
This can happen with unreleased assignments, for example (start date in future).
"""
course = CourseFactory()
chapter = ItemFactory(parent=course, category='chapter', graded=True, due=datetime.datetime.now())
ItemFactory(parent=chapter, category='sequential')
assignments = get_course_assignments(course.location.context_key, self.user, None)
assert len(assignments) == 1
assert not assignments[0].complete

View File

@@ -214,6 +214,15 @@ def is_block_structure_complete_for_assignments(block_data, block_key):
if children:
return all(is_block_structure_complete_for_assignments(block_data, child_key) for child_key in children)
category = block_data.get_xblock_field(block_key, 'category')
if category in ('course', 'chapter', 'sequential', 'vertical'):
# If there are no children for these "hierarchy" block types, just bail. This could be because the
# content isn't available yet (start date in future) or we're too late and the block has hide_after_due
# set. Or maybe a different transformer cut off content for whatever reason. Regardless of the cause - if the
# user can't see this content and we continue, we might accidentally say this block is complete because it
# isn't scored (which most hierarchy blocks wouldn't be).
return False
complete = block_data.get_xblock_field(block_key, 'complete', False)
graded = block_data.get_xblock_field(block_key, 'graded', False)
has_score = block_data.get_xblock_field(block_key, 'has_score', False)