Add new instructor task for weighted problems
This commit is contained in:
committed by
Diana Huang
parent
9c32b1e878
commit
9269ec3b00
@@ -1,6 +1,7 @@
|
||||
import json
|
||||
import logging
|
||||
|
||||
from collections import OrderedDict
|
||||
from model_utils.models import TimeStampedModel
|
||||
|
||||
from util.models import CompressedTextField
|
||||
@@ -26,6 +27,29 @@ class CourseStructure(TimeStampedModel):
|
||||
return json.loads(self.structure_json)
|
||||
return None
|
||||
|
||||
@property
|
||||
def ordered_blocks(self):
|
||||
if self.structure:
|
||||
ordered_blocks = OrderedDict()
|
||||
self._traverse_tree(self.structure['root'], self.structure['blocks'], ordered_blocks)
|
||||
return ordered_blocks
|
||||
|
||||
def _traverse_tree(self, block, unordered_structure, ordered_blocks, parent=None):
|
||||
"""
|
||||
Traverses the tree and fills in the ordered_blocks OrderedDict with the blocks in
|
||||
the order that they appear in the course.
|
||||
"""
|
||||
# find the dictionary entry for the current node
|
||||
cur_block = unordered_structure[block]
|
||||
|
||||
if parent:
|
||||
cur_block['parent'] = parent
|
||||
|
||||
ordered_blocks[block] = cur_block
|
||||
|
||||
for child_node in cur_block['children']:
|
||||
self._traverse_tree(child_node, unordered_structure, ordered_blocks, parent=block)
|
||||
|
||||
# Signals must be imported in a file that is automatically loaded at app startup (e.g. models.py). We import them
|
||||
# at the end of this file to avoid circular dependencies.
|
||||
import signals # pylint: disable=unused-import
|
||||
|
||||
@@ -91,6 +91,40 @@ class CourseStructureTaskTests(ModuleStoreTestCase):
|
||||
cs = CourseStructure.objects.create(course_id=self.course.id, structure_json=structure_json)
|
||||
self.assertDictEqual(cs.structure, structure)
|
||||
|
||||
|
||||
def test_ordered_blocks(self):
|
||||
structure = {
|
||||
'root': 'a/b/c',
|
||||
'blocks': {
|
||||
'a/b/c': {
|
||||
'id': 'a/b/c',
|
||||
'children': [
|
||||
'g/h/i'
|
||||
]
|
||||
},
|
||||
'd/e/f': {
|
||||
'id': 'd/e/f',
|
||||
'children': []
|
||||
},
|
||||
'g/h/i': {
|
||||
'id': 'h/j/k',
|
||||
'children': [
|
||||
'j/k/l',
|
||||
'd/e/f'
|
||||
]
|
||||
},
|
||||
'j/k/l': {
|
||||
'id': 'j/k/l',
|
||||
'children': []
|
||||
}
|
||||
}
|
||||
}
|
||||
in_order_blocks = ['a/b/c', 'g/h/i', 'j/k/l', 'd/e/f']
|
||||
structure_json = json.dumps(structure)
|
||||
cs = CourseStructure.objects.create(course_id=self.course.id, structure_json=structure_json)
|
||||
|
||||
self.assertEqual(cs.ordered_blocks.keys(), in_order_blocks)
|
||||
|
||||
def test_block_with_missing_fields(self):
|
||||
"""
|
||||
The generator should continue to operate on blocks/XModule that do not have graded or format fields.
|
||||
|
||||
Reference in New Issue
Block a user