'See :class: cms.lib.xblock.runtime.EditInfoRuntimeMixin'

@contract(xblock='XBlock')
def get_subtree_edited_on(self, xblock):

    if (not hasattr(xblock, '_subtree_edited_on')):
        block_data = self.module_data[BlockKey.from_usage_key(xblock.location)]
        if (block_data.edit_info._subtree_edited_on is None):
            self._compute_subtree_edited_internal(block_data, xblock.location.course_key)
        xblock._subtree_edited_on = block_data.edit_info._subtree_edited_on
    return xblock._subtree_edited_on
