'Recurse the subtree finding the max edited_on date and its corresponding edited_by. Cache it.'

@contract(block_data='BlockData')
def _compute_subtree_edited_internal(self, block_data, course_key):

    max_date = block_data.edit_info.edited_on
    max_date_by = block_data.edit_info.edited_by
    for child in block_data.fields.get('children', []):
        child_data = self.get_module_data(BlockKey(*child), course_key)
        if (block_data.edit_info._subtree_edited_on is None):
            self._compute_subtree_edited_internal(child_data, course_key)
        if (child_data.edit_info._subtree_edited_on > max_date):
            max_date = child_data.edit_info._subtree_edited_on
            max_date_by = child_data.edit_info._subtree_edited_by
    block_data.edit_info._subtree_edited_on = max_date
    block_data.edit_info._subtree_edited_by = max_date_by
