Exemplo n.º 1
0
    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
Exemplo n.º 2
0
 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)
Exemplo n.º 3
0
    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
Exemplo n.º 4
0
 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)
Exemplo n.º 5
0
    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)
Exemplo n.º 6
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)
Exemplo n.º 7
0
    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)
Exemplo n.º 8
0
    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)
Exemplo n.º 9
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)
Exemplo n.º 10
0
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_())
Exemplo n.º 11
0
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_())
Exemplo n.º 12
0
    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)
Exemplo n.º 13
0
    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)
Exemplo n.º 14
0
    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)
Exemplo n.º 15
0
    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)
Exemplo n.º 16
0
 def restore_data(the_profile_widget):
     the_profile_widget.clear()
     the_profile_widget.data = generate_default_profile()
Exemplo n.º 17
0
    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()
Exemplo n.º 18
0
    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()
Exemplo n.º 19
0
 def restore_data(the_profile_widget):
     the_profile_widget.clear()
     the_profile_widget.data = generate_default_profile()
Exemplo n.º 20
0
    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)