def analysis_provenance_details_extractor(impact_report, component_metadata): """Extracting provenance details of layers. This extractor would be the main provenance details extractor which produce tree view provenance details. :param impact_report: the impact report that acts as a proxy to fetch all the data that extractor needed :type impact_report: safe.report.impact_report.ImpactReport :param component_metadata: the component metadata. Used to obtain information about the component we want to render :type component_metadata: safe.report.report_metadata. ReportComponentsMetadata :return: context for rendering phase :rtype: dict .. versionadded:: 4.1 """ context = {} extra_args = component_metadata.extra_args provenance_format_args = resolve_from_dictionary(extra_args, 'provenance_format') keywords_order = [ 'title', 'source', 'layer_purpose', 'layer_geometry', 'hazard', 'exposure', 'hazard_category', 'exposure_unit', 'value_map', 'value_maps', 'inasafe_fields', 'inasafe_default_values', 'layer_mode', 'hazard_layer', 'exposure_layer', 'aggregation_layer', 'keyword_version', 'classification', ] use_rounding = impact_report.impact_function.use_rounding debug_mode = impact_report.impact_function.debug_mode # we define dict here to create a different object of keyword hazard_keywords = dict( impact_report.impact_function.provenance['hazard_keywords']) # hazard_keywords doesn't have hazard_layer path information hazard_layer = QgsDataSourceUri.removePassword( decode_full_layer_uri( impact_report.impact_function.provenance.get( provenance_hazard_layer['provenance_key']))[0]) hazard_keywords['hazard_layer'] = hazard_layer # keep only value maps with IF exposure for keyword in ['value_maps', 'thresholds']: if hazard_keywords.get(keyword): temp_keyword = dict(hazard_keywords[keyword]) for key in temp_keyword: if key not in impact_report.impact_function.provenance[ 'exposure_keywords']['exposure']: del hazard_keywords[keyword][key] header = resolve_from_dictionary(provenance_format_args, 'hazard_header') hazard_provenance = { 'header': header.title(), 'provenances': headerize(sorted_keywords_by_order(hazard_keywords, keywords_order)) } # convert value if there is dict_keywords provenances = hazard_provenance['provenances'] hazard_provenance['provenances'] = resolve_dict_keywords(provenances) # we define dict here to create a different object of keyword exposure_keywords = dict( impact_report.impact_function.provenance['exposure_keywords']) # exposure_keywords doesn't have exposure_layer path information exposure_layer = QgsDataSourceUri.removePassword( decode_full_layer_uri( impact_report.impact_function.provenance.get( provenance_exposure_layer['provenance_key']))[0]) exposure_keywords['exposure_layer'] = exposure_layer header = resolve_from_dictionary(provenance_format_args, 'exposure_header') exposure_provenance = { 'header': header.title(), 'provenances': headerize(sorted_keywords_by_order(exposure_keywords, keywords_order)) } # convert value if there is dict_keywords provenances = exposure_provenance['provenances'] exposure_provenance['provenances'] = resolve_dict_keywords(provenances) # aggregation keywords could be None so we don't define dict here aggregation_keywords = impact_report.impact_function.provenance[ 'aggregation_keywords'] header = resolve_from_dictionary(provenance_format_args, 'aggregation_header') aggregation_provenance = {'header': header.title(), 'provenances': None} # only if aggregation layer used if aggregation_keywords: # we define dict here to create a different object of keyword aggregation_keywords = dict(aggregation_keywords) # aggregation_keywords doesn't have aggregation_layer path information aggregation_layer = QgsDataSourceUri.removePassword( decode_full_layer_uri( impact_report.impact_function.provenance.get( provenance_aggregation_layer['provenance_key']))[0]) aggregation_keywords['aggregation_layer'] = aggregation_layer aggregation_provenance['provenances'] = headerize( sorted_keywords_by_order(aggregation_keywords, keywords_order)) # convert value if there is dict_keywords provenances = aggregation_provenance['provenances'] aggregation_provenance['provenances'] = resolve_dict_keywords( provenances) else: aggregation_not_used = resolve_from_dictionary( extra_args, ['defaults', 'aggregation_not_used']) aggregation_provenance['provenances'] = aggregation_not_used all_provenance_keywords = dict(impact_report.impact_function.provenance) # we add debug mode information to the provenance all_provenance_keywords[provenance_use_rounding['provenance_key']] = ( 'On' if use_rounding else 'Off') all_provenance_keywords['debug_mode'] = 'On' if debug_mode else 'Off' header = resolve_from_dictionary(provenance_format_args, 'analysis_environment_header') analysis_environment_provenance_items = OrderedDict() analysis_environment_provenance_keys = [ 'os', 'inasafe_version', provenance_use_rounding['provenance_key'], 'debug_mode', 'qgis_version', 'qt_version', 'gdal_version', 'pyqt_version' ] for item in analysis_environment_provenance_keys: analysis_environment_provenance_items[item] = ( all_provenance_keywords[item]) analysis_environment_provenance = { 'header': header.title(), 'provenances': headerize(analysis_environment_provenance_items) } impact_function_name = impact_report.impact_function.name header = resolve_from_dictionary(provenance_format_args, 'impact_function_header') impact_function_provenance = { 'header': header.title(), 'provenances': impact_function_name } provenance_detail = OrderedDict() provenance_detail['impact_function'] = impact_function_provenance provenance_detail['hazard'] = hazard_provenance provenance_detail['exposure'] = exposure_provenance provenance_detail['aggregation'] = aggregation_provenance provenance_detail['analysis_environment'] = analysis_environment_provenance analysis_details_header = resolve_from_dictionary( extra_args, ['header', 'analysis_detail']) context['component_key'] = component_metadata.key context.update({ 'header': analysis_details_header, 'details': provenance_detail }) return context
def analysis_provenance_details_simplified_extractor(impact_report, component_metadata): """Extracting simplified version of provenance details of layers. This extractor will produce provenance details which will be displayed in the main report. :param impact_report: the impact report that acts as a proxy to fetch all the data that extractor needed :type impact_report: safe.report.impact_report.ImpactReport :param component_metadata: the component metadata. Used to obtain information about the component we want to render :type component_metadata: safe.report.report_metadata. ReportComponentsMetadata :return: context for rendering phase :rtype: dict .. versionadded:: 4.0 """ context = {} extra_args = component_metadata.extra_args default_source = resolve_from_dictionary(extra_args, ['defaults', 'source']) default_reference = resolve_from_dictionary(extra_args, ['defaults', 'reference']) provenance_format_args = resolve_from_dictionary(extra_args, 'provenance_format') hazard_keywords = impact_report.impact_function.provenance[ 'hazard_keywords'] header = resolve_from_dictionary(provenance_format_args, 'hazard_header') provenance_format = resolve_from_dictionary(provenance_format_args, 'hazard_format') hazard_provenance = { 'header': header, 'provenance': provenance_format.format( layer_name=hazard_keywords.get('title'), source=QgsDataSourceUri.removePassword( decode_full_layer_uri(hazard_keywords.get('source'))[0] or default_source)) } exposure_keywords = impact_report.impact_function.provenance[ 'exposure_keywords'] header = resolve_from_dictionary(provenance_format_args, 'exposure_header') provenance_format = resolve_from_dictionary(provenance_format_args, 'exposure_format') exposure_provenance = { 'header': header, 'provenance': provenance_format.format( layer_name=exposure_keywords.get('title'), source=QgsDataSourceUri.removePassword( decode_full_layer_uri(exposure_keywords.get('source'))[0] or default_source)) } aggregation_keywords = impact_report.impact_function.provenance[ 'aggregation_keywords'] header = resolve_from_dictionary(provenance_format_args, 'aggregation_header') provenance_format = resolve_from_dictionary(provenance_format_args, 'aggregation_format') # only if aggregation layer used if aggregation_keywords: provenance_string = provenance_format.format( layer_name=aggregation_keywords.get('title'), source=QgsDataSourceUri.removePassword( decode_full_layer_uri(aggregation_keywords.get('source'))[0] or default_source)) else: aggregation_not_used = resolve_from_dictionary( extra_args, ['defaults', 'aggregation_not_used']) provenance_string = aggregation_not_used aggregation_provenance = { 'header': header, 'provenance': provenance_string } impact_function_name = impact_report.impact_function.name header = resolve_from_dictionary(provenance_format_args, 'impact_function_header') provenance_format = resolve_from_dictionary(provenance_format_args, 'impact_function_format') impact_function_provenance = { 'header': header, 'provenance': provenance_format.format(impact_function_name=impact_function_name, reference=default_reference) } provenance_detail = OrderedDict() provenance_detail['hazard'] = hazard_provenance provenance_detail['exposure'] = exposure_provenance provenance_detail['aggregation'] = aggregation_provenance provenance_detail['impact_function'] = impact_function_provenance analysis_details_header = resolve_from_dictionary( extra_args, ['header', 'analysis_detail']) context['component_key'] = component_metadata.key context.update({ 'header': analysis_details_header, 'details': provenance_detail }) return context
def publicUri(self): publicUri = QgsDataSourceUri.removePassword(self._uri.uri(False)) return QgsDataSourceUri(publicUri)
def analysis_provenance_details_extractor(impact_report, component_metadata): """Extracting provenance details of layers. This extractor would be the main provenance details extractor which produce tree view provenance details. :param impact_report: the impact report that acts as a proxy to fetch all the data that extractor needed :type impact_report: safe.report.impact_report.ImpactReport :param component_metadata: the component metadata. Used to obtain information about the component we want to render :type component_metadata: safe.report.report_metadata. ReportComponentsMetadata :return: context for rendering phase :rtype: dict .. versionadded:: 4.1 """ context = {} extra_args = component_metadata.extra_args provenance_format_args = resolve_from_dictionary( extra_args, 'provenance_format') keywords_order = [ 'title', 'source', 'layer_purpose', 'layer_geometry', 'hazard', 'exposure', 'hazard_category', 'exposure_unit', 'value_map', 'value_maps', 'inasafe_fields', 'inasafe_default_values', 'layer_mode', 'hazard_layer', 'exposure_layer', 'aggregation_layer', 'keyword_version', 'classification', ] use_rounding = impact_report.impact_function.use_rounding debug_mode = impact_report.impact_function.debug_mode # we define dict here to create a different object of keyword hazard_keywords = dict(impact_report.impact_function.provenance[ 'hazard_keywords']) # hazard_keywords doesn't have hazard_layer path information hazard_layer = QgsDataSourceUri.removePassword( decode_full_layer_uri( impact_report.impact_function.provenance.get( provenance_hazard_layer['provenance_key']))[0]) hazard_keywords['hazard_layer'] = hazard_layer # keep only value maps with IF exposure for keyword in ['value_maps', 'thresholds']: if hazard_keywords.get(keyword): temp_keyword = dict(hazard_keywords[keyword]) for key in temp_keyword: if key not in impact_report.impact_function.provenance[ 'exposure_keywords']['exposure']: del hazard_keywords[keyword][key] header = resolve_from_dictionary( provenance_format_args, 'hazard_header') hazard_provenance = { 'header': header.title(), 'provenances': headerize( sorted_keywords_by_order(hazard_keywords, keywords_order)) } # convert value if there is dict_keywords provenances = hazard_provenance['provenances'] hazard_provenance['provenances'] = resolve_dict_keywords(provenances) # we define dict here to create a different object of keyword exposure_keywords = dict(impact_report.impact_function.provenance[ 'exposure_keywords']) # exposure_keywords doesn't have exposure_layer path information exposure_layer = QgsDataSourceUri.removePassword( decode_full_layer_uri( impact_report.impact_function.provenance.get( provenance_exposure_layer['provenance_key']))[0]) exposure_keywords['exposure_layer'] = exposure_layer header = resolve_from_dictionary( provenance_format_args, 'exposure_header') exposure_provenance = { 'header': header.title(), 'provenances': headerize( sorted_keywords_by_order(exposure_keywords, keywords_order)) } # convert value if there is dict_keywords provenances = exposure_provenance['provenances'] exposure_provenance['provenances'] = resolve_dict_keywords(provenances) # aggregation keywords could be None so we don't define dict here aggregation_keywords = impact_report.impact_function.provenance[ 'aggregation_keywords'] header = resolve_from_dictionary( provenance_format_args, 'aggregation_header') aggregation_provenance = { 'header': header.title(), 'provenances': None } # only if aggregation layer used if aggregation_keywords: # we define dict here to create a different object of keyword aggregation_keywords = dict(aggregation_keywords) # aggregation_keywords doesn't have aggregation_layer path information aggregation_layer = QgsDataSourceUri.removePassword( decode_full_layer_uri( impact_report.impact_function.provenance.get( provenance_aggregation_layer['provenance_key']))[0]) aggregation_keywords['aggregation_layer'] = aggregation_layer aggregation_provenance['provenances'] = headerize( sorted_keywords_by_order(aggregation_keywords, keywords_order)) # convert value if there is dict_keywords provenances = aggregation_provenance['provenances'] aggregation_provenance['provenances'] = resolve_dict_keywords( provenances) else: aggregation_not_used = resolve_from_dictionary( extra_args, ['defaults', 'aggregation_not_used']) aggregation_provenance['provenances'] = aggregation_not_used all_provenance_keywords = dict(impact_report.impact_function.provenance) # we add debug mode information to the provenance all_provenance_keywords[ provenance_use_rounding['provenance_key']] = ( 'On' if use_rounding else 'Off') all_provenance_keywords['debug_mode'] = 'On' if debug_mode else 'Off' header = resolve_from_dictionary( provenance_format_args, 'analysis_environment_header') analysis_environment_provenance_items = OrderedDict() analysis_environment_provenance_keys = [ 'os', 'inasafe_version', provenance_use_rounding['provenance_key'], 'debug_mode', 'qgis_version', 'qt_version', 'gdal_version', 'pyqt_version'] for item in analysis_environment_provenance_keys: analysis_environment_provenance_items[item] = ( all_provenance_keywords[item]) analysis_environment_provenance = { 'header': header.title(), 'provenances': headerize(analysis_environment_provenance_items) } impact_function_name = impact_report.impact_function.name header = resolve_from_dictionary( provenance_format_args, 'impact_function_header') impact_function_provenance = { 'header': header.title(), 'provenances': impact_function_name } provenance_detail = OrderedDict() provenance_detail['impact_function'] = impact_function_provenance provenance_detail['hazard'] = hazard_provenance provenance_detail['exposure'] = exposure_provenance provenance_detail['aggregation'] = aggregation_provenance provenance_detail['analysis_environment'] = analysis_environment_provenance analysis_details_header = resolve_from_dictionary( extra_args, ['header', 'analysis_detail']) context['component_key'] = component_metadata.key context.update({ 'header': analysis_details_header, 'details': provenance_detail }) return context
def analysis_provenance_details_simplified_extractor( impact_report, component_metadata): """Extracting simplified version of provenance details of layers. This extractor will produce provenance details which will be displayed in the main report. :param impact_report: the impact report that acts as a proxy to fetch all the data that extractor needed :type impact_report: safe.report.impact_report.ImpactReport :param component_metadata: the component metadata. Used to obtain information about the component we want to render :type component_metadata: safe.report.report_metadata. ReportComponentsMetadata :return: context for rendering phase :rtype: dict .. versionadded:: 4.0 """ context = {} extra_args = component_metadata.extra_args default_source = resolve_from_dictionary( extra_args, ['defaults', 'source']) default_reference = resolve_from_dictionary( extra_args, ['defaults', 'reference']) provenance_format_args = resolve_from_dictionary( extra_args, 'provenance_format') hazard_keywords = impact_report.impact_function.provenance[ 'hazard_keywords'] header = resolve_from_dictionary( provenance_format_args, 'hazard_header') provenance_format = resolve_from_dictionary( provenance_format_args, 'hazard_format') hazard_provenance = { 'header': header, 'provenance': provenance_format.format( layer_name=hazard_keywords.get('title'), source=QgsDataSourceUri.removePassword( decode_full_layer_uri(hazard_keywords.get('source'))[0] or default_source)) } exposure_keywords = impact_report.impact_function.provenance[ 'exposure_keywords'] header = resolve_from_dictionary( provenance_format_args, 'exposure_header') provenance_format = resolve_from_dictionary( provenance_format_args, 'exposure_format') exposure_provenance = { 'header': header, 'provenance': provenance_format.format( layer_name=exposure_keywords.get('title'), source=QgsDataSourceUri.removePassword( decode_full_layer_uri(exposure_keywords.get('source'))[0] or default_source)) } aggregation_keywords = impact_report.impact_function.provenance[ 'aggregation_keywords'] header = resolve_from_dictionary( provenance_format_args, 'aggregation_header') provenance_format = resolve_from_dictionary( provenance_format_args, 'aggregation_format') # only if aggregation layer used if aggregation_keywords: provenance_string = provenance_format.format( layer_name=aggregation_keywords.get('title'), source=QgsDataSourceUri.removePassword( decode_full_layer_uri(aggregation_keywords.get('source'))[0] or default_source)) else: aggregation_not_used = resolve_from_dictionary( extra_args, ['defaults', 'aggregation_not_used']) provenance_string = aggregation_not_used aggregation_provenance = { 'header': header, 'provenance': provenance_string } impact_function_name = impact_report.impact_function.name header = resolve_from_dictionary( provenance_format_args, 'impact_function_header') provenance_format = resolve_from_dictionary( provenance_format_args, 'impact_function_format') impact_function_provenance = { 'header': header, 'provenance': provenance_format.format( impact_function_name=impact_function_name, reference=default_reference) } provenance_detail = OrderedDict() provenance_detail['hazard'] = hazard_provenance provenance_detail['exposure'] = exposure_provenance provenance_detail['aggregation'] = aggregation_provenance provenance_detail['impact_function'] = impact_function_provenance analysis_details_header = resolve_from_dictionary( extra_args, ['header', 'analysis_detail']) context['component_key'] = component_metadata.key context.update({ 'header': analysis_details_header, 'details': provenance_detail }) return context