Files
LibrarySystem/src/ui/user.py
2025-01-20 11:13:36 +01:00

257 lines
8.6 KiB
Python

from .sources.Ui_main_userData import Ui_MainWindow
from PyQt6 import QtCore, QtGui, QtWidgets
from src import log
from src.logic import Database
from src.schemas import User, Book
from .extendLoan import ExtendLoan
from src.utils import stringToDate, Icon
import datetime
TABLETOFIELDTRANSLATE = {
"Titel": "title",
"Signatur": "signature",
}
class UserUI(QtWidgets.QMainWindow, Ui_MainWindow):
def __init__(self, user):
super(UserUI, self).__init__()
self.setupUi(self)
self.setWindowTitle("Nutzerdaten")
self.setWindowIcon(Icon("user").icon)
self.db = Database()
self.username = user.username
self.userno = user.userid
self.usermail = user.email
self.user_id = user.id
self.setFields()
self.userMedia = []
self.loadMedia()
# Buttons
self.btn_userChange_save.clicked.connect(self.saveChanges)
self.btn_userchange_cancel.clicked.connect(self.discardChanges)
self.btn_extendSelectedMedia.clicked.connect(self.extendLoan)
self.deleteUser.clicked.connect(self.userDelete)
self.deleteUser.setIcon(Icon("delete").overwriteColor("red"))
self.deleteUser.setEnabled(False)
self.deleteUser.setToolTip(
"Nutzer löschen nicht möglich, solange Medien ausgeliehen sind"
)
self.btn_extendSelectedMedia.setEnabled(False)
# radioButtons
self.radio_allLoanedMedia.clicked.connect(self.loadMedia)
self.radio_currentlyLoaned.clicked.connect(self.loadMedia)
self.radio_overdueLoans.clicked.connect(self.loadMedia)
# frames
self.frame.hide()
if self.UserMediaTable.rowCount() == 0:
self.btn_extendSelectedMedia.setEnabled(False)
self.deleteUser.setEnabled(True)
else:
self.btn_extendSelectedMedia.setEnabled(True)
# table
self.UserMediaTable.horizontalHeader().setSectionResizeMode(
QtWidgets.QHeaderView.ResizeMode.Stretch
)
# if one or more rows is selected, enable btn
self.UserMediaTable.itemSelectionChanged.connect(self.userTableAction)
# LineEdits
self.searchbox.textChanged.connect(self.limitResults)
# self.frame.hide()
self.name.textChanged.connect(self.showFrame)
self.user_no.textChanged.connect(self.showFrame)
self.mail.textChanged.connect(self.showFrame)
self.show()
def check_book(self, book: 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 userDelete(self):
self.db.deleteUser(self.user_id)
dialog = QtWidgets.QMessageBox()
dialog.setIcon(QtWidgets.QMessageBox.Icon.Information)
dialog.setWindowIcon(Icon("delete").icon)
dialog.setText("Nutzer wurde gelöscht")
dialog.setWindowTitle("Nutzer gelöscht")
dialog.exec()
self.close()
def extendLoan(self):
extend = ExtendLoan(self.username, self.userMedia)
extend.exec()
if extend.result() == 1:
extendDate = extend.extendDate.toString("yyyy-MM-dd")
# #print columns of selected rows
for item in self.UserMediaTable.selectedItems():
if item.column() == 1:
signature = item.text()
# print(signature)
self.db.extendLoanDuration(signature, extendDate)
self.userMedia = []
self.UserMediaTable.setRowCount(0)
self.loadMedia()
return
def limitResults(self):
limiter = self.searchbox.text().lower()
searchfield = self.searchfilter.currentText()
searchfield = TABLETOFIELDTRANSLATE[searchfield]
self.UserMediaTable.setRowCount(0)
for loan in self.userMedia:
# print("looping loans")
fielddata = eval(f"loan.{searchfield}")
if isinstance(fielddata, str):
fielddata = fielddata.lower()
if limiter in fielddata:
self.addBookToTable(loan)
def userTableAction(self):
if self.UserMediaTable.selectedItems():
# if any selected item has a value in column 5, disable btn
for item in self.UserMediaTable.selectedItems():
if item.column() == 5 and item.text() != "":
self.btn_extendSelectedMedia.setEnabled(False)
return
self.btn_extendSelectedMedia.setEnabled(True)
else:
self.btn_extendSelectedMedia.setEnabled(False)
def showFrame(self):
self.frame.show()
def setFields(self):
self.name.setText(self.username)
self.user_no.setText(str(self.userno))
self.mail.setText(self.usermail)
def saveChanges(self):
username = self.name.text()
userno = int(self.user_no.text())
usermail = self.mail.text()
self.db.updateUser(username, userno, usermail)
self.username = username
self.userno = userno
self.usermail = usermail
self.frame.hide()
self.discardChanges()
pass
def discardChanges(self):
self.setFields()
self.frame.hide()
def loadMedia(self):
mode = (
"all"
if self.radio_allLoanedMedia.isChecked()
else "current"
if self.radio_currentlyLoaned.isChecked()
else "overdue"
)
# print(mode)
if self.userMedia == []:
books = self.db.getAllMedia(self.user_id)
for book in books:
self.userMedia.append(book)
# print(self.userMedia)
self.UserMediaTable.setRowCount(0)
for book in self.userMedia:
# fromdate = stringToDate(book.loan_from)
todate = stringToDate(book.loan_to)
if mode == "current":
# book not returned
if book.returned == 1:
continue
elif mode == "overdue":
# book not returned and todays date is greater than todate
log.debug("Book: {}".format(book))
if book.returned_date is not None:
continue
# if todate is greater than current date, continue
if todate > QtCore.QDate.currentDate():
continue
self.addBookToTable(book)
# print(book.title)
def addBookToTable(self, book):
self.UserMediaTable.insertRow(0)
# item0 = isbn
# item1 = signature
# item2 = title
# item3 = loan date
# item4 = return date
# item5 = returned_date
self.UserMediaTable.setItem(
0,
0,
QtWidgets.QTableWidgetItem(book.isbn if book.isbn != "None" else ""),
)
self.UserMediaTable.setItem(0, 1, QtWidgets.QTableWidgetItem(book.signature))
self.UserMediaTable.setItem(0, 2, QtWidgets.QTableWidgetItem(book.title))
self.UserMediaTable.setItem(
0,
3,
QtWidgets.QTableWidgetItem(
stringToDate(book.loan_from).toString("dd.MM.yyyy")
),
)
self.UserMediaTable.setItem(
0,
4,
QtWidgets.QTableWidgetItem(
stringToDate(book.loan_to).toString("dd.MM.yyyy")
),
)
self.UserMediaTable.setItem(
0,
5,
QtWidgets.QTableWidgetItem(
""
if book.returned_date is None
else stringToDate(book.returned_date).toString("dd.MM.yyyy")
),
)
match self.check_book(book):
case "overdue":
for i in range(6):
self.UserMediaTable.item(0, i).setBackground(
QtGui.QColor(255, 0, 0, 100)
)
case "ok":
for i in range(6):
self.UserMediaTable.item(0, i).setBackground(
QtGui.QColor(105, 255, 51, 100)
)
case "returned":
for i in range(6):
self.UserMediaTable.item(0, i).setBackground(
QtGui.QColor(102, 153, 153, 100)
)
def launch():
import sys
app = QtWidgets.QApplication(sys.argv)
window = UserUI("Test", "3613899476", "sdf@f.de")
window.show()
sys.exit(app.exec())