from .sources.Ui_main_Loans import Ui_MainWindow from PyQt6 import QtCore, QtGui, QtWidgets from src import log from .user import UserUI from src.logic import Database from src.utils import stringToDate, Icon from icecream import ic TABLETOFIELDTRANSLATE = { "Titel": "book.title", "Signatur": "book.signature", "Nutzer": "user_name", } class LoanWindow(QtWidgets.QMainWindow, Ui_MainWindow): def __init__(self): super(LoanWindow, self).__init__() self.setupUi(self) self.setWindowTitle("Ausleihhistorie") self.setWindowIcon(Icon("borrow").icon) self.loanTable.horizontalHeader().setSectionResizeMode( QtWidgets.QHeaderView.ResizeMode.Stretch ) self.db = Database() self.loans = self.loadLoans() # lineedits self.searchbar.textChanged.connect(self.limitResults) self.searchbar.returnPressed.connect(self.selfpass) # radio buttons self.radio_all.clicked.connect(self.filterResults) self.radio_current.clicked.connect(self.filterResults) self.radio_overdue.clicked.connect(self.filterResults) # table self.loanTable.doubleClicked.connect(self.showUser) log.info("Loan history window opened") self.show() def selfpass(self): pass def insertRow(self, data): log.debug(f"Inserting row: {data}") retdate = "" if data.returned_date != "": retdate = stringToDate(data.returned_date).toString("dd.MM.yyyy") ic(retdate) self.loanTable.insertRow(0) self.loanTable.setItem(0, 0, QtWidgets.QTableWidgetItem(data.book.isbn)) self.loanTable.setItem(0, 1, QtWidgets.QTableWidgetItem(data.book.signature)) self.loanTable.setItem(0, 2, QtWidgets.QTableWidgetItem(data.book.title)) self.loanTable.setItem( 0, 3, QtWidgets.QTableWidgetItem(str(self.db.getUser(data.user_id).username)), ) self.loanTable.setItem( 0, 4, QtWidgets.QTableWidgetItem( stringToDate(data.loan_date).toString("dd.MM.yyyy") ), ) self.loanTable.setItem( 0, 5, QtWidgets.QTableWidgetItem( stringToDate(data.return_date).toString("dd.MM.yyyy") ), ) self.loanTable.setItem(0, 6, QtWidgets.QTableWidgetItem(retdate)) book = data.book book.loan_to = data.return_date book.load_from = data.loan_date book.returned = data.returned match self.check_book(book): case "overdue": for i in range(7): self.loanTable.item(0, i).setBackground( QtGui.QColor(255, 0, 0, 100) ) case "ok": for i in range(7): self.loanTable.item(0, i).setBackground( QtGui.QColor(105, 255, 51, 100) ) case "returned": for i in range(7): self.loanTable.item(0, i).setBackground( QtGui.QColor(102, 153, 153, 100) ) def check_book(self, book): today = QtCore.QDate.currentDate().toString("yyyy-MM-dd") returnDate = stringToDate(book.loan_to).toString("yyyy-MM-dd") returned = book.returned if returned == 1: return "returned" else: if returnDate < today: return "overdue" else: return "ok" def loadLoans(self): loans = self.db.getAllLoans() for loan in loans: self.insertRow(loan) return loans def filterResults(self): mode = ( "all" if self.radio_all.isChecked() else "current" if self.radio_current.isChecked() else "overdue" ) log.debug("Switching mode to {}", mode) self.loanTable.setRowCount(0) today = QtCore.QDate.currentDate() for loan in self.loans: # convert string to Qdate date = loan.return_date qdate = stringToDate(date) # current mode if mode == "current": if loan.returned == 1: continue elif mode == "overdue": if loan.returned_date != "": continue else: if qdate > today: continue self.insertRow(loan) def limitResults(self): limiter = self.searchbar.text().lower() limiter = str(limiter) searchfield = self.searchFields.currentText() searchfield = TABLETOFIELDTRANSLATE[searchfield] log.debug(f"Searching for: {limiter} in {searchfield}") self.loanTable.setRowCount(0) for loan in self.loans: fielddata = eval(f"loan.{searchfield}") if isinstance(fielddata, str): fielddata = fielddata.lower() if limiter in fielddata: self.insertRow(loan) def showUser(self): row = self.loanTable.currentRow() user_name = self.loanTable.item(row, 3).text() user = self.db.getUserId(user_name) self.user = UserUI(user) self.user.show() def launch(): import sys app = QtWidgets.QApplication(sys.argv) main_ui = LoanWindow() # atexit.register(exit_handler) sys.exit(app.exec())