def restore_population_parameters(self, global_default=True): """Setup UI for population parameter page from setting. :param global_default: If True, set to original default (from the value in definitions). :type global_default: bool """ if global_default: data = generate_default_profile() else: data = setting('population_preference', generate_default_profile()) if not isinstance(data, dict): LOGGER.debug( 'population parameter is not a dictionary. InaSAFE will use ' 'the default one.') data = generate_default_profile() try: self.profile_widget.data = data except KeyError as e: LOGGER.debug( 'Population parameter is not in correct format. InaSAFE will ' 'use the default one.') LOGGER.debug(e) data = generate_default_profile() self.profile_widget.data = data
def test_export_import_setting(self): """Test for export_setting method.""" profile_file = unique_filename(suffix='.json', dir='population_preference') original_settings = { 'key': 'value', 'key_bool': True, 'population_preference': generate_default_profile(), 'key_int': 1, 'key_float': 2.0 } # Write for key, value in list(original_settings.items()): set_setting(key, value, self.qsettings) # Export inasafe_settings = export_setting(profile_file, self.qsettings) # Check result self.assertTrue(os.path.exists(profile_file)) self.assertEqual(inasafe_settings['key'], 'value') self.assertEqual(inasafe_settings['population_preference'], generate_default_profile()) # Import read_setting = import_setting(profile_file, self.qsettings) self.assertDictEqual(inasafe_settings, read_setting) self.assertDictEqual(original_settings, read_setting)
def restore_population_parameters(self, global_default=True): """Setup UI for population parameter page from setting. :param global_default: If True, set to original default (from the value in definitions). :type global_default: bool """ if global_default: data = generate_default_profile() else: data = setting('population_preference', generate_default_profile()) if not isinstance(data, dict): LOGGER.debug( 'population parameter is not a dictionary. InaSAFE will use ' 'the default one.') data = generate_default_profile() try: self.profile_widget.data = data except KeyError as e: LOGGER.debug( 'Population parameter is not in correct format. InaSAFE will ' 'use the default one.') LOGGER.debug(e) data = generate_default_profile() self.profile_widget.data = data
def test_export_import_setting(self): """Test for export_setting method.""" profile_file = unique_filename( suffix='.json', dir='population_preference') original_settings = { 'key': 'value', 'key_bool': True, 'population_preference': generate_default_profile(), 'key_int': 1, 'key_float': 2.0 } # Write for key, value in list(original_settings.items()): set_setting(key, value, self.qsettings) # Export inasafe_settings = export_setting(profile_file, self.qsettings) # Check result self.assertTrue(os.path.exists(profile_file)) self.assertEqual(inasafe_settings['key'], 'value') self.assertEqual( inasafe_settings['population_preference'], generate_default_profile()) # Import read_setting = import_setting(profile_file, self.qsettings) self.assertDictEqual(inasafe_settings, read_setting) self.assertDictEqual(original_settings, read_setting)
def test_get_displacement_rate_and_affected_with_qsetting(self): """Test for get_displacement_rate and is_affected with QSettings.""" # Create custom qsettings qsettings = QSettings(INASAFE_TEST) qsettings.clear() # Save the default profile to qsettings default_profile = generate_default_profile() set_setting('population_preference', default_profile, qsettings) # Check the default one first default_profile = generate_default_profile() class_key = flood_hazard_classes['classes'][0]['key'] value = is_affected(hazard_flood['key'], flood_hazard_classes['key'], class_key, qsettings) expected_value = default_profile[hazard_flood['key']][ flood_hazard_classes['key']][class_key]['affected'] self.assertEqual(value, expected_value) value = get_displacement_rate(hazard_flood['key'], flood_hazard_classes['key'], class_key, qsettings) expected_value = default_profile[hazard_flood['key']][ flood_hazard_classes['key']][class_key]['displacement_rate'] self.assertEqual(value, expected_value) # Change displacement rate new_displacement_rate = 1 default_profile[hazard_flood['key']][ flood_hazard_classes['key']][class_key]['displacement_rate'] = 1 set_setting('population_preference', default_profile, qsettings) value = get_displacement_rate(hazard_flood['key'], flood_hazard_classes['key'], class_key, qsettings) self.assertEqual(value, new_displacement_rate) # Change affected value new_affected = False default_profile[hazard_flood['key']][ flood_hazard_classes['key']][class_key]['affected'] = new_affected set_setting('population_preference', default_profile, qsettings) value = is_affected(hazard_flood['key'], flood_hazard_classes['key'], class_key, qsettings) self.assertEqual(value, new_affected) value = get_displacement_rate(hazard_flood['key'], flood_hazard_classes['key'], class_key, qsettings) # Should be 0 since it's not affected self.assertEqual(value, 0)
def test_generate_default_profile(self): """Test for generate_default_profile method.""" default_profile = generate_default_profile() # from pprint import pprint # pprint(default_profile) self.assertIsInstance(default_profile, dict) self.assertIsNotNone(default_profile)
def test_setup_profile_widget(self): """Test setup profile widget.""" data = generate_default_profile() profile_widget = ProfileWidget(data=data) # There is filtering happens in the Widget, so we skip this check # self.assertDictEqual(data, profile_widget.data) hazard_item = profile_widget.widget_items[0] hazard_key = hazard_item.data(0, Qt.UserRole) classification_item = hazard_item.child(0) classification_key = classification_item.data(0, Qt.UserRole) class_item = classification_item.child(0) class_key = class_item.data(0, Qt.UserRole) affected_check_box = profile_widget.itemWidget(class_item, 1) displacement_spin_box = profile_widget.itemWidget(class_item, 2) # Test changing value displacement_spin_box.setValue(0.5) self.assertEqual( profile_widget.data[hazard_key][classification_key][ class_key]['displacement_rate'], 0.5 ) # Test behaviour affected_check_box.setChecked(False) self.assertFalse(displacement_spin_box.isEnabled()) data = profile_widget.data # The widget filter out the classification that doesn't support # population. # TODO(IS): We should move this test to generate_default_profile self.assertNotIn(tsunami_hazard_classes['key'], data)
def test_setup_profile_widget(self): """Test setup profile widget.""" data = generate_default_profile() profile_widget = ProfileWidget(data=data) # There is filtering happens in the Widget, so we skip this check # self.assertDictEqual(data, profile_widget.data) hazard_item = profile_widget.widget_items[0] hazard_key = hazard_item.data(0, Qt.UserRole) classification_item = hazard_item.child(0) classification_key = classification_item.data(0, Qt.UserRole) class_item = classification_item.child(0) class_key = class_item.data(0, Qt.UserRole) affected_check_box = profile_widget.itemWidget(class_item, 1) displacement_spin_box = profile_widget.itemWidget(class_item, 2) # Test changing value displacement_spin_box.setValue(0.5) self.assertEqual( profile_widget.data[hazard_key][classification_key][ class_key]['displacement_rate'], 0.5 ) # Test behaviour affected_check_box.setChecked(False) self.assertFalse(displacement_spin_box.isEnabled()) data = profile_widget.data # The widget filter out the classification that doesn't support # population. # TODO(IS): We should move this test to generate_default_profile self.assertNotIn(tsunami_hazard_classes['key'], data)
def test_generate_default_profile(self): """Test for generate_default_profile method.""" default_profile = generate_default_profile() # from pprint import pprint # pprint(default_profile) self.assertIsInstance(default_profile, dict) self.assertIsNotNone(default_profile)
def main(): """Main function to run the example.""" def print_values(the_profile_widget): data = the_profile_widget.data from pprint import pprint pprint(data) def clear_widget(the_profile_widget): the_profile_widget.clear() def restore_data(the_profile_widget): the_profile_widget.clear() the_profile_widget.data = generate_default_profile() from safe.test.utilities import get_qgis_app QGIS_APP, CANVAS, IFACE, PARENT = get_qgis_app(qsetting=INASAFE_TEST) default_profile = generate_default_profile() profile_widget = ProfileWidget(data=default_profile) get_result_button = QPushButton('Get result...') get_result_button.clicked.connect( partial(print_values, profile_widget)) clear_button = QPushButton('Clear widget...') clear_button.clicked.connect( partial(clear_widget, profile_widget)) restore_button = QPushButton('Restore data...') restore_button.clicked.connect( partial(restore_data, profile_widget)) widget = QWidget() layout = QGridLayout() layout.addWidget(profile_widget) layout.addWidget(restore_button) layout.addWidget(get_result_button) layout.addWidget(clear_button) widget.setLayout(layout) widget.setFixedHeight(600) widget.setFixedWidth(800) widget.show() sys.exit(QGIS_APP.exec_())
def main(): """Main function to run the example.""" def print_values(the_profile_widget): data = the_profile_widget.data from pprint import pprint pprint(data) def clear_widget(the_profile_widget): the_profile_widget.clear() def restore_data(the_profile_widget): the_profile_widget.clear() the_profile_widget.data = generate_default_profile() from safe.test.utilities import get_qgis_app QGIS_APP, CANVAS, IFACE, PARENT = get_qgis_app(qsetting=INASAFE_TEST) default_profile = generate_default_profile() profile_widget = ProfileWidget(data=default_profile) get_result_button = QPushButton('Get result...') get_result_button.clicked.connect(partial(print_values, profile_widget)) clear_button = QPushButton('Clear widget...') clear_button.clicked.connect(partial(clear_widget, profile_widget)) restore_button = QPushButton('Restore data...') restore_button.clicked.connect(partial(restore_data, profile_widget)) widget = QWidget() layout = QGridLayout() layout.addWidget(profile_widget) layout.addWidget(restore_button) layout.addWidget(get_result_button) layout.addWidget(clear_button) widget.setLayout(layout) widget.setFixedHeight(600) widget.setFixedWidth(800) widget.show() sys.exit(QGIS_APP.exec_())
def test_read_write_dictionary(self): """Test for reading and writing dictionary in QSettings.""" dictionary = { 'a': 'a', 'b': 1, 'c': { 'd': True, 'e': { 'f': 1.0, 'g': 2 } } } set_setting('key', dictionary, self.qsettings) value = setting('key', qsettings=self.qsettings) self.assertDictEqual(dictionary, value) profile_dictionary = generate_default_profile() set_setting('population_preference', profile_dictionary, self.qsettings) value = setting('population_preference', qsettings=self.qsettings) self.assertDictEqual(profile_dictionary, value)
def test_get_displacement_rate_and_affected(self): """Test for get_displacement_rate and is_affected""" # Random key value = is_affected('foo', 'bar', 'boom') self.assertEqual(value, not_exposed_class['key']) value = get_displacement_rate('foo', 'bar', 'boom') self.assertEqual(value, 0) # From default values default_profile = generate_default_profile() class_key = flood_hazard_classes['classes'][0]['key'] value = is_affected(hazard_flood['key'], flood_hazard_classes['key'], class_key) expected_value = default_profile[hazard_flood['key']][ flood_hazard_classes['key']][class_key]['affected'] self.assertEqual(value, expected_value) value = get_displacement_rate(hazard_flood['key'], flood_hazard_classes['key'], class_key) expected_value = default_profile[hazard_flood['key']][ flood_hazard_classes['key']][class_key]['displacement_rate'] self.assertEqual(value, expected_value)
def test_get_displacement_rate_and_affected(self): """Test for get_displacement_rate and is_affected""" # Random key value = is_affected('foo', 'bar', 'boom') self.assertEqual(value, not_exposed_class['key']) value = get_displacement_rate('foo', 'bar', 'boom') self.assertEqual(value, 0) # From default values default_profile = generate_default_profile() class_key = flood_hazard_classes['classes'][0]['key'] value = is_affected( hazard_flood['key'], flood_hazard_classes['key'], class_key) expected_value = default_profile[ hazard_flood['key']][flood_hazard_classes['key']][class_key][ 'affected'] self.assertEqual(value, expected_value) value = get_displacement_rate( hazard_flood['key'], flood_hazard_classes['key'], class_key) expected_value = default_profile[ hazard_flood['key']][flood_hazard_classes['key']][class_key][ 'displacement_rate'] self.assertEqual(value, expected_value)
def test_read_write_dictionary(self): """Test for reading and writing dictionary in QSettings.""" dictionary = { 'a': 'a', 'b': 1, 'c': { 'd': True, 'e': { 'f': 1.0, 'g': 2 } } } set_setting('key', dictionary, self.qsettings) value = setting('key', qsettings=self.qsettings) self.assertDictEqual(dictionary, value) profile_dictionary = generate_default_profile() set_setting( 'population_preference', profile_dictionary, self.qsettings) value = setting('population_preference', qsettings=self.qsettings) self.assertDictEqual(profile_dictionary, value)
def restore_data(the_profile_widget): the_profile_widget.clear() the_profile_widget.data = generate_default_profile()
def data(self, profile_data): """Set data for the widget. :param profile_data: profile data. :type profile_data: dict It will replace the previous data. """ default_profile = generate_default_profile() self.clear() for hazard in sorted(default_profile.keys()): classifications = default_profile[hazard] hazard_widget_item = QTreeWidgetItem() hazard_widget_item.setData(0, Qt.UserRole, hazard) hazard_widget_item.setText(0, get_name(hazard)) for classification in sorted(classifications.keys()): # Filter out classification that doesn't support population. # TODO(IS): This is not the best place to put the filtering. # It's more suitable in the generate_default_profile method # in safe/definitions/utilities. classification_definition = definition(classification) supported_exposures = classification_definition.get( 'exposures', []) # Empty list means support all exposure if supported_exposures != []: if exposure_population not in supported_exposures: continue classes = classifications[classification] classification_widget_item = QTreeWidgetItem() classification_widget_item.setData( 0, Qt.UserRole, classification) classification_widget_item.setText(0, get_name(classification)) hazard_widget_item.addChild(classification_widget_item) for the_class, the_value in list(classes.items()): the_class_widget_item = QTreeWidgetItem() the_class_widget_item.setData(0, Qt.UserRole, the_class) the_class_widget_item.setText( 0, get_class_name(the_class, classification)) classification_widget_item.addChild(the_class_widget_item) # Adding widget must be happened after addChild affected_check_box = QCheckBox(self) # Set from profile_data if exist, else get default profile_value = profile_data.get( hazard, {}).get(classification, {}).get( the_class, the_value) affected_check_box.setChecked(profile_value['affected']) self.setItemWidget( the_class_widget_item, 1, affected_check_box) displacement_rate_spinbox = PercentageSpinBox(self) displacement_rate_spinbox.setValue( profile_value['displacement_rate']) displacement_rate_spinbox.setEnabled( profile_value['affected']) self.setItemWidget( the_class_widget_item, 2, displacement_rate_spinbox) # Behaviour when the check box is checked # noinspection PyUnresolvedReferences affected_check_box.stateChanged.connect( displacement_rate_spinbox.setEnabled) if hazard_widget_item.childCount() > 0: self.widget_items.append(hazard_widget_item) self.addTopLevelItems(self.widget_items) self.expandAll()
def data(self, profile_data): """Set data for the widget. :param profile_data: profile data. :type profile_data: dict It will replace the previous data. """ default_profile = generate_default_profile() self.clear() for hazard in sorted(default_profile.keys()): classifications = default_profile[hazard] hazard_widget_item = QTreeWidgetItem() hazard_widget_item.setData(0, Qt.UserRole, hazard) hazard_widget_item.setText(0, get_name(hazard)) for classification in sorted(classifications.keys()): # Filter out classification that doesn't support population. # TODO(IS): This is not the best place to put the filtering. # It's more suitable in the generate_default_profile method # in safe/definitions/utilities. classification_definition = definition(classification) supported_exposures = classification_definition.get( 'exposures', []) # Empty list means support all exposure if supported_exposures != []: if exposure_population not in supported_exposures: continue classes = classifications[classification] classification_widget_item = QTreeWidgetItem() classification_widget_item.setData(0, Qt.UserRole, classification) classification_widget_item.setText(0, get_name(classification)) hazard_widget_item.addChild(classification_widget_item) for the_class, the_value in list(classes.items()): the_class_widget_item = QTreeWidgetItem() the_class_widget_item.setData(0, Qt.UserRole, the_class) the_class_widget_item.setText( 0, get_class_name(the_class, classification)) classification_widget_item.addChild(the_class_widget_item) # Adding widget must be happened after addChild affected_check_box = QCheckBox(self) # Set from profile_data if exist, else get default profile_value = profile_data.get(hazard, {}).get( classification, {}).get(the_class, the_value) affected_check_box.setChecked(profile_value['affected']) self.setItemWidget(the_class_widget_item, 1, affected_check_box) displacement_rate_spinbox = PercentageSpinBox(self) displacement_rate_spinbox.setValue( profile_value['displacement_rate']) displacement_rate_spinbox.setEnabled( profile_value['affected']) self.setItemWidget(the_class_widget_item, 2, displacement_rate_spinbox) # Behaviour when the check box is checked # noinspection PyUnresolvedReferences affected_check_box.stateChanged.connect( displacement_rate_spinbox.setEnabled) if hazard_widget_item.childCount() > 0: self.widget_items.append(hazard_widget_item) self.addTopLevelItems(self.widget_items) self.expandAll()
def restore_data(the_profile_widget): the_profile_widget.clear() the_profile_widget.data = generate_default_profile()
def test_get_displacement_rate_and_affected_with_qsetting(self): """Test for get_displacement_rate and is_affected with QSettings.""" # Create custom qsettings qsettings = QSettings(INASAFE_TEST) qsettings.clear() # Save the default profile to qsettings default_profile = generate_default_profile() set_setting('population_preference', default_profile, qsettings) # Check the default one first default_profile = generate_default_profile() class_key = flood_hazard_classes['classes'][0]['key'] value = is_affected( hazard_flood['key'], flood_hazard_classes['key'], class_key, qsettings) expected_value = default_profile[ hazard_flood['key']][flood_hazard_classes['key']][class_key][ 'affected'] self.assertEqual(value, expected_value) value = get_displacement_rate( hazard_flood['key'], flood_hazard_classes['key'], class_key, qsettings) expected_value = default_profile[ hazard_flood['key']][flood_hazard_classes['key']][class_key][ 'displacement_rate'] self.assertEqual(value, expected_value) # Change displacement rate new_displacement_rate = 1 default_profile[ hazard_flood['key']][flood_hazard_classes['key']][class_key][ 'displacement_rate'] = 1 set_setting('population_preference', default_profile, qsettings) value = get_displacement_rate( hazard_flood['key'], flood_hazard_classes['key'], class_key, qsettings) self.assertEqual(value, new_displacement_rate) # Change affected value new_affected = False default_profile[ hazard_flood['key']][flood_hazard_classes['key']][class_key][ 'affected'] = new_affected set_setting('population_preference', default_profile, qsettings) value = is_affected( hazard_flood['key'], flood_hazard_classes['key'], class_key, qsettings) self.assertEqual(value, new_affected) value = get_displacement_rate( hazard_flood['key'], flood_hazard_classes['key'], class_key, qsettings) # Should be 0 since it's not affected self.assertEqual(value, 0)