diff --git a/.gitignore b/.gitignore index f717486..1b8007e 100644 --- a/.gitignore +++ b/.gitignore @@ -123,3 +123,6 @@ dmypy.json # Pyre type checker .pyre/ + +# PyCharm +.idea/ \ No newline at end of file diff --git a/.idea/workspace.xml b/.idea/workspace.xml index 14d0d6d..eeff455 100644 --- a/.idea/workspace.xml +++ b/.idea/workspace.xml @@ -1,7 +1,17 @@ - + + + + + + + + + + + + + + + + @@ -102,7 +117,7 @@ + + @@ -205,11 +223,17 @@ + + + + + + - @@ -224,38 +248,46 @@ - + + + + + + + + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - + @@ -268,10 +300,10 @@ - + - + @@ -282,15 +314,15 @@ - - - - - + + + + - - - + + + + \ No newline at end of file diff --git a/MainWindow.ui b/MainWindow.ui deleted file mode 100644 index ab1d50f..0000000 --- a/MainWindow.ui +++ /dev/null @@ -1,722 +0,0 @@ - - - Program - - - - 0 - 0 - 953 - 578 - - - - MainWindow - - - - - - - QTabWidget::South - - - 5 - - - - Tab 1 - - - - - - - 0 - 0 - - - - GroupBox - - - Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter - - - - - - TextLabel - - - - - - - TextLabel - - - - - - - - - - TextLabel - - - - - - - - - - - - - PushButton - - - - - - - - - - - Tab 2 - - - - - - - New Row - - - - - New Row - - - - - New Row - - - - - New Column - - - - - New Column - - - - - New Column - - - - - - - - Checked - - - - - - - - - Page - - - - - - - - - - Wyszukaj zabieg: - - - - - - - - - - - - Zabiegi - - - - - - - - Nazwa: - - - - - - - - - - Cena: - - - - - - - - - - Czas: - - - - - - - - - - Opis: - - - - - - - - - - - - - - - - - - Usuń - - - - - - - Modyfikuj - - - - - - - Dodaj - - - - - - - - - - - - - - - - - - Page - - - - - - - - - - Wyszukaj pracownika: - - - - - - - - - - Imię: - - - - - - - Jakub - - - - - - - Nazwisko: - - - - - - - Hawro - - - - - - - - - Qt::Vertical - - - QSizePolicy::Expanding - - - - 0 - 0 - - - - - - - - Usługi: - - - - - - - - - - - - - - - - Pracownicy: - - - - - - Podpowiedź - - - 1 - - - Pracownicy Tip - - - Pracownicy - - - - - - - - - - Qt::Vertical - - - QSizePolicy::Preferred - - - - 20 - 52 - - - - - - - - Wykonywane usługi: - - - - - - - - - - - - - - - Page - - - - - - - - Wyszukaj klienta: - - - - - - - - - - - - - - - Edycja danych klienta - - - - - - - - - - - Nazwisko: - - - - - - - - - - Email: - - - - - - - - - - Telefon: - - - - - - - - - - Imię: - - - - - - - - - - - - - - Numer domu: - - - - - - - - - - Kod pocztowy: - - - - - - - - - - Miejscowość: - - - - - - - - - - Ulica: - - - - - - - - - - - - - - Usuń - - - - - - - Modyfikuj - - - - - - - Dodaj - - - - - - - - - - Page - - - - - - - - - - - 0 - 0 - - - - - - - - - - Termin: - - - - - - - - - - - - - - Klient: - - - - - - - <put here> - - - - - - - - - - - Usługa: - - - - - - - <put here> - - - - - - - - - - 0 - 0 - - - - - - - - - - Usuń - - - - - - - Modyfikuj - - - - - - - - - Dodaj - - - - - - - - - Godziny: - - - - - - - - - - - - - - - Wyszukaj usługę: - - - - - - - - - - - - - - - - - - - Wyszukaj klienta: - - - - - - - - - - - - - - - - - - - Wyszukaj pracownika: - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/UIWidgets.ui b/UIWidgets.ui deleted file mode 100644 index c8def3d..0000000 --- a/UIWidgets.ui +++ /dev/null @@ -1,68 +0,0 @@ - - - Dialog - - - - 0 - 0 - 320 - 240 - - - - Logowanie - - - - - 10 - 200 - 301 - 32 - - - - Qt::Horizontal - - - QDialogButtonBox::Cancel|QDialogButtonBox::Ok - - - - - - - buttonBox - accepted() - Dialog - accept() - - - 248 - 254 - - - 157 - 274 - - - - - buttonBox - rejected() - Dialog - reject() - - - 316 - 260 - - - 286 - 274 - - - - - diff --git a/baza.py b/baza.py index b2b13b7..66eaaea 100644 --- a/baza.py +++ b/baza.py @@ -46,7 +46,7 @@ def polaczenie(q, sqlinjection=None): mydb.close() print("Zamknięto połączenie") - return myresult + return myresult or True def transakcja(*args): diff --git a/documentations/Diagram Class/Diagram Class.pdf b/documentations/Diagram Class/Diagram Class.pdf new file mode 100644 index 0000000..f5f96c9 Binary files /dev/null and b/documentations/Diagram Class/Diagram Class.pdf differ diff --git a/documentations/Diagram Class/KlienciUML.PNG b/documentations/Diagram Class/KlienciUML.PNG new file mode 100644 index 0000000..1a94e39 Binary files /dev/null and b/documentations/Diagram Class/KlienciUML.PNG differ diff --git a/documentations/Diagram Class/MainUML.PNG b/documentations/Diagram Class/MainUML.PNG new file mode 100644 index 0000000..0ad8734 Binary files /dev/null and b/documentations/Diagram Class/MainUML.PNG differ diff --git a/documentations/Diagram Class/PracownicyUML.PNG b/documentations/Diagram Class/PracownicyUML.PNG new file mode 100644 index 0000000..bc21bcc Binary files /dev/null and b/documentations/Diagram Class/PracownicyUML.PNG differ diff --git "a/documentations/Diagram Class/PracownicyUs\305\202ugiUML.PNG" "b/documentations/Diagram Class/PracownicyUs\305\202ugiUML.PNG" new file mode 100644 index 0000000..762cd97 Binary files /dev/null and "b/documentations/Diagram Class/PracownicyUs\305\202ugiUML.PNG" differ diff --git a/documentations/Diagram Class/ProgramUML.PNG b/documentations/Diagram Class/ProgramUML.PNG new file mode 100644 index 0000000..f66507c Binary files /dev/null and b/documentations/Diagram Class/ProgramUML.PNG differ diff --git a/documentations/Diagram Class/RezerwacjeUML.PNG b/documentations/Diagram Class/RezerwacjeUML.PNG new file mode 100644 index 0000000..08ab4eb Binary files /dev/null and b/documentations/Diagram Class/RezerwacjeUML.PNG differ diff --git "a/documentations/Diagram Class/Us\305\202ugiUML.PNG" "b/documentations/Diagram Class/Us\305\202ugiUML.PNG" new file mode 100644 index 0000000..9e210cb Binary files /dev/null and "b/documentations/Diagram Class/Us\305\202ugiUML.PNG" differ diff --git "a/documentations/Diagram Class/ZmianaHas\305\202aUML.PNG" "b/documentations/Diagram Class/ZmianaHas\305\202aUML.PNG" new file mode 100644 index 0000000..4771191 Binary files /dev/null and "b/documentations/Diagram Class/ZmianaHas\305\202aUML.PNG" differ diff --git a/documentations/Diagram Class/klienci.uml b/documentations/Diagram Class/klienci.uml new file mode 100644 index 0000000..939981a --- /dev/null +++ b/documentations/Diagram Class/klienci.uml @@ -0,0 +1,37 @@ + + + Python + #D:/Programowanie/Weterynarz/klienci.py + + PyQt5.QtCore.QObject.QObject + PyQt5.QtGui.QPaintDevice.QPaintDevice + klienci.Customer + PyQt5.QtWidgets.QWidget.QWidget + + + + + + + + + + + + + + + + + + + + + + + Fields + Methods + Inner Classes + + + diff --git a/documentations/Diagram Class/main.uml b/documentations/Diagram Class/main.uml new file mode 100644 index 0000000..880d13f --- /dev/null +++ b/documentations/Diagram Class/main.uml @@ -0,0 +1,45 @@ + + + Python + #D:/Programowanie/Weterynarz/main.py + + main.UI_Logowanie + PyQt5.QtCore.QObject.QObject + PyQt5.QtGui.QPaintDevice.QPaintDevice + PyQt5.QtWidgets.QWidget.QWidget + PyQt5.QtWidgets.QDialog.QDialog + + + + + + + + + + + + + + + + + + + + + + + + + + + PyQt5.QtWidgets.QDialog.QDialog + + + Methods + Inner Classes + Fields + + + diff --git a/documentations/Diagram Class/pracownicy.uml b/documentations/Diagram Class/pracownicy.uml new file mode 100644 index 0000000..61f9c97 --- /dev/null +++ b/documentations/Diagram Class/pracownicy.uml @@ -0,0 +1,39 @@ + + + Python + #D:/Programowanie/Weterynarz/pracownicy.py + + pracownicy.Employee + PyQt5.QtCore.QObject.QObject + PyQt5.QtGui.QPaintDevice.QPaintDevice + PyQt5.QtWidgets.QWidget.QWidget + + + + + + + + + + + + + + + + + + + + + + PyQt5.QtWidgets.QWidget.QWidget + + + Fields + Inner Classes + Methods + + + diff --git a/documentations/Diagram Class/pracownicy_uslugi.uml b/documentations/Diagram Class/pracownicy_uslugi.uml new file mode 100644 index 0000000..e27808e --- /dev/null +++ b/documentations/Diagram Class/pracownicy_uslugi.uml @@ -0,0 +1,37 @@ + + + Python + #D:/Programowanie/Weterynarz/pracownicy_uslugi.py + + PyQt5.QtCore.QObject.QObject + PyQt5.QtGui.QPaintDevice.QPaintDevice + PyQt5.QtWidgets.QWidget.QWidget + pracownicy_uslugi.ServEmpl + + + + + + + + + + + + + + + + + + + + + + + Fields + Methods + Inner Classes + + + diff --git a/documentations/Diagram Class/program.uml b/documentations/Diagram Class/program.uml new file mode 100644 index 0000000..8e0d780 --- /dev/null +++ b/documentations/Diagram Class/program.uml @@ -0,0 +1,51 @@ + + + Python + #D:/Programowanie/Weterynarz/program.py + + program.Program + PyQt5.QtWidgets.QMainWindow.QMainWindow + PyQt5.QtCore.QObject.QObject + PyQt5.QtGui.QPaintDevice.QPaintDevice + PyQt5.QtWidgets.QWidget.QWidget + program.TabsWidget + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + program.TabsWidget + + + Fields + Inner Classes + Methods + + + diff --git a/documentations/Diagram Class/rezerwacje.uml b/documentations/Diagram Class/rezerwacje.uml new file mode 100644 index 0000000..1b09e8b --- /dev/null +++ b/documentations/Diagram Class/rezerwacje.uml @@ -0,0 +1,39 @@ + + + Python + #D:/Programowanie/Weterynarz/rezerwacje.py + + rezerwacje.Reservations + PyQt5.QtCore.QObject.QObject + PyQt5.QtGui.QPaintDevice.QPaintDevice + PyQt5.QtWidgets.QWidget.QWidget + + + + + + + + + + + + + + + + + + + + + + PyQt5.QtWidgets.QWidget.QWidget + + + Fields + Inner Classes + Methods + + + diff --git a/documentations/Diagram Class/uslugi.uml b/documentations/Diagram Class/uslugi.uml new file mode 100644 index 0000000..32a6820 --- /dev/null +++ b/documentations/Diagram Class/uslugi.uml @@ -0,0 +1,39 @@ + + + Python + #D:/Programowanie/Weterynarz/uslugi.py + + PyQt5.QtCore.QObject.QObject + PyQt5.QtGui.QPaintDevice.QPaintDevice + PyQt5.QtWidgets.QWidget.QWidget + uslugi.Services + + + + + + + + + + + + + + + + + + + + + + uslugi.Services + + + Fields + Inner Classes + Methods + + + diff --git a/documentations/Diagram Class/zmiana_hasla.uml b/documentations/Diagram Class/zmiana_hasla.uml new file mode 100644 index 0000000..15d9429 --- /dev/null +++ b/documentations/Diagram Class/zmiana_hasla.uml @@ -0,0 +1,39 @@ + + + Python + #D:/Programowanie/Weterynarz/zmiana_hasla.py + + PyQt5.QtCore.QObject.QObject + PyQt5.QtGui.QPaintDevice.QPaintDevice + PyQt5.QtWidgets.QWidget.QWidget + zmiana_hasla.Password + + + + + + + + + + + + + + + + + + + + + + zmiana_hasla.Password + + + Methods + Inner Classes + Fields + + + diff --git a/documentations/Model danych.png b/documentations/Model danych.png new file mode 100644 index 0000000..3fbcd12 Binary files /dev/null and b/documentations/Model danych.png differ diff --git a/documentations/Use Case Diagram.png b/documentations/Use Case Diagram.png new file mode 100644 index 0000000..655e123 Binary files /dev/null and b/documentations/Use Case Diagram.png differ diff --git a/klienci.py b/klienci.py index f4d88d7..4496069 100644 --- a/klienci.py +++ b/klienci.py @@ -135,8 +135,9 @@ def table_init(self): Inicjuje wygląd tabeli """ self.model.setTable('klienci') - query = QSqlQuery('SELECT klienci_id, imie, nazwisko, email, telefon, ulica, numer_mieszkania, miejscowosc, poczta FROM ' - 'klienci;') + query = QSqlQuery( + 'SELECT klienci_id, imie, nazwisko, email, telefon, ulica, numer_mieszkania, miejscowosc, poczta FROM ' + 'klienci;') self.model.setQuery(query) self.proxy.setSourceModel(self.model) @@ -147,7 +148,7 @@ def table_init(self): "email": 'Email', 'telefon': 'Telefon', 'ulica': 'Ulica', - 'numer_mieszkania':'Numer mieszkania', + 'numer_mieszkania': 'Numer mieszkania', 'miejscowosc': 'Miejscowosc', 'poczta': 'Kod pocztowy', } @@ -190,9 +191,6 @@ def if_checked(self, txt, q, val=None): print('Transakcja') return transakcja(q) - # Odświeżanie widoku tabeli - self.model.select() - self.view.reset() return True def add(self): @@ -220,6 +218,9 @@ def add(self): msg.setText('Klient został dodany do bazy danych') msg.setWindowTitle("Dodano nowego klienta") msg.exec_() + # Odświeżanie widoku tabeli + self.model.select() + self.view.reset() def modify(self): """ @@ -246,6 +247,9 @@ def modify(self): msg.setText('Dane klienta zostały pomyślnie zmodyfikowane') msg.setWindowTitle("Dane klienta zostały zmodyfikowane") msg.exec_() + # Odświeżanie widoku tabeli + self.model.select() + self.view.reset() def remove(self): """ @@ -271,7 +275,11 @@ def remove(self): self.txt_ulica.setText(''), self.txt_nr_dom.setText(''), self.txt_miasto.setText(''), - self.txt_kod.setText(''), + self.txt_kod.setText('') + + # Odświeżanie widoku tabeli + self.model.select() + self.view.reset() @pyqtSlot(str) def wyszukiwanie(self, text): diff --git a/main.py b/main.py index 7ec70a7..d7b4c7e 100644 --- a/main.py +++ b/main.py @@ -72,7 +72,7 @@ def zaloguj(self): """ login = self.txtlogin.text() haslo = self.txthaslo.text() - query = "SELECT * FROM uzytkownik WHERE uzytkownik_nazwa = '{}' AND haslo = sha({}) ;".format(login, haslo) + query = "SELECT * FROM uzytkownik WHERE uzytkownik_nazwa = '{}' AND haslo = sha('{}');".format(login, haslo) odczytanie = polaczenie(query) if odczytanie: self.accept() diff --git a/pracownicy.py b/pracownicy.py index 2bcf25a..d8abdcf 100644 --- a/pracownicy.py +++ b/pracownicy.py @@ -291,6 +291,16 @@ def add(self): msg.setText('Dodano nowego użytkownika') msg.setWindowTitle("Dodano użytkownika") msg.exec_() + else: + msg = QMessageBox(self) + msg.setIcon(QMessageBox.Warning) + msg.setText('Dany użytkownik istnieje już w bazie') + msg.setWindowTitle("Błąd!") + msg.exec_() + + # Odświeżanie widoku tabeli + self.model.select() + self.view.reset() def modify(self): """ @@ -358,6 +368,10 @@ def modify(self): msg.setWindowTitle("Zmodyfikowano użytkownika") msg.exec_() + # Odświeżanie widoku tabeli + self.model.select() + self.view.reset() + def remove(self): """ Usuwa dane z bazy danych @@ -390,6 +404,10 @@ def remove(self): if self.cb_pracownik.checkState(): self.cb_pracownik.toggle() + # Odświeżanie widoku tabeli + self.model.select() + self.view.reset() + def change(self): """ Metoda edytująca zaznaczone wiersze - Wstawia wartości z wierszy w odpowiednie pola diff --git a/rezerwacje.py b/rezerwacje.py index f092487..866acbe 100644 --- a/rezerwacje.py +++ b/rezerwacje.py @@ -149,9 +149,9 @@ def initUI(self): hbox_t.addWidget(lbl_termin) hbox_t.addWidget(self.lbl_termin_) vbox_cal.addWidget(self.kalendarz) - vbox_cal.addLayout(hbox_k) - vbox_cal.addLayout(hbox_t) vbox_cal.addLayout(hbox_u) + vbox_cal.addLayout(hbox_t) + vbox_cal.addLayout(hbox_k) self.view.setSizePolicy(QSizePolicy(QSizePolicy.Expanding, QSizePolicy.Minimum)) vbox_cal.addWidget(self.view) vbox_cal.addLayout(hbox_btn) @@ -394,7 +394,7 @@ def if_checked(self, txt, q, val=None): :param q: zapytanie query MySql :param txt: komunikat """ - if self.id_klient < 0 or self.id_pracownik < 0 or self.id_usluga < 0 or self.data: + if self.id_klient < 0 and self.id_pracownik < 0 and self.id_usluga < 0 and self.data is None: msg = QMessageBox(self) msg.setIcon(QMessageBox.Warning) msg.setText(txt) @@ -419,7 +419,7 @@ def refresh(self): # Odświeżanie widoku tabeli query = QSqlQuery( 'SELECT wizyty.wizyty_id, CONCAT(klienci.imie, " ", klienci.nazwisko) AS klient, uslugi.nazwa, ' - 'wizyty.rezerwacja_od, wizyty.rezerwacja_do, wizyty.status FROM klienci, uslugi NATURAL JOIN wizyty WHERE wizyty.rezerwacja_od > CURRENT_TIMESTAMP AND wizyty.uzytkownik_id = ' + str( + 'wizyty.rezerwacja_od, wizyty.rezerwacja_do, wizyty.status FROM wizyty,klienci,uslugi WHERE wizyty.klienci_id= klienci.klienci_id AND wizyty.uslugi_id = uslugi.uslugi_id AND wizyty.rezerwacja_od > CURRENT_TIMESTAMP AND wizyty.uzytkownik_id = ' + str( self.id_pracownik) + ';') self.model.setQuery(query) self.view.reset() @@ -433,7 +433,6 @@ def add(self): self.data_do = datetime.datetime.fromisoformat(self.data) + datetime.timedelta( hours=datetime.time.fromisoformat(self.data_do).hour, minutes=datetime.time.fromisoformat(self.data_do).minute) - self.data_do = datetime.time.fromisoformat(self.data_do).hour # Dodanie nowego użytkownika query = 'INSERT INTO wizyty (klienci_id, uslugi_id, uzytkownik_id, rezerwacja_od, rezerwacja_do, ' \ 'status) VALUES (%s, %s, %s, %s, %s, %s);' @@ -442,7 +441,7 @@ def add(self): self.id_usluga, self.id_pracownik, self.data, - self.data_do, + str(self.data_do.isoformat()), 'oczekuje' ) print(val) diff --git a/uslugi.py b/uslugi.py index a87e807..b827204 100644 --- a/uslugi.py +++ b/uslugi.py @@ -161,15 +161,13 @@ def if_checked(self, txt, q, val=None): print('Trwa zmiana w bazie danych') if val: print('Połączenie') - polaczenie(q, val) + t = polaczenie(q, val) + print(t) + return t # = polaczenie(q, val) else: print('Transakcja') return transakcja(q) - # Odświeżanie widoku tabeli - self.model.select() - self.view.reset() - return True def add(self): """ @@ -191,6 +189,15 @@ def add(self): msg.setText('Dodano nową usługę') msg.setWindowTitle("Dodano nową usługę") msg.exec_() + else: + msg = QMessageBox(self) + msg.setIcon(QMessageBox.Warning) + msg.setText('Usługa znajduje się już w bazie') + msg.setWindowTitle("Błąd!") + msg.exec_() + # Odświeżanie widoku tabeli + self.model.select() + self.view.reset() def modify(self): """ @@ -212,6 +219,9 @@ def modify(self): msg.setText('Informacje o usłudze zostały pomyślnie zmodyfikowane') msg.setWindowTitle("Zmodyfikowano usługi") msg.exec_() + # Odświeżanie widoku tabeli + self.model.select() + self.view.reset() def remove(self): """ @@ -235,6 +245,10 @@ def remove(self): self.txt_czas.setText('') self.txt_opis.setText('') + # Odświeżanie widoku tabeli + self.model.select() + self.view.reset() + @pyqtSlot(str) def wyszukiwanie(self, text): """