def allChildren(index: QtCore.QModelIndex): result = [index] for row, column in product( range(index.model().rowCount(index)), range(index.model().columnCount(index)), ): result.extend(TreeModel.allChildren(index.child(row, column))) return result
def sort_table(self, index): """ sortira listu :param: index - oznacava po kojoj koloni/atributu se sortira """ index = self.table.horizontalHeader().sortIndicatorSection() # dobavljamo vrednost selektovanog headera nacin_sortiranja = self.table.horizontalHeader().sortIndicatorOrder() # dobavljamo koja vrednost sortiranja je oznacena self.table.sortByColumn(index, nacin_sortiranja) self.sortirano = True if nacin_sortiranja == Qt.AscendingOrder: # ako je prema vecem self.table.model().sort_list(index, False) else: # ako nije prema vecem nego prema manjem self.table.model().sort_list(index, True) top = QModelIndex() top.child(0,0) bottom = QModelIndex() bottom.child(len(self.table.model().lista_prikaz), self.table.model().broj_kolona) self.table.dataChanged(top, bottom) # da refresuje tabelu od top indexa to bottom indexa
def _uncheck_descendants(self, index: QtCore.QModelIndex) -> None: "Mark all descendants of index as unchecked" queue = [ index.child(i, index.column()) for i in range(self.rowCount(index)) ] while queue: item = queue.pop() self._set_check_state(item, QtCore.Qt.Unchecked) queue.extend( item.child(i, index.column()) for i in range(self.rowCount(item)))
def sacuvaj_podatke(self): if os.path.exists(self.privremena_datoteka): if self.tip_datoteke == "sekvencijalna": top = QModelIndex() top.child(0,0) self.parent().table.model().beginRemoveRows(top, 0, 0) if sastavi_sekvencijalnu(self): if os.path.exists(self.privremena_datoteka): os.remove(self.privremena_datoteka) else: poruka = QtWidgets.QMessageBox() icon = QtGui.QIcon("src/ikonice/logo.jpg") poruka.setWindowIcon(icon) poruka.setWindowTitle("Upozorenje!") poruka.setText("Privremena datoteka ne postoji!") poruka.exec_() self.parent().table.model().endRemoveRows() self.parent().table.model().beginInsertRows(QModelIndex(), 0, 0) top = QModelIndex() top.child(0,0) bottom = QModelIndex() bottom.child(len(self.parent().table.model().lista_prikaz), self.parent().table.model().broj_kolona) self.parent().table.dataChanged(top, bottom) self.parent().table.model().endInsertRows()
def index(self, row: int, column: int, parent: QModelIndex = None, *args, **kwargs): if not self.hasIndex(row, column, parent): return QModelIndex() parent = parent.internalPointer() if parent.isValid() else self.root child = parent.child(row) if child: return self.createIndex(row, column, child) else: return QModelIndex()
def dugme_kliknuto(self): try: for i in range(len(self.lista_atributa)): vrijednost = self.__getattribute__(self.lista_atributa[i]).text() if self.tip_datoteke == "sekvencijalna": brojac =0 if self.broj_kljuceva != ['']: for o in range(len(self.broj_kljuceva)): if self.broj_kljuceva != ['']: for k in range(int(self.broj_kljuceva[o])): self.ucitaj_kljuceve(self.putanja_kljucevi + self.roditelji[o],int(self.pozicije_u_datoteci[brojac])) vrijed = self.__getattribute__(self.lista_atributa[int(self.pozicije_u_formi[brojac])]).text() brojac +=1 if self.poredjenje(self.primarni_kljucevi,vrijed) == False: poruka = QtWidgets.QMessageBox() icon = QtGui.QIcon("src/ikonice/logo.jpg") poruka.setWindowIcon(icon) poruka.setWindowTitle("Upozorenje!") poruka.setText(" Jedno polje sadrzi kljuc koji ne postoji u roditeljskoj klasi! Pokusajte ponovo!") poruka.exec_() return else: continue if self.tip == 2: if len(vrijednost.strip()) == 0: continue if len(vrijednost) <= int(self.lista_duzine_atributa[i]): if bool(self.lista_obaveznosti_atributa[i]) == True and self.tip != 2: if vrijednost == "": poruka = QtWidgets.QMessageBox() icon = QtGui.QIcon("src/ikonice/logo.jpg") poruka.setWindowIcon(icon) poruka.setWindowTitle("Upozorenje!") poruka.setText(str(self.lista_atributa[i]).capitalize()+" polje ne sme biti prazno! Pokusajte ponovo!") poruka.exec_() return try: if isinstance(locate(self.lista_tipovi_atributa[i])(vrijednost), locate(self.lista_tipovi_atributa[i])) == False: poruka = QtWidgets.QMessageBox() icon = QtGui.QIcon("src/ikonice/logo.jpg") poruka.setWindowIcon(icon) poruka.setWindowTitle("Upozorenje!") poruka.setText(str(self.lista_atributa[i]).capitalize()+" polje pogresna vrednost! Pokusajte ponovo!") poruka.exec_() return except ValueError: poruka = QtWidgets.QMessageBox() icon = QtGui.QIcon("src/ikonice/logo.jpg") poruka.setWindowIcon(icon) poruka.setWindowTitle("Upozorenje!") poruka.setText(str(self.lista_atributa[i]).capitalize()+" polje pogresna vrednost! Pokusajte ponovo!") poruka.exec_() return self.element.__setattr__(self.lista_atributa[i], vrijednost) self.lista_atr.append(self.lista_atributa[i]) self.lista_kriterijuma.append(vrijednost) if self.tip == 2: self.lista_vece_manje.append(self.__getattribute__(self.lista_atributa[i]+"_vece_manje").currentIndex()) else: poruka = QtWidgets.QMessageBox() icon = QtGui.QIcon("src/ikonice/logo.jpg") poruka.setWindowIcon(icon) poruka.setWindowTitle("Upozorenje!") poruka.setText(str(self.lista_atributa[i]).capitalize() + ". Prekoracili ste duzinu karaktera!") poruka.exec_() return if self.tip == 1: if not self.parent().is_baza: with open(self.putanja_podaci, 'r',newline='') as csvfile: spamreader = csv.reader(csvfile, delimiter = "\n") counter = 0 prva_linija = True lista = [] for row in spamreader: if prva_linija: prva_linija = False continue if row[0] == "": break objekat = GenerickaKlasa(self.lista_atributa, row[0].split(",")) nadjen = True self.parent().table.model().lista_prikaz = [] for i in range(len(self.lista_atributa)): if objekat.__getattribute__(self.lista_atributa[i]) != self.original_elem.__getattribute__(self.lista_atributa[i]): nadjen = False if not nadjen: lista.append(objekat) else: for i in range(len(self.lista_atributa)): objekat.__setattr__(self.lista_atributa[i], self.element.__getattribute__(self.lista_atributa[i])) lista.append(objekat) counter += 1 self.parent().table.model().lista_prikaz = lista with open(self.putanja_podaci, 'w', newline='') as f: writer = csv.writer(f, delimiter = ",") writer.writerow([self.parent().putanja_meta]) for i in range(len(self.parent().table.model().lista_prikaz)): tekst = "" for j in range(len(self.lista_atributa)): tekst += str(self.parent().table.model().lista_prikaz[i].__getattribute__(self.lista_atributa[j])) if j < len(self.lista_atributa)-1: tekst += "," novi_red = tekst.split(",") writer.writerow(novi_red) else: parent = self.parent().pocetna_strana query = "UPDATE " + self.parent().naziv + " SET " block = False for i in range(len(self.lista_atributa)): block = False if self.blocked: for j in self.lista_kljuceva: if self.lista_atributa[i] == j: block = True break if block: continue query += self.lista_atributa[i] + "=" if self.lista_tipovi_atributa[i] == "str": query += "'" query += self.element.__getattribute__(self.lista_atributa[i]) if self.lista_tipovi_atributa[i] == "str": query += "'" if i < len(self.lista_atributa) - 1: query += " , " if len(self.lista_atributa) == len(self.lista_kljuceva) and self.blocked: return query += " WHERE " for i in range(len(self.lista_kljuceva)): query += self.lista_kljuceva[i] + "=" if self.lista_tipovi_atributa[i] == "str": query += "'" query += self.original_elem.__getattribute__(self.lista_kljuceva[i]) if self.lista_tipovi_atributa[i] == "str": query += "'" if i < len(self.lista_kljuceva) - 1: query += " AND " try: parent.csor.execute(query) except mysql.connector.errors.IntegrityError as e: poruka = QtWidgets.QMessageBox() icon = QtGui.QIcon("src/ikonice/logo.jpg") poruka.setWindowIcon(icon) poruka.setWindowTitle("Upozorenje!") poruka.setText("Vec postoji element sa zadatim kljucem!\n"+e.msg) poruka.exec_() parent.connection.commit() query = "SELECT * FROM " + self.parent().naziv parent.csor.execute(query) self.parent().table.model().lista_prikaz = [] for result in parent.csor.fetchall(): lista_podataka = [] for i in result: lista_podataka.append(str(i)) self.parent().table.model().lista_prikaz.append(GenerickaKlasa(self.lista_atributa, lista_podataka)) top = QModelIndex() top.child(0,0) bottom = QModelIndex() bottom.child(len(self.parent().table.model().lista_prikaz), self.parent().table.model().broj_kolona) self.parent().table.dataChanged(top, bottom) elif self.tip == 0: if self.tip_datoteke == "sql": parent = self.parent().pocetna_strana query = "INSERT INTO " + self.parent().naziv +" (" brojac =0 for i in range(len(self.lista_atributa)): query += self.lista_atributa[i] if brojac < len(self.lista_atributa)-1: query += ", " brojac += 1 query += ") " + "VALUES (" brojac2=0 for i in range(len(self.lista_atributa)): if self.lista_tipovi_atributa[i] == "str": query += "'"+self.__getattribute__(self.lista_atributa[i]).text()+"'" else: query += self.__getattribute__(self.lista_atributa[i]).text() if brojac2 < len(self.lista_atributa)-1: query += ", " brojac2 += 1 query += ")" provjeri = True try: parent.csor.execute(query) except mysql.connector.errors.IntegrityError as e: poruka = QtWidgets.QMessageBox() provjeri=False icon = QtGui.QIcon("src/ikonice/logo.jpg") poruka.setWindowIcon(icon) poruka.setWindowTitle("Upozorenje!") poruka.setText("Vec postoji element sa zadatim kljucem!\n"+e.msg) poruka.exec_() except mysql.connector.errors.DataError as e: poruka = QtWidgets.QMessageBox() provjeri=False icon = QtGui.QIcon("src/ikonice/logo.jpg") poruka.setWindowIcon(icon) poruka.setWindowTitle("Upozorenje!") poruka.setText("Uneli ste pogresnu vrednost!\n"+e.msg) poruka.exec_() parent.connection.commit() query = "SELECT * FROM " + self.parent().naziv parent.csor.execute(query) self.parent().table.model().lista_prikaz = [] for result in parent.csor.fetchall(): lista_podataka = [] for i in result: lista_podataka.append(str(i)) self.parent().table.model().lista_prikaz.append(GenerickaKlasa(self.lista_atributa, lista_podataka)) top = QModelIndex() top.child(0,0) bottom = QModelIndex() bottom.child(len(self.parent().table.model().lista_prikaz), self.parent().table.model().broj_kolona) self.parent().table.dataChanged(top, bottom) if provjeri: self.parent().table.model().beginInsertRows(QModelIndex(), 0, 0) model = self.parent().table.model() model.lista_prikaz.append(self.element) self.parent().table.setModel(model) self.parent().table.model().endInsertRows() if self.tip_datoteke == "serijska": dodaj_u_serijsku(self.element, self.lista_atributa, self.putanja_podaci, self.parent().putanja) self.parent().table.model().beginInsertRows(QModelIndex(), 0, 0) model = self.parent().table.model() model.lista_prikaz.append(self.element) self.parent().table.setModel(model) self.parent().table.model().endInsertRows() elif self.tip_datoteke == "sekvencijalna": dodaj_u_serijsku(self.element, self.lista_atributa, self.privremena_datoteka, self.parent().putanja) top = QModelIndex() top.child(0,0) bottom = QModelIndex() bottom.child(len(self.parent().table.model().lista_prikaz), self.parent().table.model().broj_kolona) self.parent().table.dataChanged(top, bottom) elif self.tip == 2: self.close() except ValueError: poruka = QtWidgets.QMessageBox() icon = QtGui.QIcon("src/ikonice/logo.jpg") poruka.setWindowIcon(icon) poruka.setWindowTitle("Upozorenje!") poruka.setText("Pogresna vrednost!") poruka.exec_() return
def _iter_children(idx: QModelIndex): for i in range(idx.model().rowCount(idx)): yield idx.child(i, 0)
def ukloni_iz_tabele(self): if self.central_widget.currentWidget() == None: poruka = QMessageBox() icon = QtGui.QIcon("src/ikonice/logo.jpg") poruka.setWindowIcon(icon) poruka.setWindowTitle("Upozorenje!") poruka.setText("Trenutno nijedna datoteka nije otvorena!") poruka.exec_() return elif not hasattr(self.central_widget.currentWidget().table, "selected_elem"): poruka = QMessageBox() icon = QtGui.QIcon("src/ikonice/logo.jpg") poruka.setWindowIcon(icon) poruka.setWindowTitle("Upozorenje") poruka.setText("Trenutno nijedan element nije selektovan!") poruka.exec_() return ime_datoteke = self.central_widget.currentWidget().meta_podaci[0] tip_datoteke = self.central_widget.currentWidget().meta_podaci[1] model = self.central_widget.currentWidget().table.model() element_selected = model.get_element(self.central_widget.currentWidget().table.selected_elem) putanja = self.central_widget.currentWidget().meta_podaci[4] lista_kljuceva = self.central_widget.currentWidget().meta_podaci[11].split(",") lista_atributa = self.central_widget.currentWidget().meta_podaci[5].split(",") lista_tip_atributa = self.central_widget.currentWidget().meta_podaci[6].split(",") veze = [] veze = self.central_widget.currentWidget().meta_podaci[9].split(",") #DELETE FROM plan_studijske_grupe WHERE STU_VU_OZNAKA='IR' AND SP_OZNAKA='IT' AND SPB_BLOK=2 AND SPB_POZICIJA=2; if tip_datoteke == "sql": query= " DELETE FROM " + ime_datoteke + " WHERE " brojac = 0 for i in range(len(lista_kljuceva)): if brojac == 0: query+= lista_kljuceva[i] + "=" else: query += " AND " + lista_kljuceva[i] + "=" if lista_tip_atributa[i] == "str": query += "'" + element_selected.__getattribute__(lista_atributa[i]) +"'" else: query += element_selected.__getattribute__(lista_atributa[i]) brojac +=1 query += ";" try: self.csor.execute(query) except mysql.connector.errors.IntegrityError as e: poruka = QtWidgets.QMessageBox() icon = QtGui.QIcon("src/ikonice/logo.jpg") poruka.setWindowIcon(icon) poruka.setWindowTitle("Upozorenje!") poruka.setText("Ne mozete izbrisati ovaj element!\n"+e.msg) poruka.exec_() return self.connection.commit() query = "SELECT * FROM " + ime_datoteke self.csor.execute(query) self.central_widget.currentWidget().table.model().lista_prikaz = [] for result in self.csor.fetchall(): lista_podataka = [] for i in result: lista_podataka.append(str(i)) self.central_widget.currentWidget().table.model().lista_prikaz.append(GenerickaKlasa(lista_atributa, lista_podataka)) top = QModelIndex() top.child(0,0) self.central_widget.currentWidget().table.model().beginRemoveRows(top, 0, 0) for i in range(len(veze)): #provjaravamo da li ima djecu, ako ima ne smije se obrisati if hasattr(self.central_widget.currentWidget(), "sub_table"+str(i+1)): if len(self.central_widget.currentWidget().__getattribute__("sub_table"+str(i+1)).model.lista_prikaz) != 0: poruka = QMessageBox() icon = QtGui.QIcon("src/ikonice/logo.jpg") poruka.setWindowIcon(icon) poruka.setWindowTitle("Upozorenje!") poruka.setText("Selektovani element ne sme da se obrise zato sto se njegovi podaci koriste u podtabelama, njegovoj deci!") poruka.exec_() return self.central_widget.currentWidget().table.model().lista_prikaz = [] if tip_datoteke != "sql": with open(putanja, 'r',newline='') as csvfile: spamreader = csv.reader(csvfile, delimiter = "\n") counter = 0 prva_linija = True izbrisan = False for row in spamreader: if prva_linija: prva_linija = False continue if len(row) == 0: break objekat = GenerickaKlasa(lista_atributa, row[0].split(",")) nadjen = True for i in range(len(lista_kljuceva)): if objekat.__getattribute__(lista_kljuceva[i]) != element_selected.__getattribute__(lista_kljuceva[i]): nadjen = False if not izbrisan and nadjen: izbrisan = True self.central_widget.currentWidget().table.model().removeRow(counter) #uklanjamo red iz tabele else: self.central_widget.currentWidget().table.model().lista_prikaz.append(objekat) counter += 1 with open(putanja, 'w', newline='') as f: writer = csv.writer(f, delimiter = ",") writer.writerow([self.central_widget.currentWidget().putanja_meta]) for i in range(len(self.central_widget.currentWidget().table.model().lista_prikaz)): tekst = "" for j in range(len(lista_atributa)): tekst += str(self.central_widget.currentWidget().table.model().lista_prikaz[i].__getattribute__(lista_atributa[j])) if j < len(lista_atributa)-1: tekst += "," novi_red = tekst.split(",") writer.writerow(novi_red) else: query = "SELECT * FROM " + ime_datoteke self.csor.execute(query) for result in self.csor.fetchall(): lista_podataka = [] for i in result: lista_podataka.append(str(i)) self.central_widget.currentWidget().table.model().lista_prikaz.append(GenerickaKlasa(lista_atributa, lista_podataka)) self.central_widget.currentWidget().table.model().endRemoveRows()