def test_batch_set_data(self):
     model = TimePatternModel(TimePattern(['a', 'b', 'c'],
                                          [-5.0, 3.0, 7.0]))
     indexes = [model.index(0, 0), model.index(1, 1), model.index(2, 1)]
     values = ['A', 55.5, -55.5]
     model.batch_set_data(indexes, values)
     expected = TimePattern(['A', 'b', 'c'], [-5.0, 55.5, -55.5])
     self.assertEqual(model.value, expected)
 def test_insert_multiple_rows_in_the_middle(self):
     model = TimePatternModel(TimePattern(['a', 'b'], [-5.0, 7.0]))
     self.assertTrue(model.insertRows(1, 3))
     self.assertEqual(len(model.value), 5)
     self.assertEqual(model.value.indexes, ['a', '2', '3', '4', 'b'])
     numpy.testing.assert_equal(model.value.values,
                                np.array([-5.0, 0.0, 0.0, 0.0, 7.0]))
 def test_insert_rows_in_the_end(self):
     model = TimePatternModel(TimePattern(['a', 'b'], [-5.0, 7.0]))
     self.assertTrue(model.insertRows(2, 1))
     self.assertEqual(len(model.value), 3)
     self.assertEqual(model.value.indexes, ['a', 'b', '3'])
     numpy.testing.assert_equal(model.value.values,
                                np.array([-5.0, 7.0, 0.0]))
 def test_remove_rows_from_the_middle(self):
     model = TimePatternModel(TimePattern(['a', 'b', 'c'],
                                          [-5.0, 3.0, 7.0]))
     self.assertTrue(model.removeRows(1, 1))
     self.assertEqual(len(model.value), 2)
     self.assertEqual(model.value.indexes, ['a', 'c'])
     numpy.testing.assert_equal(model.value.values, np.array([-5.0, 7.0]))
예제 #5
0
    def insertRows(self, row, count, parent=QModelIndex()):
        """
        Inserts new time period - value pairs into the pattern.

        New time periods are initialized to empty strings and the corresponding values to zeros.

        Args:
            row (int): an index where to insert the new data
            count (int): number of time period - value pairs to insert
            parent (QModelIndex): an index to a parent model
        Returns:
            bool: True if the operation was successful
        """
        self.beginInsertRows(parent, row, row + count - 1)
        old_indexes = self._value.indexes
        old_values = self._value.values
        new_indexes = list(old_indexes)
        for i in range(count):
            new_indexes.insert(row, str(row + (count - i)))
        if row == len(old_values):
            new_values = np.append(old_values, np.zeros(count))
        else:
            new_values = np.insert(old_values, row, np.zeros(count))
        self._value = TimePattern(new_indexes, new_values)
        self.endInsertRows()
        return True
예제 #6
0
    def removeRows(self, row, count, parent=QModelIndex()):
        """
        Removes time period - value pairs from the pattern.

        Args:
            row (int): an index where to remove the data
            count (int): number of time period - value pairs to remove
            parent (QModelIndex): an index to a parent model

        Returns:
            bool: True if the operation was successful
        """
        if len(self._value) == 1:
            return False
        if count == len(self._value):
            count = len(self._value) - 1
            row = 1
        self.beginRemoveRows(parent, row, row + count - 1)
        old_indexes = self._value.indexes
        old_values = self._value.values
        new_indexes = list(old_indexes)
        del new_indexes[row:row + count]
        remove_indexes = range(row, row + count) if count > 1 else row
        new_values = np.delete(old_values, remove_indexes)
        self._value = TimePattern(new_indexes, new_values)
        self.endRemoveRows()
        return True
 def test_flags(self):
     model = TimePatternModel(TimePattern(["", ""], [0.0, 0.0]))
     for row in range(len(model.value)):
         for column in range(2):
             model_index = model.index(row, column)
             self.assertEqual(
                 model.flags(model_index),
                 Qt.ItemIsSelectable | Qt.ItemIsEnabled | Qt.ItemIsEditable)
예제 #8
0
    def __init__(self, parent=None):
        from ..ui.time_pattern_editor import Ui_TimePatternEditor  # pylint: disable=import-outside-toplevel

        super().__init__(parent)
        self._model = TimePatternModel(TimePattern(["1-7d"], [0.0]))
        self._ui = Ui_TimePatternEditor()
        self._ui.setupUi(self)
        self._ui.pattern_edit_table.setModel(self._model)
        self._ui.pattern_edit_table.setContextMenuPolicy(Qt.CustomContextMenu)
        self._ui.pattern_edit_table.customContextMenuRequested.connect(self._show_table_context_menu)
    def __init__(self, parent=None):
        from ..ui.time_pattern_editor import Ui_TimePatternEditor

        super().__init__(parent)
        self._model = TimePatternModel(TimePattern(["1-7d"], [0.0]))
        self._ui = Ui_TimePatternEditor()
        self._ui.setupUi(self)
        self._pattern_edit_table = IndexedValueTableView(self)
        self.layout().addWidget(self._pattern_edit_table)
        self._pattern_edit_table.setModel(self._model)
        self._pattern_edit_table.setContextMenuPolicy(Qt.CustomContextMenu)
        self._pattern_edit_table.customContextMenuRequested.connect(self._show_table_context_menu)
예제 #10
0
 def test_remove_rows_with_time_pattern_editor(self):
     editor = TimePatternEditor()
     editor.set_value(TimePattern(["1d", "2d"], [-1.1, -2.2]))
     table_view = editor._ui.pattern_edit_table
     table_view.selectRow(0)
     model = table_view.model()
     rect = table_view.visualRect(model.index(0, 0))
     menu = ArrayTableContextMenu(editor, table_view, rect.center())
     remove_action = _find_action(menu, "Remove rows")
     self.assertIsNotNone(remove_action)
     remove_action.trigger()
     self.assertEqual(model.rowCount(), 1 + 1)
     self.assertEqual(model.index(0, 0).data(), "2d")
     self.assertEqual(model.index(0, 1).data(), -2.2)
예제 #11
0
 def test_insert_row_before_with_time_pattern_editor(self):
     editor = TimePatternEditor()
     editor.set_value(TimePattern(["1d"], [-1.1]))
     table_view = editor._ui.pattern_edit_table
     table_view.selectRow(0)
     model = table_view.model()
     rect = table_view.visualRect(model.index(0, 0))
     menu = IndexedValueTableContextMenu(table_view, rect.center())
     insert_action = _find_action(menu, "Insert row before")
     self.assertIsNotNone(insert_action)
     insert_action.trigger()
     self.assertEqual(model.rowCount(), 2 + 1)
     self.assertEqual(model.index(0, 0).data(), "1")
     self.assertEqual(model.index(0, 1).data(), 0.0)
     self.assertEqual(model.index(1, 0).data(), "1d")
     self.assertEqual(model.index(1, 1).data(), -1.1)
예제 #12
0
    def _create_database(directory):
        """Creates a database with objects, relationship, parameters and values."""
        url = TestExcelIntegration._sqlite_url(_TEMP_SQLITE_FILENAME,
                                               directory)
        create_new_spine_database(url)
        db_map = DiffDatabaseMapping(url,
                                     username='******',
                                     upgrade=True)

        # create empty database for loading excel into
        url = TestExcelIntegration._sqlite_url(_TEMP_SQLITE_TEST_FILENAME,
                                               directory)
        create_new_spine_database(url)
        db_map_test = DiffDatabaseMapping(url,
                                          username='******',
                                          upgrade=True)

        # delete all object_classes to empty database
        oc = set(oc.id for oc in db_map_test.object_class_list().all())
        if oc:
            db_map_test.remove_items(object_class_ids=oc)
            db_map_test.commit_session('empty database')

        oc = set(oc.id for oc in db_map.object_class_list().all())
        if oc:
            db_map.remove_items(object_class_ids=oc)
            db_map.commit_session('empty database')

        # create object classes
        oc_1 = db_map.add_object_class(**{'name': 'object_class_1'})
        oc_2 = db_map.add_object_class(**{'name': 'object_class_2'})
        oc_3 = db_map.add_object_class(**{'name': 'object_class_3'})

        # create relationship classes
        relc1 = db_map.add_wide_relationship_class(
            **{
                'name': 'relationship_class',
                'object_class_id_list': [oc_1.id, oc_2.id]
            })
        relc2 = db_map.add_wide_relationship_class(
            **{
                'name': 'relationship_class2',
                'object_class_id_list': [oc_1.id, oc_2.id]
            })

        # create objects
        oc1_obj1 = db_map.add_object(**{
            'name': 'oc1_obj1',
            'class_id': oc_1.id
        })
        oc1_obj2 = db_map.add_object(**{
            'name': 'oc1_obj2',
            'class_id': oc_1.id
        })
        oc2_obj1 = db_map.add_object(**{
            'name': 'oc2_obj1',
            'class_id': oc_2.id
        })
        oc2_obj2 = db_map.add_object(**{
            'name': 'oc2_obj2',
            'class_id': oc_2.id
        })
        oc3_obj1 = db_map.add_object(**{
            'name': 'oc3_obj1',
            'class_id': oc_3.id
        })

        # add relationships
        rel1 = db_map.add_wide_relationship(
            **{
                'name': 'rel1',
                'class_id': relc1.id,
                'object_id_list': [oc1_obj1.id, oc2_obj1.id]
            })
        rel2 = db_map.add_wide_relationship(
            **{
                'name': 'rel2',
                'class_id': relc1.id,
                'object_id_list': [oc1_obj2.id, oc2_obj2.id]
            })

        # create parameters
        p1 = db_map.add_parameter_definitions(*[{
            'name': 'parameter1',
            'object_class_id': oc_1.id
        }])[0].first()
        p2 = db_map.add_parameter_definitions(*[{
            'name': 'parameter2',
            'object_class_id': oc_1.id
        }])[0].first()
        p3 = db_map.add_parameter_definitions(*[{
            'name': 'parameter3',
            'object_class_id': oc_2.id
        }])[0].first()
        p4 = db_map.add_parameter_definitions(*[{
            'name': 'parameter4',
            'object_class_id': oc_2.id
        }])[0].first()
        p5 = db_map.add_parameter_definitions(*[{
            'name': 'parameter5',
            'object_class_id': oc_3.id
        }])[0].first()
        p6 = db_map.add_parameter_definitions(*[{
            'name': 'parameter6',
            'object_class_id': oc_3.id
        }])[0].first()
        rel_p1 = db_map.add_parameter_definitions(
            *[{
                'name': 'rel_parameter1',
                'relationship_class_id': relc1.id
            }])[0].first()
        rel_p2 = db_map.add_parameter_definitions(
            *[{
                'name': 'rel_parameter2',
                'relationship_class_id': relc1.id
            }])[0].first()
        rel_p3 = db_map.add_parameter_definitions(
            *[{
                'name': 'rel_parameter3',
                'relationship_class_id': relc1.id
            }])[0].first()
        rel_p4 = db_map.add_parameter_definitions(
            *[{
                'name': 'rel_parameter4',
                'relationship_class_id': relc1.id
            }])[0].first()

        # add parameter values
        db_map.add_parameter_value(
            **{
                'parameter_definition_id': p1.id,
                'object_id': oc1_obj1.id,
                'object_class_id': oc_1.id,
                'value': '0'
            })
        db_map.add_parameter_value(
            **{
                'parameter_definition_id': p2.id,
                'object_id': oc1_obj2.id,
                'object_class_id': oc_1.id,
                'value': '3.5'
            })
        db_map.add_parameter_value(
            **{
                'parameter_definition_id': p3.id,
                'object_id': oc2_obj1.id,
                'object_class_id': oc_2.id,
                'value': '[1, 2, 3, 4]',
            })
        db_map.add_parameter_value(
            **{
                'parameter_definition_id': p4.id,
                'object_id': oc2_obj2.id,
                'object_class_id': oc_2.id,
                'value': '[5, 6, 7]',
            })
        db_map.add_parameter_value(
            **{
                'parameter_definition_id': rel_p1.id,
                'relationship_id': rel1.id,
                'relationship_class_id': relc1.id,
                'value': '0',
            })
        db_map.add_parameter_value(
            **{
                'parameter_definition_id': rel_p2.id,
                'relationship_id': rel2.id,
                'relationship_class_id': relc1.id,
                'value': '4',
            })
        db_map.add_parameter_value(
            **{
                'parameter_definition_id': rel_p3.id,
                'relationship_id': rel1.id,
                'relationship_class_id': relc1.id,
                'value': '[5, 6, 7]',
            })
        db_map.add_parameter_value(
            **{
                'parameter_definition_id': rel_p4.id,
                'relationship_id': rel2.id,
                'relationship_class_id': relc1.id,
                'value': '[1, 2, 3, 4]',
            })

        time = [
            np.datetime64('2005-02-25T00:00'),
            np.datetime64('2005-02-25T01:00'),
            np.datetime64('2005-02-25T02:00')
        ]
        value = [1, 2, 3]
        ts_val = to_database(
            TimeSeriesVariableResolution(time, value, False, False))
        db_map.add_parameter_value(
            **{
                'parameter_definition_id': p5.id,
                'object_id': oc3_obj1.id,
                'object_class_id': oc_3.id,
                'value': ts_val
            })

        timepattern = ['m1', 'm2', 'm3']
        value = [1.1, 2.2, 3.3]
        ts_val = to_database(TimePattern(timepattern, value))
        db_map.add_parameter_value(
            **{
                'parameter_definition_id': p6.id,
                'object_id': oc3_obj1.id,
                'object_class_id': oc_3.id,
                'value': ts_val
            })

        # commit
        db_map.commit_session('test')

        return db_map, db_map_test
예제 #13
0
 def test_value_access(self):
     editor = TimePatternEditor()
     editor.set_value(TimePattern(["1,5d", "2-4,6,7d"], [2.2, 2.1]))
     self.assertEqual(editor.value(),
                      TimePattern(["1,5d", "2-4,6,7d"], [2.2, 2.1]))
예제 #14
0
 def test_time_pattern_in_edit_role(self):
     value = TimePattern(["1-12m"], [5.0])
     self.db_mngr.get_item.return_value = {"value": to_database(value)}
     formatted = self.get_value(Qt.EditRole)
     self.assertEqual(formatted, to_database(value))
 def test_editor_sets_time_pattern_in_parent_model(self):
     indexes = ["1-3m", "4-12m"]
     values = np.array([23.0, 5.0])
     pattern = TimePattern(indexes, values)
     self._check_parent_model_updated_when_closed(pattern)
 def test_cannot_remove_all_rows(self):
     model = TimePatternModel(TimePattern(['a', 'b'], [-5.0, 7.0]))
     self.assertTrue(model.removeRows(0, 2))
     self.assertEqual(len(model.value), 1)
     self.assertEqual(model.value.indexes, ['a'])
     numpy.testing.assert_equal(model.value.values, [-5.0])
예제 #17
0
 def test_time_pattern_in_tool_tip_role(self):
     value = TimePattern(["1-12m"], [5.0])
     self.db_mngr.get_item.return_value = {"value": to_database(value)}
     self.assertIsNone(self.get_value(Qt.ToolTipRole))
 def test_remove_rows_from_the_beginning(self):
     model = TimePatternModel(TimePattern(['a', 'b'], [-5.0, 7.0]))
     self.assertTrue(model.removeRows(0, 1))
     self.assertEqual(len(model.value), 1)
     self.assertEqual(model.value.indexes, ['b'])
     numpy.testing.assert_equal(model.value.values, np.array([7.0]))
예제 #19
0
 def test_initial_value(self):
     editor = TimePatternEditor()
     value = editor.value()
     self.assertEqual(value, TimePattern(["1-7d"], [0.0]))
 def test_removing_last_row_fails(self):
     model = TimePatternModel(TimePattern(['a'], [-5.0]))
     self.assertFalse(model.removeRows(0, 1))
 def test_setData(self):
     model = TimePatternModel(TimePattern(['a', 'b'], [-5.0, 7.0]))
     model_index = model.index(1, 1)
     model.setData(model_index, 2.3)
     self.assertEqual(model.value.indexes, ['a', 'b'])
     numpy.testing.assert_equal(model.value.values, [-5.0, 2.3])