Files
LibrarySystem/src/ui/loans.py
2025-01-28 16:10:56 +01:00

172 lines
5.5 KiB
Python

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())