Files
LibrarySystem/src/ui/main_ui.py
2024-07-18 11:57:20 +02:00

287 lines
10 KiB
Python

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