def _split_file(self, arr, file_path):
        new_file_full_path = Path(str(file_path))

        new_file_metadata = MetaData(new_file_full_path.get_metadata_path(),
                                     new_file_full_path.path,
                                     False)
        new_file_metadata.metadata = self.metadata_c.metadata.copy()

        new_file = self.__class__(new_file_full_path, False, new_file_metadata)

        new_file.data = [data for index, data in enumerate(self.data) if index in arr]

        new_file.save()
        new_file.metadata_c.save()

        self.structure_dock.file_system.refresh()
    def merge(self, arr):
        file_arr = []
        for file_path in arr:
            file = File(Path(file_path))
            if self.metadata_c.metadata != file.metadata_c.metadata:
                return
            file_arr.append(file)
        msg = ''
        for file in file_arr:
            msg += f"Merge with - {file.path_c.path} ({len(file.data)}Records)\n"

        msg_box = MessageBox("Merge Files",
                             "Do You want to merge this files",
                             msg)

        result = msg_box.exec_()
        if result == 1024:
            for file in file_arr:
                for data in file.data:
                    self.data.append(data.copy())
                file.delete()

            self.structure_dock.file_system.refresh()
            return True
        else:
            return
    def __init__(self, parent, file_c, set_model=False):
        super().__init__(parent)
        self.model_c = file_c

        self.setContentsMargins(0, 0, 0, 0)

        self.main_layout = QtWidgets.QVBoxLayout(
        )  # postavljanje main lyouta koji
        self.main_layout.setContentsMargins(0, 0, 0, 0)
        self.main_layout.setSpacing(0)

        self.foreign_table_tabs = QtWidgets.QTabWidget(
            self)  # pravljenje widgeta koji sadrzi child tabele

        self.main_table = Table(self, file_c, set_model)
        self.main_table.tool_bar.set_parm((self.main_table.toolbar()))
        self.main_table.table.itemClicked.connect(self.find_relation)

        for foreign_table_path in self.model_c.metadata_c.metadata[
                "sequential_info"]["child_relation"]:
            foreign_file_c = SQFile(
                Path(foreign_table_path["path_of_child_table"]), set_model)
            foreign_table = Table(self.foreign_table_tabs, foreign_file_c,
                                  set_model)
            foreign_table.tool_bar.set_parm((foreign_table.toolbar({
                "save":
                True,
                "save_as":
                True,
                "split":
                True,
                "merge":
                True,
                "filter":
                True,
                "search":
                True,
                "add":
                True,
                "reset":
                True,
                "page_up":
                True,
                "page_down":
                True,
                "parent_relation":
                False,
                "child_relation":
                False
            })))
            self.foreign_table_tabs.addTab(foreign_table,
                                           foreign_file_c.get_file_name())

        self.main_layout.addWidget(self.main_table)
        self.main_layout.addWidget(self.foreign_table_tabs)

        self.setLayout(self.main_layout)
    def open_parent(self, path):
        if self.side_widget is not None:
            self.side_widget.close()

        self.side_widget = SideTableSelectParent(
            self, SQFile(Path(path), True), self.headers_inputs.set_parent,
            self.table.model_c.path_c)

        self.splitter.insertWidget(-1, self.side_widget)
    def __init__(self, parent, file_name, file_path, callback):
        super().__init__(parent)
        self.file_path = file_path
        self.callback = callback

        self.v_layout = QVBoxLayout()
        self.v_layout.setSpacing(0)
        self.v_layout.setMargin(0)

        file_icon = QIcon(icon.TABLE_I())
        file_paht_c = Path(file_path)
        file_metadata_path = file_paht_c.get_metadata_path()
        file_metadata_c = None
        if os.path.isfile(file_metadata_path):
            file_metadata_c = MetaData(file_metadata_path, file_paht_c, True)
            if file_metadata_c.metadata["sequential_info"]["is_sequential"]:
                file_icon = QIcon(icon.RELATION_TABLE_I())

        self.btn = QPushButton(file_icon, file_name, self)
        self.btn.clicked.connect(self.send)

        self.v_layout.addWidget(self.btn)
        self.setLayout(self.v_layout)
    def _split_file(self, arr, file_path):
        new_file_full_path = Path(str(file_path))

        new_file_metadata = MetaData(new_file_full_path.get_metadata_path(),
                                     new_file_full_path.path,
                                     False)
        new_file_metadata.metadata = self.metadata_c.metadata.copy()
        new_file_metadata.metadata["sequential_info"] = {
            "is_sequential": False,
            "child_relation": [],
            "parent_relation": [],
            "bridge_relation": []}
        new_file_metadata.metadata["dialect"] = {
            "skip_first_line": False,
            "delimiter": ",",
            "quoting": 0
            }

        new_file = File(new_file_full_path, False, new_file_metadata)

        headers = new_file_metadata.get_headers_names()
        csv_object = {}
        # print(headers)
        for header in headers:
            csv_object.update({header: ""})

        for row in self.data:
            csv_object_blanc = csv_object.copy()
            for index, value in enumerate(row):
                csv_object_blanc[headers[index]] = value

            new_file.data.append(csv_object_blanc)

        new_file.save()
        new_file.metadata_c.save()

        self.structure_dock.file_system.refresh()
    def merge(self, arr):
        file_arr = []
        for file_path in arr:
            file = File(Path(file_path))
            if self.metadata_c.metadata != file.metadata_c.metadata:
                Info("Unsuccessful merge",
                     "Failed to merge objects",
                     "",
                     f"You can not merge file because formats aren't the same\n"
                     f"{self.path_c.path}:{self.metadata_c.get_headers_names()}\n"
                     f"IS NOT \n"
                     f"{file.path_c.path}:{file.metadata_c.get_headers_names()}")
                return

            for data in file.data:
                if self._sf_filter(self._self_relation_to_self(data)):
                    Info("Unsuccessful merge",
                         "Failed to merge objects",
                         "",
                         f"You can not merge file because \n"
                         f"{file.path_c.path}:{format_dict(data)}\n"
                         f"ALREADY EXIST IN \n"
                         f"{self.path_c.path}")
                    return

            file_arr.append(file)

        msg = ""
        for file in file_arr:
            msg += f"Merge with - {file.path_c.path} ({len(file.data)}Records)\n"

        msg_box = MessageBox("Merge Files",
                             "Do You want to merge this files",
                             msg)

        result = msg_box.exec_()
        if result == 1024:
            for file in file_arr:
                for data in file.data:
                    self.data.append(data.copy())
                file.delete()

            self.structure_dock.file_system.refresh()
            return True
        else:
            return
    def open_file(self,
                  file_path,
                  hide_current=False,
                  mysql=False,
                  mysqlTableName=None):
        if mysql:
            if self.is_file_open(mysqlTableName):
                return

            mysql_file = MYSQLFile(MySqlPath(mysqlTableName))
            self.main_tab_widget.insertTab(
                -1, SQLSequentialTableEditor(self, mysql_file, True),
                mysql_file.get_file_name())

            self.main_tab_widget.setCurrentWidget(
                self.main_tab_widget.widget(self.main_tab_widget.count() - 1))
            return

        if self.is_file_open(file_path):
            return

        path_c = Path(file_path)

        if path_c.get_extension() != "csv":
            Error("Invalid file path", f"File {file_path} does not exist",
                  "1fx", "")
            return

        file_c = File(path_c, False, None, self.structure_dock)
        index = self.main_tab_widget.count()

        if hide_current:
            index = self.main_tab_widget.indexOf(
                self.main_tab_widget.currentWidget())
            self.main_tab_widget.removeTab(index)

        if file_c.metadata_c.metadata["sequential_info"]["is_sequential"]:
            self.main_tab_widget.insertTab(
                index,
                SequentialEditor(
                    self, SQFile(path_c, True, None, self.structure_dock),
                    True), file_c.path_c.get_clear_file_name())
        else:
            file_c.load()
            table = Table(self, file_c, True)
            table.tool_bar.set_parm((table.toolbar({
                "save": True,
                "save_as": True,
                "split": True,
                "merge": True,
                "filter": True,
                "search": True,
                "add": True,
                "reset": True,
                "page_up": True,
                "page_down": True,
                "parent_relation": False,
                "child_relation": False
            })))
            self.main_tab_widget.insertTab(index, table,
                                           file_c.path_c.get_clear_file_name())

        self.main_tab_widget.setCurrentWidget(
            self.main_tab_widget.widget(index))
 def _search_file(self, path, index, data, relative="child_relation"):
     file = SQFile(Path(path), True)
     return file._sf_filter(self.get_relation_point(index, data, relative))