def add_definitions_children(usage_key, def_key): """ Recursively add any children of the given XBlock usage+definition to usages_found. """ if not does_block_type_support_children(def_key.block_type): return try: xml_node = xml_for_definition(def_key) except: # pylint:disable=bare-except log.exception("Unable to load definition {}".format(def_key)) return for child in xml_node: if child.tag != 'xblock-include': continue try: parsed_include = parse_xblock_include(child) child_usage = usage_for_child_include( usage_key, def_key, parsed_include) child_def_key = definition_for_include( parsed_include, def_key) except BundleFormatException: log.exception( "Unable to parse a child of {}".format(def_key)) continue usages_found[child_usage] = child_def_key add_definitions_children(child_usage, child_def_key)
def get_block_display_name(block_or_key): """ Efficiently get the display name of the specified block. This is done in a way that avoids having to load and parse the block's entire XML field data using its parse_xml() method, which may be very expensive (e.g. the video XBlock parse_xml leads to various slow edxval API calls in some cases). This method also defines and implements various fallback mechanisms in case the ID can't be loaded. block_or_key can be an XBlock instance, a usage key or a definition key. Returns the display name as a string """ def_key = resolve_definition(block_or_key) use_draft = get_xblock_app_config().get_learning_context_params().get('use_draft') cache = BundleCache(def_key.bundle_uuid, draft_name=use_draft) cache_key = ('block_display_name', str(def_key)) display_name = cache.get(cache_key) if display_name is None: # Instead of loading the block, just load its XML and parse it try: olx_node = xml_for_definition(def_key) except Exception: # pylint: disable=broad-except log.exception("Error when trying to get display_name for block definition %s", def_key) # Return now so we don't cache the error result return xblock_type_display_name(def_key.block_type) try: display_name = olx_node.attrib['display_name'] except KeyError: display_name = xblock_type_display_name(def_key.block_type) cache.set(cache_key, display_name) return display_name