From 7ea612d9ef784ce1cf30669f6cec1e0af1551cf5 Mon Sep 17 00:00:00 2001 From: WorldTeacher <41587052+WorldTeacher@users.noreply.github.com> Date: Tue, 30 Jul 2024 10:07:35 +0200 Subject: [PATCH] current state --- src/ui/main_ui.py | 278 ++++++++++++++++++++++++++++++++++------------ 1 file changed, 206 insertions(+), 72 deletions(-) diff --git a/src/ui/main_ui.py b/src/ui/main_ui.py index 51f53b4..7882275 100644 --- a/src/ui/main_ui.py +++ b/src/ui/main_ui.py @@ -1,31 +1,38 @@ -import ast +import sys +import atexit +from src import config +from src.logic import Database, Catalogue, Backup +from src.utils import stringToDate, Icon, Log +from src.utils import debugMessage as dbg +from src.schemas import Book from .sources.Ui_main_UserInterface import Ui_MainWindow from .user import UserUI from .createUser import CreateUser from .multiUserInfo import MultiUserFound from .newentry import NewEntry from .settings import Settings -from src import config -from src.logic import Database, Catalogue, Backup -from src.utils import stringToDate, Icon -from src.schemas import User, Book -from PyQt6 import QtCore, QtGui, QtWidgets -import sys -import atexit +from .newBook import NewBook +from .loans import LoanWindow +from .reportUi import ReportUi + +from PyQt6 import QtCore, QtWidgets backup = Backup() +cat = Catalogue() +log = Log("main") +dbg(backup=config.database.do_backup, catalogue=config.catalogue) + class MainUI(QtWidgets.QMainWindow, Ui_MainWindow): def __init__(self): super(MainUI, self).__init__() self.setupUi(self) - self.setWindowTitle("Handbibliotheksleihsystem") + self.setWindowTitle(f"Handbibliotheksleihsystem {config.institution_name}") self.setWindowIcon(Icon("main").icon) self.db = Database() self.currentDate = QtCore.QDate.currentDate() self.label_7.hide() self.nextReturnDate.hide() - self.activeUser = None # add default loan duration to current date loanDate = self.currentDate.addDays(config.default_loan_duration) self.duedate.setDate(loanDate) @@ -33,8 +40,13 @@ class MainUI(QtWidgets.QMainWindow, Ui_MainWindow): self.actionRueckgabemodus.triggered.connect(self.changeMode) self.actionNutzer.triggered.connect(self.showUser) self.actionEinstellungen.triggered.connect(self.showSettings) - #Buttons + self.actionAusleihistorie.triggered.connect(self.showLoanHistory) + self.actionBericht_erstellen.triggered.connect(self.generateReport) + # Buttons self.btn_show_lentmedia.clicked.connect(self.showUser) + self.btn_createNewUser.clicked.connect(self.createUser) + self.btn_createNewUser.setText("") + self.btn_createNewUser.setIcon(Icon("add_user").overwriteColor("#1E90FF")) # LineEdits self.input_userno.returnPressed.connect( @@ -44,22 +56,54 @@ class MainUI(QtWidgets.QMainWindow, Ui_MainWindow): lambda: self.checkUser("username", self.input_username.text()) ) self.input_file_ident.returnPressed.connect(self.handleLineInput) - self.input_userno.setValidator(QtGui.QIntValidator()) - + self.input_userno.setMaxLength(40) + self.input_userno.textChanged.connect( + lambda: self.validateInput(self.input_userno.text(), "int") + ) # TableWidget # set header size to be width/number of columns self.mediaOverview.horizontalHeader().setSectionResizeMode( QtWidgets.QHeaderView.ResizeMode.Stretch ) + self.input_file_ident.setFocus() + # self.userdata.textChanged.connect(lambda: self.mode.setText("Ausleihe")) # self.input_userno. + # variables + self.activeUser = None + self.activeState = "Rückgabe" + if backup.backup: + log.info("Backup enabled") + else: + log.warning("Backup disabled") self.show() + def generateReport(self): + log.info("Generating Report") + report = ReportUi() + report.exec() + + def showLoanHistory(self): + log.info("Showing Loan History") + self.loan = LoanWindow() + self.loan.show() + + def validateInput(self, value, type): + lastchar = value[-1] if value else "" + # if lastchar is not of the type, remove it + if type == "int": + if not lastchar.isdigit(): + self.input_userno.setText(value[:-1]) + def showSettings(self): + log.info("Showing Settings") settings = Settings() settings.exec() def changeMode(self): + log.info("Changing Mode") + dbg(f"Current mode: {self.mode.text()}") + self.mode.setText("Rückgabe") self.input_username.clear() self.input_userno.clear() @@ -68,10 +112,13 @@ class MainUI(QtWidgets.QMainWindow, Ui_MainWindow): self.input_file_ident.clear() self.label_7.hide() self.nextReturnDate.hide() + self.mediaOverview.setRowCount(0) def showUser(self): + log.info(f"Showing User {self.activeUser}") if self.activeUser is None: # create warning dialog + log.info("Showing no user selected warning") dialog = QtWidgets.QMessageBox() dialog.setWindowTitle("Kein Nutzer ausgewählt") dialog.setIcon(QtWidgets.QMessageBox.Icon.Warning) @@ -87,81 +134,156 @@ class MainUI(QtWidgets.QMainWindow, Ui_MainWindow): self.user_ui.show() def setUserData(self): + log.info("Setting User Data") self.input_username.setText(self.activeUser.username) self.input_userno.setText(str(self.activeUser.id)) self.userdata.setText(self.activeUser.__repr__()) + self.mode.setText("Ausleihe") + + def createUser(self): + log.info("Creating User") + user = CreateUser(fieldname="id", data="") + user.exec() + userid = user.userid + if userid: + log.info(f"User created {userid}") + data = self.db.getUser(userid) + self.activeUser = data + # set user to active user + self.setUserData() + + self.input_file_ident.setFocus() + + return def checkUser(self, fieldname, data): - print("Checking User", fieldname, data) + log.info(f"Checking User {fieldname}, {data}") + # print("Checking User", fieldname, data) # set fieldname as key and data as variable user = self.db.checkUserExists(fieldname, data) if not user: - user = CreateUser(fieldname, data) - user.exec() - userid = user.userid - if userid: - data = self.db.getUser(userid) - self.activeUser = data + warning = QtWidgets.QMessageBox() + warning.setWindowTitle("Nutzer nicht gefunden") + warning.setIcon(QtWidgets.QMessageBox.Icon.Warning) + warning.setWindowIcon(Icon("warning").overwriteColor("#EA3323")) + warning.setText("Nutzer nicht gefunden, bitte erst anlegen") + warning.exec() + self.input_username.clear() + self.input_userno.clear() + return else: if len(user) > 1: + log.info("Multiple Users found") multi = MultiUserFound(user) multi.exec() self.activeUser = multi.userdata else: + # print("User found", user[0]) self.activeUser = user[0] if self.activeUser is not None: - print("User found", self.activeUser) + log.info(f"User found {self.activeUser}") + # print("User found", self.activeUser) self.setUserData() self.input_file_ident.setFocus() self.mode.setText("Ausleihe") self.btn_show_lentmedia.setText(self.db.getActiveLoans(self.activeUser.id)) retdate = self.db.selectClosestReturnDate(self.activeUser.id) if retdate: - date = stringToDate(retdate) + date = stringToDate(retdate).toString("dd.MM.yyyy") self.nextReturnDate.setText(date) self.nextReturnDate.show() self.label_7.show() def moveToLine(self, line): + log.debug("Moving to Line", line) line.setFocus() def handleLineInput(self): value = self.input_file_ident.text().strip() - if len(value) <= 2: - self.callShortcut(value) + log.debug(f"Handling Line Input {value}") + if self.mode.text() == "Rückgabe": + self.returnMedia(value) else: - if self.mode.text() == "Rückgabe": - self.returnMedia(value) - else: - self.mediaAdd(value) + if not " " in value: + # create warning dialog + log.info("Invalid Input") + dialog = QtWidgets.QMessageBox() + dialog.setWindowTitle("Ungültige Eingabe") + dialog.setIcon(QtWidgets.QMessageBox.Icon.Warning) + dialog.setWindowIcon(Icon("warning").overwriteColor("#EA3323")) + dialog.setText( + "Die Eingabe enthält kein Leerzeichen\nBitte prüfen und erneut eingeben" + ) + dialog.exec() + return + self.mediaAdd(value) def mediaAdd(self, identifier): self.clearStatusTip - print("Adding Media", identifier) + # print("Adding Media", identifier) self.setStatusTip("") self.input_file_ident.clear() self.input_file_ident.setEnabled(False) user_id = self.activeUser.id - cat = Catalogue() - media = cat.get_book(identifier) - print(media) + media = Book(signature=identifier) book_id = self.db.checkMediaExists(media) - print(book_id) + dbg(f"Book ID: {book_id}, User ID: {user_id}", media=media) + if not book_id: + dbg("Book not found, searching catalogue") + if config.catalogue == True: + media = cat.get_book(identifier) + if not media: + self.setStatusTipMessage("Buch nicht gefunden") + self.input_file_ident.setEnabled(True) + return + book_id = self.db.insertMedia(media) + # self.db.insertLoan( + # userid=user_id, + # mediaid=book_id, + # loandate=self.currentDate.toString("yyyy-MM-dd"), + # duedate=self.duedate.date().toString("yyyy-MM-dd"), + # ) + # self.mediaOverview.insertRow(0) + # self.mediaOverview.setItem(0, 0, QtWidgets.QTableWidgetItem(media.isbn)) + # self.mediaOverview.setItem( + # 0, 1, QtWidgets.QTableWidgetItem(media.title) + # ) + # self.mediaOverview.setItem( + # 0, 2, QtWidgets.QTableWidgetItem("Entliehen") + # ) + # return + else: + newbook = NewBook() + newbook.exec() + if newbook.result() == 1: + media = newbook.book + book_id = self.db.insertMedia(media) + # self.db.insertLoan( + # userid=user_id, + # mediaid=book_id, + # loandate=self.currentDate.toString(), + # duedate=self.duedate.date().toString(), + # ) + if book_id: - if len(book_id) > 1: - print("Multiple Books found") + if isinstance(book_id, list) and len(book_id) > 1: + # print("Multiple Books found") # TODO: implement book selection dialog return else: + if isinstance(book_id, int): + book_id = [book_id] # check if book is already loaned loaned = self.db.checkLoanState(book_id[0]) if loaned: - print("Book already loaned") + # print("Book already loaned") self.setStatusTipMessage("Buch bereits entliehen") # dialog with yes no to create new entry dialog = QtWidgets.QMessageBox() + dialog.setWindowTitle("Buch bereits entliehen") + dialog.setWindowIcon(Icon("duplicate").icon) dialog.setText( "Buch bereits entliehen, soll ein neues hinzugefügt werden?" ) @@ -173,22 +295,22 @@ class MainUI(QtWidgets.QMainWindow, Ui_MainWindow): dialog.exec() result = dialog.result() if result == QtWidgets.QMessageBox.StandardButton.No: + self.input_file_ident.setEnabled(True) return newentry = NewEntry([book_id[0]]) newentry.exec() self.setStatusTipMessage("Neues Exemplar hinzugefügt") - created_ids = newentry.newIds - print(created_ids) + # print(created_ids) self.input_file_ident.setEnabled(True) return else: - print("Book not loaned, loaning now") + # print("Book not loaned, loaning now") self.db.insertLoan( user_id, book_id[0], - self.currentDate.toString(), - self.duedate.date().toString(), + self.currentDate.toString("yyyy-MM-dd"), + self.duedate.date().toString("yyyy-MM-dd"), ) self.mediaOverview.insertRow(0) self.mediaOverview.setItem( @@ -200,48 +322,39 @@ class MainUI(QtWidgets.QMainWindow, Ui_MainWindow): self.mediaOverview.setItem( 0, 2, QtWidgets.QTableWidgetItem("Entliehen") ) - else: - book_id = self.db.insertMedia(media) - self.db.insertLoan( - userid=user_id, - mediaid=book_id, - loandate=self.currentDate.toString(), - duedate=self.duedate.date().toString(), - ) + # else: self.btn_show_lentmedia.setText(self.db.getActiveLoans(self.activeUser.id)) self.nextReturnDate.setText( - stringToDate(self.db.selectClosestReturnDate(self.activeUser.id)) + stringToDate(self.db.selectClosestReturnDate(self.activeUser.id)).toString( + "dd.MM.yyyy" + ) ) self.nextReturnDate.show() self.label_7.show() self.input_file_ident.setEnabled(True) - def callShortcut(self, shortcut): - print("Calling Shortcut", shortcut) - # check if actions have shortcut key and call them - sysem_shortcuts = None - print(sysem_shortcuts) - - def returnMedia(self, identifier): - print("Returning Media", identifier) + # print("Returning Media", identifier) # get book id from database + # self. identifier = Book( isbn=identifier, title=identifier, signature=identifier, ppn=identifier ) book_id = self.db.checkMediaExists(identifier) - print(book_id) + # print(book_id) if book_id: # check if book is already loaned loaned = self.db.checkLoanState(book_id[0]) if loaned: - print("Book already loaned, returning now") + # print("Book already loaned, returning now") user = self.db.getUserByLoan(book_id[0]) # set userdata in lineedits self.activeUser = user self.setUserData() - book = self.db.returnMedia(book_id[0], self.currentDate.toString()) + book = self.db.returnMedia( + book_id[0], self.currentDate.toString("yyyy-MM-dd") + ) self.mediaOverview.insertRow(0) self.mediaOverview.setItem(0, 0, QtWidgets.QTableWidgetItem(book.isbn)) self.mediaOverview.setItem(0, 1, QtWidgets.QTableWidgetItem(book.title)) @@ -254,7 +367,9 @@ class MainUI(QtWidgets.QMainWindow, Ui_MainWindow): ) # else: - print("Book not loaned") + # print("Book not loaned") + self.setStatusTipMessage("Buch nicht entliehen") + self.input_file_ident.clear() else: print("Book not found") @@ -265,19 +380,38 @@ class MainUI(QtWidgets.QMainWindow, Ui_MainWindow): def clearStatusTip(self): self.setStatusTip("") + def exit_handler(): - print("Exiting") - state = backup.createBackup() - # create dialog to show state + dbg("Exiting, creating backup") app = QtWidgets.QApplication(sys.argv) - dialog = QtWidgets.QMessageBox() - if state == True: - dialog.setText("Backup created successfully") + if config.database.do_backup: + state = backup.createBackup() + # create dialog to show state + if state == True: + return + else: + dialog = QtWidgets.QMessageBox() + # set icon + dialog.setWindowIcon(Icon("backup").icon) + dialog.setWindowTitle("Backup") + dialog.setText("Backup konnte nicht erstellt werden") + + dialog.exec() + dbg("Exiting", backupstate=state) else: - dialog.setText("Backup creation failed") - dialog.exec() - - + dialog = QtWidgets.QMessageBox() + # set icon + reason = ( + "Backup deaktiviert" + if config.database.do_backup is False + else "Backuppfad nicht gefunden" + if not backup.backup + else "Unbekannter Fehler" + ) + dialog.setWindowIcon(Icon("backup").icon) + dialog.setWindowTitle("Backup nicht möglich") + dialog.setText("Backup konnte nicht erstellt werden\nGrund: {}".format(reason)) + dialog.exec() def launch(): app = QtWidgets.QApplication(sys.argv) main_ui = MainUI()