def prepare_new_layer(self, input_layer): """Prepare new layer for the output layer. :param input_layer: Vector layer. :type input_layer: QgsVectorLayer :return: New memory layer duplicated from input_layer. :rtype: QgsVectorLayer """ # create memory layer output_layer_name = os.path.splitext(input_layer.name())[0] output_layer_name = unique_filename( prefix=('%s_minimum_needs_' % output_layer_name), dir='minimum_needs_calculator') output_layer = create_memory_layer( output_layer_name, input_layer.geometryType(), input_layer.crs(), input_layer.fields()) # monkey patching input layer to make it work with # prepare vector layer function temp_layer = input_layer temp_layer.keywords = { 'layer_purpose': layer_purpose_aggregation['key']} # copy features to output layer copy_layer(temp_layer, output_layer) # Monkey patching output layer to make it work with # minimum needs calculator output_layer.keywords['layer_purpose'] = ( layer_purpose_aggregation['key']) output_layer.keywords['inasafe_fields'] = { displaced_field['key']: self.displaced.currentField() } if self.aggregation_name.currentField(): output_layer.keywords['inasafe_fields'][ aggregation_name_field['key']] = ( self.aggregation_name.currentField()) # remove unnecessary fields & rename inasafe fields clean_inasafe_fields(output_layer) return output_layer
def test_clean_inasafe_fields(self): """Test clean_inasafe_fields.""" layer = load_test_vector_layer( 'gisv4', 'exposure', 'population_multi_fields.geojson', clone=True) original_female_fields = [ 'F_0_4', 'F_5_9', 'F_9_15', 'F_15_30', 'F_30_60', 'F_60_100' ] layer.keywords = { 'layer_purpose': 'exposure', 'exposure': 'population', 'inasafe_fields': { 'exposure_id_field': 'exposure_id', 'population_count_field': 'population', 'female_count_field': original_female_fields } } clean_inasafe_fields(layer) # Check if the female count name does exist female_count_field_idx = layer.fields().lookupField( female_count_field['field_name']) self.assertGreater(female_count_field_idx, -1) # Check the keyword is updated properly expected_inasafe_fields = { population_count_field['key']: population_count_field[ 'field_name'], female_count_field['key']: female_count_field['field_name'], exposure_id_field['key']: exposure_id_field['field_name'] } self.assertDictEqual( expected_inasafe_fields, layer.keywords['inasafe_fields']) # Check if the original fields are gone for original_female_field in original_female_fields: self.assertEqual(layer.fields().lookupField( original_female_field), -1)