def test_update_template_component(self): """Test for custom template component.""" # Default qpt component = update_template_component(map_report, '.') self.assertDictEqual(component, map_report) # Custom qpt target_directory = mkdtemp() default_qpt = resources_path('qgis-composer-templates', 'inasafe-map-report-portrait.qpt') if exists(default_qpt): target_path = join(target_directory, split(default_qpt)[1]) shutil.copy2(default_qpt, target_path) component = update_template_component(map_report, target_directory) self.assertTrue(component != map_report)
def test_update_template_component(self): """Test for custom template component.""" # Default qpt component = update_template_component(map_report, '.') self.assertDictEqual(component, map_report) # Custom qpt target_directory = mkdtemp() default_qpt = resources_path( 'qgis-composer-templates', 'inasafe-map-report-portrait.qpt') if exists(default_qpt): target_path = join(target_directory, split(default_qpt)[1]) shutil.copy2(default_qpt, target_path) component = update_template_component(map_report, target_directory) self.assertTrue(component != map_report)
def generate_impact_map_report(impact_function, iface): """Generate impact map pdf from impact function. :param impact_function: The impact function used. :type impact_function: ImpactFunction :param iface: QGIS QGisAppInterface instance. :type iface: QGisAppInterface """ # get the extra layers that we need extra_layers = [] print_atlas = setting('print_atlas_report', False, bool) if print_atlas: extra_layers.append(impact_function.aggregation_summary) # get the hazard and exposure type hazard_layer = impact_function.hazard exposure_layer = impact_function.exposure hazard_type = layer_definition_type(hazard_layer) exposure_type = layer_definition_type(exposure_layer) # create impact report instance report_metadata = ReportMetadata(metadata_dict=update_template_component( component=map_report, hazard=hazard_type, exposure=exposure_type)) impact_report = ImpactReport(iface, report_metadata, impact_function=impact_function, extra_layers=extra_layers) # Get other setting logo_path = setting('organisation_logo_path', None, str) impact_report.inasafe_context.organisation_logo = logo_path disclaimer_text = setting('reportDisclaimer', None, str) impact_report.inasafe_context.disclaimer = disclaimer_text north_arrow_path = setting('north_arrow_path', None, str) impact_report.inasafe_context.north_arrow = north_arrow_path # get the extent of impact layer impact_report.qgis_composition_context.extent = \ impact_function.impact.extent() # generate report folder # no other option for now # TODO: retrieve the information from data store if isinstance(impact_function.datastore.uri, QDir): layer_dir = impact_function.datastore.uri.absolutePath() else: # No other way for now return # We will generate it on the fly without storing it after datastore # supports impact_report.output_folder = os.path.join(layer_dir, 'output') return impact_report.process_components()
def generate_pdf_report(self, impact_function, iface, scenario_name): """Generate and store map and impact report from impact function. Directory where the report stored is specified by user input from the dialog. This function is adapted from analysis_utilities.py :param impact_function: Impact Function. :type impact_function: ImpactFunction() :param iface: iface. :type iface: iface :param scenario_name: name of the scenario :type scenario_name: str """ # output folder output_dir = self.output_directory.text() file_path = os.path.join(output_dir, scenario_name) # create impact table report instance table_report_metadata = ReportMetadata( metadata_dict=standard_impact_report_metadata_pdf) impact_table_report = ImpactReport( iface, table_report_metadata, impact_function=impact_function) impact_table_report.output_folder = file_path impact_table_report.process_components() # create impact map report instance map_report_metadata = ReportMetadata( metadata_dict=update_template_component(map_report)) impact_map_report = ImpactReport( iface, map_report_metadata, impact_function=impact_function) # TODO: Get from settings file # get the extent of impact layer impact_map_report.qgis_composition_context.extent = \ impact_function.impact.extent() impact_map_report.output_folder = file_path impact_map_report.process_components()
def generate_pdf_report(self, impact_function, iface, scenario_name): """Generate and store map and impact report from impact function. Directory where the report stored is specified by user input from the dialog. This function is adapted from analysis_utilities.py :param impact_function: Impact Function. :type impact_function: ImpactFunction() :param iface: iface. :type iface: iface :param scenario_name: name of the scenario :type scenario_name: str """ # output folder output_dir = self.output_directory.text() file_path = os.path.join(output_dir, scenario_name) # create impact table report instance table_report_metadata = ReportMetadata( metadata_dict=standard_impact_report_metadata_pdf) impact_table_report = ImpactReport( iface, table_report_metadata, impact_function=impact_function) impact_table_report.output_folder = file_path impact_table_report.process_components() # create impact map report instance map_report_metadata = ReportMetadata( metadata_dict=update_template_component(map_report)) impact_map_report = ImpactReport( iface, map_report_metadata, impact_function=impact_function) # TODO: Get from settings file # get the extent of impact layer impact_map_report.qgis_composition_context.extent = \ impact_function.impact.extent() impact_map_report.output_folder = file_path impact_map_report.process_components()
def generate_infographic_report(impact_function, iface): """Generate impact map pdf from impact function. :param impact_function: The impact function used. :type impact_function: ImpactFunction :param iface: QGIS QGisAppInterface instance. :type iface: QGisAppInterface """ # get the extra layers that we need extra_layers = [] print_atlas = setting('print_atlas_report', False, bool) if print_atlas: extra_layers.append(impact_function.aggregation_summary) # create impact report instance report_metadata = ReportMetadata( metadata_dict=update_template_component(infographic_report)) impact_report = ImpactReport( iface, report_metadata, impact_function=impact_function, extra_layers=extra_layers) # get the extent of impact layer impact_report.qgis_composition_context.extent = \ impact_function.impact.extent() # generate report folder # no other option for now # TODO: retrieve the information from data store if isinstance(impact_function.datastore.uri, QDir): layer_dir = impact_function.datastore.uri.absolutePath() else: # No other way for now return # We will generate it on the fly without storing it after datastore # supports impact_report.output_folder = os.path.join(layer_dir, 'output') return impact_report.process_components()
def generate_infographic_report(impact_function, iface): """Generate impact map pdf from impact function. :param impact_function: The impact function used. :type impact_function: ImpactFunction :param iface: QGIS QGisAppInterface instance. :type iface: QGisAppInterface """ # get the extra layers that we need extra_layers = [] print_atlas = setting('print_atlas_report', False, bool) if print_atlas: extra_layers.append(impact_function.aggregation_summary) # create impact report instance report_metadata = ReportMetadata( metadata_dict=update_template_component(infographic_report)) impact_report = ImpactReport( iface, report_metadata, impact_function=impact_function, extra_layers=extra_layers) # get the extent of impact layer impact_report.qgis_composition_context.extent = \ impact_function.impact.extent() # generate report folder # no other option for now # TODO: retrieve the information from data store if isinstance(impact_function.datastore.uri, QDir): layer_dir = impact_function.datastore.uri.absolutePath() else: # No other way for now return # We will generate it on the fly without storing it after datastore # supports impact_report.output_folder = os.path.join(layer_dir, 'output') return impact_report.process_components()
def generate_impact_map_report(cli_arguments, impact_function, iface): """Generate impact map pdf from impact function. :param cli_arguments: User inputs. :type cli_arguments: CommandLineArguments :param impact_function: The impact function used. :type impact_function: ImpactFunction :param iface: QGIS QGisAppInterface instance. :type iface: QGisAppInterface .. versionadded:: 4.0 """ layers = [impact_function.hazard, impact_function.exposure] aggregation_layer = impact_function.aggregation if aggregation_layer: layers.append(aggregation_layer) layer_registry = QgsMapLayerRegistry.instance() layer_registry.addMapLayers(layers) layer_registry.addMapLayers(impact_function.outputs) # create impact report instance report_metadata = ReportMetadata( metadata_dict=update_template_component(map_report) ) impact_report = ImpactReport( iface, report_metadata, impact_function=impact_function) # get the extent of impact layer impact_report.qgis_composition_context.extent = \ impact_function.impact.extent() # set the ouput folder impact_report.output_folder = cli_arguments.output_dir return impact_report.process_components()
def generate_impact_map_report(impact_function, iface): """Generate impact map pdf from impact function. :param impact_function: The impact function used. :type impact_function: ImpactFunction :param iface: QGIS QGisAppInterface instance. :type iface: QGisAppInterface """ # get the extra layers that we need extra_layers = [] print_atlas = setting('print_atlas_report', False, bool) if print_atlas: extra_layers.append(impact_function.aggregation_summary) # get the hazard and exposure type hazard_layer = impact_function.hazard exposure_layer = impact_function.exposure hazard_type = layer_definition_type(hazard_layer) exposure_type = layer_definition_type(exposure_layer) # create impact report instance report_metadata = ReportMetadata( metadata_dict=update_template_component( component=map_report, hazard=hazard_type, exposure=exposure_type)) impact_report = ImpactReport( iface, report_metadata, impact_function=impact_function, extra_layers=extra_layers) # Get other setting logo_path = setting('organisation_logo_path', None, str) impact_report.inasafe_context.organisation_logo = logo_path disclaimer_text = setting('reportDisclaimer', None, str) impact_report.inasafe_context.disclaimer = disclaimer_text north_arrow_path = setting('north_arrow_path', None, str) impact_report.inasafe_context.north_arrow = north_arrow_path # get the extent of impact layer impact_report.qgis_composition_context.extent = \ impact_function.impact.extent() # generate report folder # no other option for now # TODO: retrieve the information from data store if isinstance(impact_function.datastore.uri, QDir): layer_dir = impact_function.datastore.uri.absolutePath() else: # No other way for now return # We will generate it on the fly without storing it after datastore # supports impact_report.output_folder = os.path.join(layer_dir, 'output') return impact_report.process_components()
def prepare_components(self): """Prepare components that are going to be generated based on user options. :return: Updated list of components. :rtype: dict """ # Register the components based on user option # First, tabular report generated_components = deepcopy(all_default_report_components) # Rohmat: I need to define the definitions here, I can't get # the definition using definition helper method. component_definitions = { impact_report_pdf_component['key']: impact_report_pdf_component, action_checklist_pdf_component['key']: action_checklist_pdf_component, analysis_provenance_details_pdf_component['key']: analysis_provenance_details_pdf_component, infographic_report['key']: infographic_report } duplicated_report_metadata = None for key, checkbox in list(self.all_checkboxes.items()): if not checkbox.isChecked(): component = component_definitions[key] if component in generated_components: generated_components.remove(component) continue if self.is_multi_exposure: impact_report_metadata = ( standard_multi_exposure_impact_report_metadata_pdf) else: impact_report_metadata = ( standard_impact_report_metadata_pdf) if component in impact_report_metadata['components']: if not duplicated_report_metadata: duplicated_report_metadata = deepcopy( impact_report_metadata) duplicated_report_metadata['components'].remove( component) if impact_report_metadata in generated_components: generated_components.remove( impact_report_metadata) generated_components.append( duplicated_report_metadata) # Second, custom and map report # Get selected template path to use selected_template_path = None if self.search_directory_radio.isChecked(): selected_template_path = self.template_combo.itemData( self.template_combo.currentIndex()) elif self.search_on_disk_radio.isChecked(): selected_template_path = self.template_path.text() if not exists(selected_template_path): # noinspection PyCallByClass,PyTypeChecker QtWidgets.QMessageBox.warning( self, tr('InaSAFE'), tr( 'Please select a valid template before printing. ' 'The template you choose does not exist.')) if map_report in generated_components: # if self.no_map_radio.isChecked(): # generated_components.remove(map_report) if self.default_template_radio.isChecked(): # make sure map report is there generated_components.append( generated_components.pop( generated_components.index(map_report))) elif self.override_template_radio.isChecked(): hazard_type = definition( self.impact_function.provenance['hazard_keywords'][ 'hazard']) exposure_type = definition( self.impact_function.provenance['exposure_keywords'][ 'exposure']) generated_components.remove(map_report) generated_components.append( update_template_component( component=map_report, hazard=hazard_type, exposure=exposure_type)) elif selected_template_path: generated_components.remove(map_report) generated_components.append( override_component_template( map_report, selected_template_path)) return generated_components
def prepare_components(self): """Prepare components that are going to be generated based on user options. :return: Updated list of components. :rtype: dict """ # Register the components based on user option # First, tabular report generated_components = deepcopy(all_default_report_components) # Rohmat: I need to define the definitions here, I can't get # the definition using definition helper method. component_definitions = { impact_report_pdf_component['key']: impact_report_pdf_component, action_checklist_pdf_component['key']: action_checklist_pdf_component, analysis_provenance_details_pdf_component['key']: analysis_provenance_details_pdf_component, infographic_report['key']: infographic_report } duplicated_report_metadata = None for key, checkbox in list(self.all_checkboxes.items()): if not checkbox.isChecked(): component = component_definitions[key] if component in generated_components: generated_components.remove(component) continue if self.is_multi_exposure: impact_report_metadata = ( standard_multi_exposure_impact_report_metadata_pdf) else: impact_report_metadata = ( standard_impact_report_metadata_pdf) if component in impact_report_metadata['components']: if not duplicated_report_metadata: duplicated_report_metadata = deepcopy( impact_report_metadata) duplicated_report_metadata['components'].remove(component) if impact_report_metadata in generated_components: generated_components.remove(impact_report_metadata) generated_components.append(duplicated_report_metadata) # Second, custom and map report # Get selected template path to use selected_template_path = None if self.search_directory_radio.isChecked(): selected_template_path = self.template_combo.itemData( self.template_combo.currentIndex()) elif self.search_on_disk_radio.isChecked(): selected_template_path = self.template_path.text() if not exists(selected_template_path): # noinspection PyCallByClass,PyTypeChecker QtWidgets.QMessageBox.warning( self, tr('InaSAFE'), tr('Please select a valid template before printing. ' 'The template you choose does not exist.')) if map_report in generated_components: # if self.no_map_radio.isChecked(): # generated_components.remove(map_report) if self.default_template_radio.isChecked(): # make sure map report is there generated_components.append( generated_components.pop( generated_components.index(map_report))) elif self.override_template_radio.isChecked(): hazard_type = definition( self.impact_function.provenance['hazard_keywords'] ['hazard']) exposure_type = definition( self.impact_function.provenance['exposure_keywords'] ['exposure']) generated_components.remove(map_report) generated_components.append( update_template_component(component=map_report, hazard=hazard_type, exposure=exposure_type)) elif selected_template_path: generated_components.remove(map_report) generated_components.append( override_component_template(map_report, selected_template_path)) return generated_components