import ast 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 backup = Backup() class MainUI(QtWidgets.QMainWindow, Ui_MainWindow): def __init__(self): super(MainUI, self).__init__() self.setupUi(self) self.setWindowTitle("Handbibliotheksleihsystem") 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) # hotkeys self.actionRueckgabemodus.triggered.connect(self.changeMode) self.actionNutzer.triggered.connect(self.showUser) self.actionEinstellungen.triggered.connect(self.showSettings) #Buttons self.btn_show_lentmedia.clicked.connect(self.showUser) # LineEdits self.input_userno.returnPressed.connect( lambda: self.checkUser("id", self.input_userno.text()) ) self.input_username.returnPressed.connect( lambda: self.checkUser("username", self.input_username.text()) ) self.input_file_ident.returnPressed.connect(self.handleLineInput) self.input_userno.setValidator(QtGui.QIntValidator()) # TableWidget # set header size to be width/number of columns self.mediaOverview.horizontalHeader().setSectionResizeMode( QtWidgets.QHeaderView.ResizeMode.Stretch ) # self.input_userno. self.show() def showSettings(self): settings = Settings() settings.exec() def changeMode(self): self.mode.setText("Rückgabe") self.input_username.clear() self.input_userno.clear() self.userdata.clear() self.btn_show_lentmedia.setText("") self.input_file_ident.clear() self.label_7.hide() self.nextReturnDate.hide() def showUser(self): if self.activeUser is None: # create warning dialog dialog = QtWidgets.QMessageBox() dialog.setWindowTitle("Kein Nutzer ausgewählt") dialog.setIcon(QtWidgets.QMessageBox.Icon.Warning) dialog.setWindowIcon(Icon("warning").overwriteColor("#EA3323")) dialog.setText("Kein Nutzer ausgewählt") dialog.exec() return self.user_ui = UserUI( self.activeUser.username, self.activeUser.id, self.activeUser.email ) # self.user_ui.setFields("John Doe", "123456789", "test@mail.com") self.user_ui.show() def setUserData(self): self.input_username.setText(self.activeUser.username) self.input_userno.setText(str(self.activeUser.id)) self.userdata.setText(self.activeUser.__repr__()) def checkUser(self, 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 else: if len(user) > 1: multi = MultiUserFound(user) multi.exec() self.activeUser = multi.userdata else: self.activeUser = user[0] if self.activeUser is not None: 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) self.nextReturnDate.setText(date) self.nextReturnDate.show() self.label_7.show() def moveToLine(self, line): line.setFocus() def handleLineInput(self): value = self.input_file_ident.text().strip() if len(value) <= 2: self.callShortcut(value) else: if self.mode.text() == "Rückgabe": self.returnMedia(value) else: self.mediaAdd(value) def mediaAdd(self, identifier): self.clearStatusTip 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) book_id = self.db.checkMediaExists(media) print(book_id) if book_id: if len(book_id) > 1: print("Multiple Books found") # TODO: implement book selection dialog return else: # check if book is already loaned loaned = self.db.checkLoanState(book_id[0]) if loaned: print("Book already loaned") self.setStatusTipMessage("Buch bereits entliehen") # dialog with yes no to create new entry dialog = QtWidgets.QMessageBox() dialog.setText( "Buch bereits entliehen, soll ein neues hinzugefügt werden?" ) dialog.setStandardButtons( QtWidgets.QMessageBox.StandardButton.Yes | QtWidgets.QMessageBox.StandardButton.No ) dialog.setDefaultButton(QtWidgets.QMessageBox.StandardButton.No) dialog.exec() result = dialog.result() if result == QtWidgets.QMessageBox.StandardButton.No: return newentry = NewEntry([book_id[0]]) newentry.exec() self.setStatusTipMessage("Neues Exemplar hinzugefügt") created_ids = newentry.newIds print(created_ids) self.input_file_ident.setEnabled(True) return else: print("Book not loaned, loaning now") self.db.insertLoan( user_id, book_id[0], self.currentDate.toString(), self.duedate.date().toString(), ) 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") ) 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(), ) self.btn_show_lentmedia.setText(self.db.getActiveLoans(self.activeUser.id)) self.nextReturnDate.setText( stringToDate(self.db.selectClosestReturnDate(self.activeUser.id)) ) 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) # get book id from database identifier = Book( isbn=identifier, title=identifier, signature=identifier, ppn=identifier ) book_id = self.db.checkMediaExists(identifier) 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") 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()) self.mediaOverview.insertRow(0) self.mediaOverview.setItem(0, 0, QtWidgets.QTableWidgetItem(book.isbn)) self.mediaOverview.setItem(0, 1, QtWidgets.QTableWidgetItem(book.title)) self.mediaOverview.setItem( 0, 2, QtWidgets.QTableWidgetItem("Zurückgegeben") ) self.input_file_ident.clear() self.btn_show_lentmedia.setText( self.db.getActiveLoans(self.activeUser.id) ) # else: print("Book not loaned") else: print("Book not found") def setStatusTipMessage(self, message): self.setStatusTip(message) @property def clearStatusTip(self): self.setStatusTip("") def exit_handler(): print("Exiting") state = backup.createBackup() # create dialog to show state app = QtWidgets.QApplication(sys.argv) dialog = QtWidgets.QMessageBox() if state == True: dialog.setText("Backup created successfully") else: dialog.setText("Backup creation failed") dialog.exec() def launch(): app = QtWidgets.QApplication(sys.argv) main_ui = MainUI() # atexit.register(exit_handler) sys.exit(app.exec()) # sys.exit(app.exec())