current state

This commit is contained in:
WorldTeacher
2024-07-30 10:07:35 +02:00
parent 541f2b8b8f
commit 7ea612d9ef

View File

@@ -1,31 +1,38 @@
import ast import sys
import atexit
from src import config
from src.logic import Database, Catalogue, Backup
from src.utils import stringToDate, Icon, Log
from src.utils import debugMessage as dbg
from src.schemas import Book
from .sources.Ui_main_UserInterface import Ui_MainWindow from .sources.Ui_main_UserInterface import Ui_MainWindow
from .user import UserUI from .user import UserUI
from .createUser import CreateUser from .createUser import CreateUser
from .multiUserInfo import MultiUserFound from .multiUserInfo import MultiUserFound
from .newentry import NewEntry from .newentry import NewEntry
from .settings import Settings from .settings import Settings
from src import config from .newBook import NewBook
from src.logic import Database, Catalogue, Backup from .loans import LoanWindow
from src.utils import stringToDate, Icon from .reportUi import ReportUi
from src.schemas import User, Book
from PyQt6 import QtCore, QtGui, QtWidgets from PyQt6 import QtCore, QtWidgets
import sys
import atexit
backup = Backup() backup = Backup()
cat = Catalogue()
log = Log("main")
dbg(backup=config.database.do_backup, catalogue=config.catalogue)
class MainUI(QtWidgets.QMainWindow, Ui_MainWindow): class MainUI(QtWidgets.QMainWindow, Ui_MainWindow):
def __init__(self): def __init__(self):
super(MainUI, self).__init__() super(MainUI, self).__init__()
self.setupUi(self) self.setupUi(self)
self.setWindowTitle("Handbibliotheksleihsystem") self.setWindowTitle(f"Handbibliotheksleihsystem {config.institution_name}")
self.setWindowIcon(Icon("main").icon) self.setWindowIcon(Icon("main").icon)
self.db = Database() self.db = Database()
self.currentDate = QtCore.QDate.currentDate() self.currentDate = QtCore.QDate.currentDate()
self.label_7.hide() self.label_7.hide()
self.nextReturnDate.hide() self.nextReturnDate.hide()
self.activeUser = None
# add default loan duration to current date # add default loan duration to current date
loanDate = self.currentDate.addDays(config.default_loan_duration) loanDate = self.currentDate.addDays(config.default_loan_duration)
self.duedate.setDate(loanDate) self.duedate.setDate(loanDate)
@@ -33,8 +40,13 @@ class MainUI(QtWidgets.QMainWindow, Ui_MainWindow):
self.actionRueckgabemodus.triggered.connect(self.changeMode) self.actionRueckgabemodus.triggered.connect(self.changeMode)
self.actionNutzer.triggered.connect(self.showUser) self.actionNutzer.triggered.connect(self.showUser)
self.actionEinstellungen.triggered.connect(self.showSettings) self.actionEinstellungen.triggered.connect(self.showSettings)
#Buttons self.actionAusleihistorie.triggered.connect(self.showLoanHistory)
self.actionBericht_erstellen.triggered.connect(self.generateReport)
# Buttons
self.btn_show_lentmedia.clicked.connect(self.showUser) self.btn_show_lentmedia.clicked.connect(self.showUser)
self.btn_createNewUser.clicked.connect(self.createUser)
self.btn_createNewUser.setText("")
self.btn_createNewUser.setIcon(Icon("add_user").overwriteColor("#1E90FF"))
# LineEdits # LineEdits
self.input_userno.returnPressed.connect( self.input_userno.returnPressed.connect(
@@ -44,22 +56,54 @@ class MainUI(QtWidgets.QMainWindow, Ui_MainWindow):
lambda: self.checkUser("username", self.input_username.text()) lambda: self.checkUser("username", self.input_username.text())
) )
self.input_file_ident.returnPressed.connect(self.handleLineInput) self.input_file_ident.returnPressed.connect(self.handleLineInput)
self.input_userno.setValidator(QtGui.QIntValidator()) self.input_userno.setMaxLength(40)
self.input_userno.textChanged.connect(
lambda: self.validateInput(self.input_userno.text(), "int")
)
# TableWidget # TableWidget
# set header size to be width/number of columns # set header size to be width/number of columns
self.mediaOverview.horizontalHeader().setSectionResizeMode( self.mediaOverview.horizontalHeader().setSectionResizeMode(
QtWidgets.QHeaderView.ResizeMode.Stretch QtWidgets.QHeaderView.ResizeMode.Stretch
) )
self.input_file_ident.setFocus()
# self.userdata.textChanged.connect(lambda: self.mode.setText("Ausleihe"))
# self.input_userno. # self.input_userno.
# variables
self.activeUser = None
self.activeState = "Rückgabe"
if backup.backup:
log.info("Backup enabled")
else:
log.warning("Backup disabled")
self.show() self.show()
def generateReport(self):
log.info("Generating Report")
report = ReportUi()
report.exec()
def showLoanHistory(self):
log.info("Showing Loan History")
self.loan = LoanWindow()
self.loan.show()
def validateInput(self, value, type):
lastchar = value[-1] if value else ""
# if lastchar is not of the type, remove it
if type == "int":
if not lastchar.isdigit():
self.input_userno.setText(value[:-1])
def showSettings(self): def showSettings(self):
log.info("Showing Settings")
settings = Settings() settings = Settings()
settings.exec() settings.exec()
def changeMode(self): def changeMode(self):
log.info("Changing Mode")
dbg(f"Current mode: {self.mode.text()}")
self.mode.setText("Rückgabe") self.mode.setText("Rückgabe")
self.input_username.clear() self.input_username.clear()
self.input_userno.clear() self.input_userno.clear()
@@ -68,10 +112,13 @@ class MainUI(QtWidgets.QMainWindow, Ui_MainWindow):
self.input_file_ident.clear() self.input_file_ident.clear()
self.label_7.hide() self.label_7.hide()
self.nextReturnDate.hide() self.nextReturnDate.hide()
self.mediaOverview.setRowCount(0)
def showUser(self): def showUser(self):
log.info(f"Showing User {self.activeUser}")
if self.activeUser is None: if self.activeUser is None:
# create warning dialog # create warning dialog
log.info("Showing no user selected warning")
dialog = QtWidgets.QMessageBox() dialog = QtWidgets.QMessageBox()
dialog.setWindowTitle("Kein Nutzer ausgewählt") dialog.setWindowTitle("Kein Nutzer ausgewählt")
dialog.setIcon(QtWidgets.QMessageBox.Icon.Warning) dialog.setIcon(QtWidgets.QMessageBox.Icon.Warning)
@@ -87,81 +134,156 @@ class MainUI(QtWidgets.QMainWindow, Ui_MainWindow):
self.user_ui.show() self.user_ui.show()
def setUserData(self): def setUserData(self):
log.info("Setting User Data")
self.input_username.setText(self.activeUser.username) self.input_username.setText(self.activeUser.username)
self.input_userno.setText(str(self.activeUser.id)) self.input_userno.setText(str(self.activeUser.id))
self.userdata.setText(self.activeUser.__repr__()) self.userdata.setText(self.activeUser.__repr__())
self.mode.setText("Ausleihe")
def checkUser(self, fieldname, data): def createUser(self):
print("Checking User", fieldname, data) log.info("Creating User")
# set fieldname as key and data as variable user = CreateUser(fieldname="id", data="")
user = self.db.checkUserExists(fieldname, data)
if not user:
user = CreateUser(fieldname, data)
user.exec() user.exec()
userid = user.userid userid = user.userid
if userid: if userid:
log.info(f"User created {userid}")
data = self.db.getUser(userid) data = self.db.getUser(userid)
self.activeUser = data self.activeUser = data
# set user to active user
self.setUserData()
self.input_file_ident.setFocus()
return
def checkUser(self, fieldname, data):
log.info(f"Checking User {fieldname}, {data}")
# print("Checking User", fieldname, data)
# set fieldname as key and data as variable
user = self.db.checkUserExists(fieldname, data)
if not user:
warning = QtWidgets.QMessageBox()
warning.setWindowTitle("Nutzer nicht gefunden")
warning.setIcon(QtWidgets.QMessageBox.Icon.Warning)
warning.setWindowIcon(Icon("warning").overwriteColor("#EA3323"))
warning.setText("Nutzer nicht gefunden, bitte erst anlegen")
warning.exec()
self.input_username.clear()
self.input_userno.clear()
return
else: else:
if len(user) > 1: if len(user) > 1:
log.info("Multiple Users found")
multi = MultiUserFound(user) multi = MultiUserFound(user)
multi.exec() multi.exec()
self.activeUser = multi.userdata self.activeUser = multi.userdata
else: else:
# print("User found", user[0])
self.activeUser = user[0] self.activeUser = user[0]
if self.activeUser is not None: if self.activeUser is not None:
print("User found", self.activeUser) log.info(f"User found {self.activeUser}")
# print("User found", self.activeUser)
self.setUserData() self.setUserData()
self.input_file_ident.setFocus() self.input_file_ident.setFocus()
self.mode.setText("Ausleihe") self.mode.setText("Ausleihe")
self.btn_show_lentmedia.setText(self.db.getActiveLoans(self.activeUser.id)) self.btn_show_lentmedia.setText(self.db.getActiveLoans(self.activeUser.id))
retdate = self.db.selectClosestReturnDate(self.activeUser.id) retdate = self.db.selectClosestReturnDate(self.activeUser.id)
if retdate: if retdate:
date = stringToDate(retdate) date = stringToDate(retdate).toString("dd.MM.yyyy")
self.nextReturnDate.setText(date) self.nextReturnDate.setText(date)
self.nextReturnDate.show() self.nextReturnDate.show()
self.label_7.show() self.label_7.show()
def moveToLine(self, line): def moveToLine(self, line):
log.debug("Moving to Line", line)
line.setFocus() line.setFocus()
def handleLineInput(self): def handleLineInput(self):
value = self.input_file_ident.text().strip() value = self.input_file_ident.text().strip()
if len(value) <= 2: log.debug(f"Handling Line Input {value}")
self.callShortcut(value)
else:
if self.mode.text() == "Rückgabe": if self.mode.text() == "Rückgabe":
self.returnMedia(value) self.returnMedia(value)
else: else:
if not " " in value:
# create warning dialog
log.info("Invalid Input")
dialog = QtWidgets.QMessageBox()
dialog.setWindowTitle("Ungültige Eingabe")
dialog.setIcon(QtWidgets.QMessageBox.Icon.Warning)
dialog.setWindowIcon(Icon("warning").overwriteColor("#EA3323"))
dialog.setText(
"Die Eingabe enthält kein Leerzeichen\nBitte prüfen und erneut eingeben"
)
dialog.exec()
return
self.mediaAdd(value) self.mediaAdd(value)
def mediaAdd(self, identifier): def mediaAdd(self, identifier):
self.clearStatusTip self.clearStatusTip
print("Adding Media", identifier) # print("Adding Media", identifier)
self.setStatusTip("") self.setStatusTip("")
self.input_file_ident.clear() self.input_file_ident.clear()
self.input_file_ident.setEnabled(False) self.input_file_ident.setEnabled(False)
user_id = self.activeUser.id user_id = self.activeUser.id
cat = Catalogue() media = Book(signature=identifier)
media = cat.get_book(identifier)
print(media)
book_id = self.db.checkMediaExists(media) book_id = self.db.checkMediaExists(media)
print(book_id) dbg(f"Book ID: {book_id}, User ID: {user_id}", media=media)
if not book_id:
dbg("Book not found, searching catalogue")
if config.catalogue == True:
media = cat.get_book(identifier)
if not media:
self.setStatusTipMessage("Buch nicht gefunden")
self.input_file_ident.setEnabled(True)
return
book_id = self.db.insertMedia(media)
# self.db.insertLoan(
# userid=user_id,
# mediaid=book_id,
# loandate=self.currentDate.toString("yyyy-MM-dd"),
# duedate=self.duedate.date().toString("yyyy-MM-dd"),
# )
# 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")
# )
# return
else:
newbook = NewBook()
newbook.exec()
if newbook.result() == 1:
media = newbook.book
book_id = self.db.insertMedia(media)
# self.db.insertLoan(
# userid=user_id,
# mediaid=book_id,
# loandate=self.currentDate.toString(),
# duedate=self.duedate.date().toString(),
# )
if book_id: if book_id:
if len(book_id) > 1: if isinstance(book_id, list) and len(book_id) > 1:
print("Multiple Books found") # print("Multiple Books found")
# TODO: implement book selection dialog # TODO: implement book selection dialog
return return
else: else:
if isinstance(book_id, int):
book_id = [book_id]
# check if book is already loaned # check if book is already loaned
loaned = self.db.checkLoanState(book_id[0]) loaned = self.db.checkLoanState(book_id[0])
if loaned: if loaned:
print("Book already loaned") # print("Book already loaned")
self.setStatusTipMessage("Buch bereits entliehen") self.setStatusTipMessage("Buch bereits entliehen")
# dialog with yes no to create new entry # dialog with yes no to create new entry
dialog = QtWidgets.QMessageBox() dialog = QtWidgets.QMessageBox()
dialog.setWindowTitle("Buch bereits entliehen")
dialog.setWindowIcon(Icon("duplicate").icon)
dialog.setText( dialog.setText(
"Buch bereits entliehen, soll ein neues hinzugefügt werden?" "Buch bereits entliehen, soll ein neues hinzugefügt werden?"
) )
@@ -173,22 +295,22 @@ class MainUI(QtWidgets.QMainWindow, Ui_MainWindow):
dialog.exec() dialog.exec()
result = dialog.result() result = dialog.result()
if result == QtWidgets.QMessageBox.StandardButton.No: if result == QtWidgets.QMessageBox.StandardButton.No:
self.input_file_ident.setEnabled(True)
return return
newentry = NewEntry([book_id[0]]) newentry = NewEntry([book_id[0]])
newentry.exec() newentry.exec()
self.setStatusTipMessage("Neues Exemplar hinzugefügt") self.setStatusTipMessage("Neues Exemplar hinzugefügt")
created_ids = newentry.newIds # print(created_ids)
print(created_ids)
self.input_file_ident.setEnabled(True) self.input_file_ident.setEnabled(True)
return return
else: else:
print("Book not loaned, loaning now") # print("Book not loaned, loaning now")
self.db.insertLoan( self.db.insertLoan(
user_id, user_id,
book_id[0], book_id[0],
self.currentDate.toString(), self.currentDate.toString("yyyy-MM-dd"),
self.duedate.date().toString(), self.duedate.date().toString("yyyy-MM-dd"),
) )
self.mediaOverview.insertRow(0) self.mediaOverview.insertRow(0)
self.mediaOverview.setItem( self.mediaOverview.setItem(
@@ -200,48 +322,39 @@ class MainUI(QtWidgets.QMainWindow, Ui_MainWindow):
self.mediaOverview.setItem( self.mediaOverview.setItem(
0, 2, QtWidgets.QTableWidgetItem("Entliehen") 0, 2, QtWidgets.QTableWidgetItem("Entliehen")
) )
else: # 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.btn_show_lentmedia.setText(self.db.getActiveLoans(self.activeUser.id))
self.nextReturnDate.setText( self.nextReturnDate.setText(
stringToDate(self.db.selectClosestReturnDate(self.activeUser.id)) stringToDate(self.db.selectClosestReturnDate(self.activeUser.id)).toString(
"dd.MM.yyyy"
)
) )
self.nextReturnDate.show() self.nextReturnDate.show()
self.label_7.show() self.label_7.show()
self.input_file_ident.setEnabled(True) 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): def returnMedia(self, identifier):
print("Returning Media", identifier) # print("Returning Media", identifier)
# get book id from database # get book id from database
# self.
identifier = Book( identifier = Book(
isbn=identifier, title=identifier, signature=identifier, ppn=identifier isbn=identifier, title=identifier, signature=identifier, ppn=identifier
) )
book_id = self.db.checkMediaExists(identifier) book_id = self.db.checkMediaExists(identifier)
print(book_id) # print(book_id)
if book_id: if book_id:
# check if book is already loaned # check if book is already loaned
loaned = self.db.checkLoanState(book_id[0]) loaned = self.db.checkLoanState(book_id[0])
if loaned: if loaned:
print("Book already loaned, returning now") # print("Book already loaned, returning now")
user = self.db.getUserByLoan(book_id[0]) user = self.db.getUserByLoan(book_id[0])
# set userdata in lineedits # set userdata in lineedits
self.activeUser = user self.activeUser = user
self.setUserData() self.setUserData()
book = self.db.returnMedia(book_id[0], self.currentDate.toString()) book = self.db.returnMedia(
book_id[0], self.currentDate.toString("yyyy-MM-dd")
)
self.mediaOverview.insertRow(0) self.mediaOverview.insertRow(0)
self.mediaOverview.setItem(0, 0, QtWidgets.QTableWidgetItem(book.isbn)) self.mediaOverview.setItem(0, 0, QtWidgets.QTableWidgetItem(book.isbn))
self.mediaOverview.setItem(0, 1, QtWidgets.QTableWidgetItem(book.title)) self.mediaOverview.setItem(0, 1, QtWidgets.QTableWidgetItem(book.title))
@@ -254,7 +367,9 @@ class MainUI(QtWidgets.QMainWindow, Ui_MainWindow):
) )
# #
else: else:
print("Book not loaned") # print("Book not loaned")
self.setStatusTipMessage("Buch nicht entliehen")
self.input_file_ident.clear()
else: else:
print("Book not found") print("Book not found")
@@ -265,19 +380,38 @@ class MainUI(QtWidgets.QMainWindow, Ui_MainWindow):
def clearStatusTip(self): def clearStatusTip(self):
self.setStatusTip("") self.setStatusTip("")
def exit_handler(): def exit_handler():
print("Exiting") dbg("Exiting, creating backup")
app = QtWidgets.QApplication(sys.argv)
if config.database.do_backup:
state = backup.createBackup() state = backup.createBackup()
# create dialog to show state # create dialog to show state
app = QtWidgets.QApplication(sys.argv)
dialog = QtWidgets.QMessageBox()
if state == True: if state == True:
dialog.setText("Backup created successfully") return
else: else:
dialog.setText("Backup creation failed") dialog = QtWidgets.QMessageBox()
# set icon
dialog.setWindowIcon(Icon("backup").icon)
dialog.setWindowTitle("Backup")
dialog.setText("Backup konnte nicht erstellt werden")
dialog.exec()
dbg("Exiting", backupstate=state)
else:
dialog = QtWidgets.QMessageBox()
# set icon
reason = (
"Backup deaktiviert"
if config.database.do_backup is False
else "Backuppfad nicht gefunden"
if not backup.backup
else "Unbekannter Fehler"
)
dialog.setWindowIcon(Icon("backup").icon)
dialog.setWindowTitle("Backup nicht möglich")
dialog.setText("Backup konnte nicht erstellt werden\nGrund: {}".format(reason))
dialog.exec() dialog.exec()
def launch(): def launch():
app = QtWidgets.QApplication(sys.argv) app = QtWidgets.QApplication(sys.argv)
main_ui = MainUI() main_ui = MainUI()