class NormaOdk(QWidget):
    def __init__(self, parent):
        super(QWidget, self).__init__(parent)
        self.skrot = QShortcut(QKeySequence(Qt.Key_Return), self)
        self.naglowki = {
            'iddetale': 'ID',
            'nr_detalu': 'Detal',
            'maszyna': 'Maszyna',
            "ilosc_m": 'Ilość maszyn',
            'ilosc_szt': 'Ilość sztuk na operację',
            'nazwa_op': 'Nazwa operacji',
            'nr_op': 'Nr operacji',
            'tm': 'Czas Tm [s]',
            'tp': 'Czas Tp [s]',
            'tj': 'Czas Tj [h]',
            'norma': 'Norma [szt.]',
            'uwagi': 'Uwagi',
            'id_uzytkownika': 'Użytkownik'
        }
        self.proxy = QSortFilterProxyModel(self)
        self.parent = parent
        self.formularz = QGroupBox("Normy")
        self.lbl_w = QLabel("Wyszukaj")
        self.edit_w = QLineEdit(self)
        self.table = QTableView(self)
        self.btn_odswiez = QPushButton("Odśwież bazę")
        sciezka = czy_istnieje()
        self.db = QSqlDatabase.addDatabase('QSQLITE')
        self.db.setDatabaseName(sciezka)
        if self.db.open():
            print('Otworzono bazę danych')
        self.model = QSqlRelationalTableModel(self, self.db)
        self.initUI()

    def initUI(self):
        # Zainicjowanie tabeli zawsze przed wszystkim
        self.tabela()

        # lista wybieralna
        with open('./resources/Maszyny i operacje.json', 'r',
                  encoding='utf-8') as file:
            plik_json = json.load(file)
        masz = plik_json['Maszyny']
        operacje = plik_json['Operacje']
        self.table.setItemDelegateForColumn(2, ComboDelegate(self, masz))
        self.table.setItemDelegateForColumn(6, ComboDelegate(self, operacje))
        for row in range(0, self.model.rowCount()):
            self.table.openPersistentEditor(self.model.index(row, 2))
            self.table.openPersistentEditor(self.model.index(row, 6))

        # Zatwierdzenie
        ok_button = QPushButton("Dodaj")
        cancel_button = QPushButton("Cofnij")
        hbox = QHBoxLayout()
        hbox.addStretch(1)
        hbox.addWidget(self.btn_odswiez)
        hbox.addWidget(ok_button)
        hbox.addWidget(cancel_button)

        # Layouty
        layout_v = QVBoxLayout()
        layout_h = QHBoxLayout()

        # Tabela
        self.proxy.setSourceModel(self.model)
        self.table.setModel(self.proxy)

        # przyporządkowanie
        layout_h.addWidget(self.lbl_w)
        layout_h.addWidget(self.edit_w)
        layout_v.addLayout(layout_h)
        layout_v.addWidget(self.table)
        self.formularz.setLayout(layout_v)

        main_layout = QVBoxLayout()
        main_layout.addWidget(self.formularz)
        main_layout.addLayout(hbox)
        self.setLayout(main_layout)

        # export
        # self.export()
        # Funkcje
        cancel_button.clicked.connect(self.anulowanie)
        ok_button.clicked.connect(self.dodaj)
        self.edit_w.textChanged.connect(self.wyszukiwanie)
        self.btn_odswiez.clicked.connect(self.refresh_db)
        self.skrot.activated.connect(self.refresh_db)
        # Menu kontekstowe własne
        self.table.setContextMenuPolicy(Qt.CustomContextMenu)
        self.table.customContextMenuRequested.connect(self.prawoklik)

    def prawoklik(self):
        menu = QMenu(self)
        if self.model.rowCount():
            akcja = QAction('Usuń wiersz', self)
            akcja.triggered.connect(self.usun_wiersz)
            menu.addAction(akcja)
            menu.exec_(QCursor.pos())

    def usun_wiersz(self):
        ok = QMessageBox.question(self, 'Potwierdzenie',
                                  'Czy na pewno chcesz usunąć pozycję?',
                                  QMessageBox.Ok, QMessageBox.Cancel)
        if ok == QMessageBox.Ok:
            selected = self.table.currentIndex()
            self.model.removeRow(selected.row())
            self.model.submitAll()
            self.model.select()

    @pyqtSlot(str)
    def wyszukiwanie(self, text):
        search = QRegExp(text, Qt.CaseInsensitive, QRegExp.RegExp)
        self.proxy.setFilterRegExp(search)
        # Odpowiedzialne za kolumnę, po której filtruje
        self.proxy.setFilterKeyColumn(-1)

    @pyqtSlot()
    def uzupelniene(self):
        # Pobranie tp, tm z bazy
        query = 'SELECT iddetale, tm, tp, ilosc_m, ilosc_szt FROM detale'
        dane_db = multipolaczenie(query)
        for i in range(len(dane_db)):
            # if dane_db[i][1] and dane_db[i][2]:
            tm = dane_db[i][1]
            tp1 = dane_db[i][2]
            ilosc_m = dane_db[i][3]
            ilosc_szt = dane_db[i][4]
            if not ilosc_m:
                ilosc_m = 1
                zm = 1
            else:
                zm = 0.95
            if not ilosc_szt:
                ilosc_szt = 1
            if isinstance(tm, int) and isinstance(tp1, int):
                tw = tm + tp1
            else:
                tw = 0
            tp2 = tw * 0.05
            tj = (tw + tp2) * 1.1
            tjh = tj / 3600

            if tj != 0:
                norma = 8 / tj * 3600 * ilosc_m * zm * ilosc_szt
            else:
                norma = 0
            print(round(norma))
            # update bazy
            query = 'UPDATE "detale" SET "tj" = ' + str(round(
                tjh, 5)) + ', "norma" = ' + str(
                    round(norma)) + ' WHERE "iddetale" = ' + str(dane_db[i][0])
            update_bazy(query)
            # query = 'UPDATE "detale" SET "norma" = ' + str(round(norma)) +
            # ' WHERE "iddetale" = ' + str(dane_db[i][0]) update_bazy(query)

    @pyqtSlot()
    def refresh_db(self):
        try:
            self.uzupelniene()
        except:
            pass
        # Odświeżenie tabeli
        self.model.select()

    def tabela(self):
        self.model.setTable('detale')
        self.model.setRelation(
            12, QSqlRelation('uzytkownicy', 'iduzytkownicy', 'nazwa_uz'))
        # Za zmianę w bazie odpowiada OnFieldChange
        self.model.setEditStrategy(QSqlTableModel.OnFieldChange)

        # Ustawianie nagłówków
        ilosc_kolumn = self.model.columnCount()
        for i in range(ilosc_kolumn):
            nazwa_kolumn = self.model.headerData(i, Qt.Horizontal)
            self.model.setHeaderData(i, Qt.Horizontal,
                                     self.naglowki[nazwa_kolumn])
        self.model.select()

        # Odpowiada za edycję pojednynczym kliknieciem
        '''
        Constant    Value   Description
        QAbstractItemView::NoEditTriggers   0   No editing possible.
        QAbstractItemView::CurrentChanged   1   Editing start whenever current item changes.
        QAbstractItemView::DoubleClicked    2   Editing starts when an item is double clicked.
        QAbstractItemView::SelectedClicked  4   Editing starts when clicking on an already selected item.
        QAbstractItemView::EditKeyPressed   8   Editing starts when the platform edit key has been pressed over an item.
        QAbstractItemView::AnyKeyPressed    16  Editing starts when any key is pressed over an item.
        QAbstractItemView::AllEditTriggers  31  Editing starts for all above actions.
        '''
        if self.odczyt():
            self.table.setEditTriggers(QAbstractItemView.AllEditTriggers)
        else:
            self.table.setEditTriggers(QAbstractItemView.NoEditTriggers)
        self.table.setSelectionMode(QAbstractItemView.SingleSelection)
        self.table.verticalHeader().setVisible(False)
        self.table.setSortingEnabled(True)
        self.table.resizeColumnsToContents()
        self.table.setModel(self.model)
        self.table.setAlternatingRowColors(True)
        self.table.resizeColumnsToContents()

        # self.table.doubleClicked.connect(self.klikniecie)

    def anulowanie(self):
        self.parent.statusBar().clearMessage()
        from opcje_qt import Wewnatrz
        menu_gl = Wewnatrz(self.parent)
        self.parent.setCentralWidget(menu_gl)

    def odczyt(self):
        id = str(self.parent.id_user[0])
        query = 'SELECT odczyt FROM uzytkownicy WHERE iduzytkownicy=' + id
        return polaczenie(query)[0]

    def dodaj(self):
        poz, masz, op, tm, tp, ok = MultiDialog().getMultidialog(self)
        print(poz, masz, op, tm, tp, ok)
        id = self.parent.id_user[0]
        if ok and poz:
            query = "INSERT INTO detale(nr_detalu,maszyna,nazwa_op,tm,tp," \
                    "id_uzytkownika) VALUES ('" + poz + "','" + masz + "','" + op + "','" + tm + "','" + tp + "','" + str(
                id) + "');"
            print(query)
            polaczenie(query)
            if tm and tp:
                try:
                    self.uzupelniene()
                except:
                    pass
            self.model.select()
            self.parent.statusBar().showMessage("Dodano nową pozycję", 10000)
        else:
            print("Nie wpisano pozycji")
Exemple #2
0
class ServEmpl(QWidget):
    """
    Klasa odpowiedzialna za widget pracownicy-usługi
    """

    def __init__(self, parent, db):
        super(QWidget, self).__init__(parent)
        self.parent = parent
        self.lbl_imie = QLabel()
        self.lbl_nazwisko = QLabel()
        self.view_p = QTableView()
        self.view_pu = QTableView()
        self.view_u = QTableView()
        self.proxy_p = QSortFilterProxyModel(self)
        self.proxy_pu = QSortFilterProxyModel(self)
        self.proxy_u = QSortFilterProxyModel(self)
        self.id_pracownik = -1

        # Parametry połączenia z bazą
        self.model_p = QSqlTableModel(self, db)
        self.model_pu = QSqlRelationalTableModel(self, db)
        self.model_u = QSqlTableModel(self, db)

        self.initUI()

    def initUI(self):
        """
        Inicjuje UI
        """
        pracownicy = '''
        Kliknij <u>tutaj</u> aby wybrać danego pracownika.
        Poniżej znajdują się wszystkie usługi, jakie dany pracownik może robić.
        '''
        uslugi = '''
        Kliknij dwukrotnie <u>tutaj</u> aby <b>przypisać</b> daną usługę do wybranego pracownika.
        '''
        pracownik_uslugi = '''
        Kliknij dwukrotnie <u>tutaj</u> aby <b>usunąć</b> przypisanie danej usługi pracownikowi.
        '''
        self.table_init_u()
        self.table_init_p()
        self.table_init_pu()
        self.view_p.setToolTip(pracownicy)
        self.view_u.setToolTip(uslugi)
        self.view_pu.setToolTip(pracownik_uslugi)

        # Tworzenie kontrolek
        lbl_wyszukaj = QLabel('Wyszukaj pracownika:')
        lbl_imie_static = QLabel('Imię:')
        lbl_nazwisko_static = QLabel('Nazwisko:')
        txt_wysz = QLineEdit(self)

        # Tworzenie widoków
        centralbox = QHBoxLayout()
        hbox_p = QHBoxLayout()
        hbox_pu = QHBoxLayout()
        hbox_u = QHBoxLayout()
        vbox_right = QVBoxLayout()
        vbox_left = QVBoxLayout()
        groupbox_p = QGroupBox('Pracownicy')
        groupbox_pu = QGroupBox('Wykonywane usługi')
        groupbox_u = QGroupBox('Usługi')
        formbox = QFormLayout()

        # Metody
        txt_wysz.textChanged.connect(self.searching)
        self.view_p.clicked.connect(self.change_p)
        self.view_u.doubleClicked.connect(lambda: self.change_add_remove(True))
        self.view_pu.doubleClicked.connect(lambda: self.change_add_remove(False))

        # Ustawianie widoków
        formbox.addRow(lbl_wyszukaj, txt_wysz)
        formbox.addRow(lbl_imie_static, self.lbl_imie)
        formbox.addRow(lbl_nazwisko_static, self.lbl_nazwisko)
        formbox.setSpacing(15)
        vbox_left.addLayout(formbox)
        vbox_left.addWidget(groupbox_u)
        vbox_left.setSpacing(200)
        hbox_p.addWidget(self.view_p)
        hbox_pu.addWidget(self.view_pu)
        hbox_u.addWidget(self.view_u)
        groupbox_p.setLayout(hbox_p)
        groupbox_pu.setLayout(hbox_pu)
        groupbox_u.setLayout(hbox_u)
        vbox_right.addWidget(groupbox_p)
        vbox_right.addWidget(groupbox_pu)
        vbox_right.setSpacing(25)
        centralbox.addLayout(vbox_left)
        centralbox.addLayout(vbox_right)
        self.setLayout(centralbox)
        self.show()

    def change_p(self):
        """
        Metoda edytująca zaznaczone wiersze - Wstawia wartości z wierszy w odpowiednie pola
        """
        index = (self.view_p.selectionModel().currentIndex())
        self.id_pracownik = index.sibling(index.row(), 0).data()
        self.lbl_imie.setText("<b>" + index.sibling(index.row(), 2).data() + "</b>")
        self.lbl_nazwisko.setText("<b>" + index.sibling(index.row(), 3).data() + "</b>")

        # Odświeżanie widoku tabeli
        query = QSqlQuery(
            'SELECT uslugi.uslugi_id, uslugi.nazwa, uslugi.cena, uslugi.czas FROM uslugi, uzytkownik_usluga WHERE '
            'uslugi.uslugi_id = uzytkownik_usluga.uslugi_id AND uzytkownik_usluga.uzytkownik_id = ' + str(
                self.id_pracownik) + ';')
        self.model_pu.setQuery(query)
        self.view_pu.reset()

    def change_add_remove(self, quest):
        """
        Metoda ogólna odpowiadająca za dodawanie i usuwanie usług wybranemu pracownikowi
        """
        tekst_p = "Czy chcesz dodać nową usługę do użytkownika {}?".format(self.lbl_imie.text())
        if quest:
            index = (self.view_u.selectionModel().currentIndex())
            id_modify = index.sibling(index.row(), 0).data()
            ret = QMessageBox.question(self, 'Dodawanie usługi', tekst_p,
                                       QMessageBox.Yes | QMessageBox.No, QMessageBox.No)
            if ret == QMessageBox.Yes:
                query = 'INSERT INTO uzytkownik_usluga (uzytkownik_id, uslugi_id) VALUES (%s, %s); '
                val = (
                    self.id_pracownik,
                    id_modify
                )
                if query_to_db(query, val):
                    msg = QMessageBox()
                    msg.setIcon(QMessageBox.Information)
                    msg.setText('Usługa została dodana do usług oferowanych przez pracownika')
                    msg.setWindowTitle("Dodano usługę")
                    msg.exec_()
        else:
            index = (self.view_pu.selectionModel().currentIndex())
            id_modify = index.sibling(index.row(), 0).data()
            ret = QMessageBox.question(self, 'Usuwanie usługi', "Czy na pewno chcesz usunąć daną usługę?",
                                       QMessageBox.Yes | QMessageBox.No, QMessageBox.No)
            if ret == QMessageBox.Yes:
                query = 'DELETE FROM uzytkownik_usluga WHERE uzytkownik_id = %s AND uslugi_id = %s; '
                val = (
                    self.id_pracownik,
                    id_modify
                )
                if query_to_db(query, val):
                    msg = QMessageBox()
                    msg.setIcon(QMessageBox.Information)
                    msg.setText('Usługa została dodana do usług oferowanych przez pracownika')
                    msg.setWindowTitle("Dodano usługę")
                    msg.exec_()
        # Odświeżanie widoku tabeli
        query = QSqlQuery(
            'SELECT uslugi.uslugi_id, uslugi.nazwa, uslugi.cena, uslugi.czas FROM uslugi, uzytkownik_usluga WHERE '
            'uslugi.uslugi_id = uzytkownik_usluga.uslugi_id AND uzytkownik_usluga.uzytkownik_id = ' + str(
                self.id_pracownik) + ';')
        self.model_pu.setQuery(query)
        self.view_pu.reset()

    def table_init_u(self):
        """
        Inicjuje wygląd tabeli usługi
        """
        self.model_u.setTable('uslugi')
        # query = QSqlQuery('SELECT uzytkownik_id, uzytkownik_nazwa, imie, nazwisko, pracownik FROM uzytkownik;')
        # self.model.setQuery(query)
        self.model_u.select()

        self.proxy_u.setSourceModel(self.model_u)

        naglowki = {
            'uslugi_id': 'ID',
            'nazwa': 'Nazwa',
            'cena': 'Cena',
            "czas": 'Czas',
            'Opis': 'Opis',
        }
        # Ustawianie nagłówków
        ilosc_kolumn = self.model_u.columnCount()
        for i in range(ilosc_kolumn):
            nazwa_kolumn = self.model_u.headerData(i, Qt.Horizontal)
            self.model_u.setHeaderData(i, Qt.Horizontal, naglowki[nazwa_kolumn])

        self.view_u.setSizeAdjustPolicy(QAbstractScrollArea.AdjustToContentsOnFirstShow)
        self.view_u.setSortingEnabled(True)
        self.view_u.setAlternatingRowColors(True)

        # Wczytanie danych
        self.view_u.setModel(self.proxy_u)
        self.view_u.hideColumn(0)
        self.view_u.sortByColumn(1, Qt.AscendingOrder)
        self.view_u.setEditTriggers(QAbstractItemView.NoEditTriggers)

    def table_init_p(self):
        """
        Inicjuje wygląd tabeli pracownicy
        """
        self.model_p.setTable('pracownicy')
        query = QSqlQuery('SELECT uzytkownik_id, uzytkownik_nazwa, imie, nazwisko, pracownik FROM uzytkownik WHERE pracownik = 1;')
        self.model_p.setQuery(query)
        # self.model_u.select()

        self.proxy_p.setSourceModel(self.model_p)

        naglowki = {
            'uzytkownik_id': 'ID',
            'uzytkownik_nazwa': 'Login',
            'imie': 'Imię',
            "nazwisko": 'Nazwisko',
            'pracownik': 'Pracownik',
        }
        # Ustawianie nagłówków
        ilosc_kolumn = self.model_p.columnCount()
        for i in range(ilosc_kolumn):
            nazwa_kolumn = self.model_p.headerData(i, Qt.Horizontal)
            self.model_p.setHeaderData(i, Qt.Horizontal, naglowki[nazwa_kolumn])

        self.view_p.setSizeAdjustPolicy(QAbstractScrollArea.AdjustToContentsOnFirstShow)
        self.view_p.setSortingEnabled(True)
        self.view_p.setAlternatingRowColors(True)

        # Wczytanie danych
        self.view_p.setModel(self.proxy_p)
        self.view_p.hideColumn(0)
        self.view_p.hideColumn(4)
        self.view_p.sortByColumn(1, Qt.AscendingOrder)
        self.view_p.setEditTriggers(QAbstractItemView.NoEditTriggers)

    def table_init_pu(self):
        """
        Inicjuje wygląd tabeli pracownicy-usługi
        """
        query = QSqlQuery(
            'SELECT uslugi.uslugi_id, uslugi.nazwa, uslugi.cena, uslugi.czas FROM uslugi, uzytkownik_usluga WHERE '
            'uslugi.uslugi_id = uzytkownik_usluga.uslugi_id AND uzytkownik_usluga.uzytkownik_id = ' + str(
                self.id_pracownik) + ';')
        self.model_pu.setQuery(query)

        self.proxy_pu.setSourceModel(self.model_pu)

        naglowki = {
            'uslugi_id': 'ID usługi',
            'nazwa': 'Nazwa usługi',
            'cena': 'Cena',
            'czas': 'Czas'
        }
        # Ustawianie nagłówków
        ilosc_kolumn = self.model_pu.columnCount()
        for i in range(ilosc_kolumn):
            nazwa_kolumn = self.model_pu.headerData(i, Qt.Horizontal)
            self.model_pu.setHeaderData(i, Qt.Horizontal, naglowki[nazwa_kolumn])

        self.view_pu.setSizeAdjustPolicy(QAbstractScrollArea.AdjustToContentsOnFirstShow)
        self.view_pu.setSortingEnabled(True)
        self.view_pu.setAlternatingRowColors(True)

        # Wczytanie danych
        self.view_pu.setModel(self.proxy_pu)
        self.view_pu.hideColumn(0)
        self.view_pu.sortByColumn(1, Qt.AscendingOrder)
        self.view_pu.setEditTriggers(QAbstractItemView.NoEditTriggers)

    @pyqtSlot(str)
    def searching(self, text):
        """
        Wyszukuje po wszystkich kolumnach tabeli
        :param text:
        """
        search = QRegExp(text,
                         Qt.CaseInsensitive,
                         QRegExp.RegExp
                         )
        self.proxy_p.setFilterRegExp(search)
        # Odpowiedzialne za kolumnę, po której filtruje
        self.proxy_p.setFilterKeyColumn(1)