def test_get_field_groups(self): """Test for get_field_groups method.""" field_groups = get_field_groups(layer_purpose_aggregation['key']) expected = aggregation_field_groups self.assertListEqual(field_groups, expected) field_groups = get_field_groups(layer_purpose_exposure['key']) expected = [] self.assertListEqual(field_groups, expected) field_groups = get_field_groups(layer_purpose_exposure['key'], exposure_population['key']) expected = population_field_groups self.assertListEqual(field_groups, expected) field_groups = get_field_groups(layer_purpose_hazard['key']) expected = [] self.assertListEqual(field_groups, expected)
def test_get_field_groups(self): """Test for get_field_groups method.""" field_groups = get_field_groups(layer_purpose_aggregation['key']) expected = aggregation_field_groups self.assertListEqual(field_groups, expected) field_groups = get_field_groups(layer_purpose_exposure['key']) expected = [] self.assertListEqual(field_groups, expected) field_groups = get_field_groups( layer_purpose_exposure['key'], exposure_population['key']) expected = population_field_groups self.assertListEqual(field_groups, expected) field_groups = get_field_groups(layer_purpose_hazard['key']) expected = [] self.assertListEqual(field_groups, expected)
def layer_changed(self, layer): """Enable or disable keywords editor icon when active layer changes. :param layer: The layer that is now active. :type layer: QgsMapLayer """ if not layer: enable_keyword_wizard = False elif not hasattr(layer, 'providerType'): enable_keyword_wizard = False elif layer.providerType() == 'wms': enable_keyword_wizard = False else: enable_keyword_wizard = True try: if layer: if is_raster_layer(layer): enable_field_mapping_tool = False else: keywords = KeywordIO().read_keywords(layer) keywords_version = keywords.get('keyword_version') if not keywords_version: supported = False else: supported = ( is_keyword_version_supported(keywords_version)) if not supported: enable_field_mapping_tool = False else: layer_purpose = keywords.get('layer_purpose') if not layer_purpose: enable_field_mapping_tool = False else: if layer_purpose == layer_purpose_exposure['key']: layer_subcategory = keywords.get('exposure') elif layer_purpose == layer_purpose_hazard['key']: layer_subcategory = keywords.get('hazard') else: layer_subcategory = None field_groups = get_field_groups( layer_purpose, layer_subcategory) if len(field_groups) == 0: # No field group, disable field mapping tool. enable_field_mapping_tool = False else: enable_field_mapping_tool = True else: enable_field_mapping_tool = False except (KeywordNotFoundError, NoKeywordsFoundError, MetadataReadError): # No keywords, disable field mapping tool. enable_field_mapping_tool = False self.action_keywords_wizard.setEnabled(enable_keyword_wizard) self.action_field_mapping.setEnabled(enable_field_mapping_tool)
def get_next_step(self): """Find the proper step when user clicks the Next button. :returns: The step to be switched to :rtype: WizardStep """ layer_purpose = self.parent.step_kw_purpose.selected_purpose() if layer_purpose != layer_purpose_aggregation: subcategory = self.parent.step_kw_subcategory.\ selected_subcategory() else: subcategory = {'key': None} # Has layer groups, go to field mapping field_groups = get_field_groups( layer_purpose['key'], subcategory['key']) compulsory_field = get_compulsory_fields( layer_purpose['key'], subcategory['key']) # It's aggregation and has field_groups. if field_groups and layer_purpose == layer_purpose_aggregation: return self.parent.step_kw_fields_mapping # It has field_groups and the compulsory field is population count. if field_groups and compulsory_field == population_count_field: return self.parent.step_kw_fields_mapping # Has classifications, go to multi classifications if subcategory.get('classifications'): if layer_purpose == layer_purpose_hazard: return self.parent.step_kw_multi_classifications elif layer_purpose == layer_purpose_exposure: return self.parent.step_kw_classification # Check if it can go to inasafe field step non_compulsory_fields = get_non_compulsory_fields( layer_purpose['key'], subcategory['key']) if not skip_inasafe_field(self.parent.layer, non_compulsory_fields): return self.parent.step_kw_inasafe_fields # Check if it can go to inasafe default field step default_inasafe_fields = get_fields( layer_purpose['key'], subcategory['key'], replace_null=True, in_group=False) if default_inasafe_fields: return self.parent.step_kw_default_inasafe_fields # Any other case return self.parent.step_kw_source
def layer_changed(self, layer): """Enable or disable keywords editor icon when active layer changes. :param layer: The layer that is now active. :type layer: QgsMapLayer """ if not layer: enable_keyword_wizard = False elif not hasattr(layer, 'providerType'): enable_keyword_wizard = False elif layer.providerType() == 'wms': enable_keyword_wizard = False elif is_raster_layer(layer) and layer.bandCount() > 1: enable_keyword_wizard = False else: enable_keyword_wizard = True try: if layer: if is_raster_layer(layer): enable_field_mapping_tool = False else: keywords = KeywordIO().read_keywords(layer) layer_purpose = keywords.get('layer_purpose') if not layer_purpose: enable_field_mapping_tool = False if layer_purpose == layer_purpose_exposure['key']: layer_subcategory = keywords.get('exposure') elif layer_purpose == layer_purpose_hazard['key']: layer_subcategory = keywords.get('hazard') else: layer_subcategory = None field_groups = get_field_groups( layer_purpose, layer_subcategory) if len(field_groups) == 0: # No field group, disable field mapping tool. enable_field_mapping_tool = False else: enable_field_mapping_tool = True else: enable_field_mapping_tool = False except (KeywordNotFoundError, NoKeywordsFoundError, MetadataReadError): # No keywords, disable field mapping tool. enable_field_mapping_tool = False self.action_keywords_wizard.setEnabled(enable_keyword_wizard) self.action_field_mapping.setEnabled(enable_field_mapping_tool)
def get_next_step(self): """Find the proper step when user clicks the Next button. :returns: The step to be switched to :rtype: WizardStep """ layer_purpose = self.parent.step_kw_purpose.selected_purpose() if layer_purpose != layer_purpose_aggregation: subcategory = self.parent.step_kw_subcategory.\ selected_subcategory() else: subcategory = {'key': None} # Has layer groups, go to field mapping field_groups = get_field_groups( layer_purpose['key'], subcategory['key']) if field_groups: return self.parent.step_kw_fields_mapping # Has classifications, go to multi classifications if subcategory.get('classifications'): if layer_purpose == layer_purpose_hazard: return self.parent.step_kw_multi_classifications elif layer_purpose == layer_purpose_exposure: return self.parent.step_kw_classification # Check if it can go to inasafe field step non_compulsory_fields = get_non_compulsory_fields( layer_purpose['key'], subcategory['key']) if not skip_inasafe_field(self.parent.layer, non_compulsory_fields): return self.parent.step_kw_inasafe_fields # Check if it can go to inasafe default field step default_inasafe_fields = get_fields( layer_purpose['key'], subcategory['key'], replace_null=True, in_group=False) if default_inasafe_fields: return self.parent.step_kw_default_inasafe_fields # Any other case return self.parent.step_kw_source
def populate_tabs(self): """Populating tabs based on layer metadata.""" self.delete_tabs() layer_purpose = self.metadata.get('layer_purpose') if not layer_purpose: message = tr( 'Key layer_purpose is not found in the layer {layer_name}' ).format(layer_name=self.layer.name()) raise KeywordNotFoundError(message) if layer_purpose == layer_purpose_exposure['key']: layer_subcategory = self.metadata.get('exposure') elif layer_purpose == layer_purpose_hazard['key']: layer_subcategory = self.metadata.get('hazard') else: layer_subcategory = None field_groups = get_field_groups(layer_purpose, layer_subcategory) for field_group in field_groups: tab = FieldMappingTab(field_group, self, self.iface) tab.set_layer(self.layer, self.metadata) self.addTab(tab, field_group['name']) self.tabs.append(tab)
def populate_tabs(self): """Populating tabs based on layer metadata.""" self.delete_tabs() layer_purpose = self.metadata.get('layer_purpose') if not layer_purpose: message = tr( 'Key layer_purpose is not found in the layer {layer_name}' ).format(layer_name=self.layer.name()) raise KeywordNotFoundError(message) if layer_purpose == layer_purpose_exposure['key']: layer_subcategory = self.metadata.get('exposure') elif layer_purpose == layer_purpose_hazard['key']: layer_subcategory = self.metadata.get('hazard') else: layer_subcategory = None field_groups = get_field_groups(layer_purpose, layer_subcategory) for field_group in field_groups: tab = FieldMappingTab(field_group, self, self.iface) tab.set_layer(self.layer, self.metadata) self.addTab(tab, field_group['name']) self.tabs.append(tab)
def __init__(self, parent=None, iface=None, setting=None): """Constructor.""" QDialog.__init__(self, parent) self.setupUi(self) self.setWindowTitle(self.tr('InaSAFE Field Mapping Tool')) icon = resources_path('img', 'icons', 'show-mapping-tool.svg') self.setWindowIcon(QIcon(icon)) self.parent = parent self.iface = iface if setting is None: setting = QSettings() self.setting = setting self.keyword_io = KeywordIO() self.layer = None self.metadata = {} self.layer_input_layout = QHBoxLayout() self.layer_label = QLabel(tr('Layer')) self.layer_combo_box = QgsMapLayerComboBox() # Filter only for Polygon and Point self.layer_combo_box.setFilters( QgsMapLayerProxyModel.PolygonLayer | QgsMapLayerProxyModel.PointLayer) # Filter out a layer that don't have layer groups excepted_layers = [] for i in range(self.layer_combo_box.count()): layer = self.layer_combo_box.layer(i) try: keywords = self.keyword_io.read_keywords(layer) except (KeywordNotFoundError, NoKeywordsFoundError): excepted_layers.append(layer) continue layer_purpose = keywords.get('layer_purpose') if not layer_purpose: excepted_layers.append(layer) continue if layer_purpose == layer_purpose_exposure['key']: layer_subcategory = keywords.get('exposure') elif layer_purpose == layer_purpose_hazard['key']: layer_subcategory = keywords.get('hazard') else: layer_subcategory = None field_groups = get_field_groups(layer_purpose, layer_subcategory) if len(field_groups) == 0: excepted_layers.append(layer) continue self.layer_combo_box.setExceptedLayerList(excepted_layers) # Select the active layer. if self.iface.activeLayer(): found = self.layer_combo_box.findText( self.iface.activeLayer().name()) if found > -1: self.layer_combo_box.setLayer(self.iface.activeLayer()) self.field_mapping_widget = None self.main_stacked_widget.setCurrentIndex(1) # Input self.layer_input_layout.addWidget(self.layer_label) self.layer_input_layout.addWidget(self.layer_combo_box) self.header_label = QLabel() self.header_label.setWordWrap(True) self.main_layout.addWidget(self.header_label) self.main_layout.addLayout(self.layer_input_layout) # Signal self.layer_combo_box.layerChanged.connect(self.set_layer) if self.layer_combo_box.currentLayer(): self.set_layer(self.layer_combo_box.currentLayer()) # Set up things for context help self.help_button = self.button_box.button(QDialogButtonBox.Help) # Allow toggling the help button self.help_button.setCheckable(True) self.help_button.toggled.connect(self.help_toggled) # Set up things for ok button self.ok_button = self.button_box.button(QDialogButtonBox.Ok) self.ok_button.clicked.connect(self.accept) # Set up things for cancel button self.cancel_button = self.button_box.button(QDialogButtonBox.Cancel) self.cancel_button.clicked.connect(self.reject)
def __init__(self, parent=None, iface=None, setting=None): """Constructor.""" QDialog.__init__(self, parent) self.setupUi(self) self.setWindowTitle(self.tr('InaSAFE Field Mapping Tool')) icon = resources_path('img', 'icons', 'show-mapping-tool.svg') self.setWindowIcon(QIcon(icon)) self.parent = parent self.iface = iface if setting is None: setting = QSettings() self.setting = setting self.keyword_io = KeywordIO() self.layer = None self.metadata = {} self.layer_input_layout = QHBoxLayout() self.layer_label = QLabel(tr('Layer')) self.layer_combo_box = QgsMapLayerComboBox() # Filter only for Polygon and Point self.layer_combo_box.setFilters( QgsMapLayerProxyModel.PolygonLayer | QgsMapLayerProxyModel.PointLayer) # Filter out a layer that don't have layer groups excepted_layers = [] for i in range(self.layer_combo_box.count()): layer = self.layer_combo_box.layer(i) try: keywords = self.keyword_io.read_keywords(layer) except (KeywordNotFoundError, NoKeywordsFoundError): excepted_layers.append(layer) continue layer_purpose = keywords.get('layer_purpose') if not layer_purpose: excepted_layers.append(layer) continue if layer_purpose == layer_purpose_exposure['key']: layer_subcategory = keywords.get('exposure') elif layer_purpose == layer_purpose_hazard['key']: layer_subcategory = keywords.get('hazard') else: layer_subcategory = None field_groups = get_field_groups(layer_purpose, layer_subcategory) if len(field_groups) == 0: excepted_layers.append(layer) continue self.layer_combo_box.setExceptedLayerList(excepted_layers) # Select the active layer. if self.iface.activeLayer(): found = self.layer_combo_box.findText( self.iface.activeLayer().name()) if found > -1: self.layer_combo_box.setLayer(self.iface.activeLayer()) self.field_mapping_widget = None self.main_stacked_widget.setCurrentIndex(1) # Input self.layer_input_layout.addWidget(self.layer_label) self.layer_input_layout.addWidget(self.layer_combo_box) self.header_label = QLabel() self.header_label.setWordWrap(True) self.main_layout.addWidget(self.header_label) self.main_layout.addLayout(self.layer_input_layout) # Signal self.layer_combo_box.layerChanged.connect(self.set_layer) if self.layer_combo_box.currentLayer(): self.set_layer(self.layer_combo_box.currentLayer()) # Set up things for context help self.help_button = self.button_box.button(QDialogButtonBox.Help) # Allow toggling the help button self.help_button.setCheckable(True) self.help_button.toggled.connect(self.help_toggled) # Set up things for ok button self.ok_button = self.button_box.button(QDialogButtonBox.Ok) self.ok_button.clicked.connect(self.accept) # Set up things for cancel button self.cancel_button = self.button_box.button(QDialogButtonBox.Cancel) self.cancel_button.clicked.connect(self.reject)