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 .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
from .newBook import NewBook
from .loans import LoanWindow
from .reportUi import ReportUi
from PyQt6 import QtCore, QtWidgets
backup = Backup()
cat = Catalogue()
log = Log("main")
dbg(backup=config.database.do_backup, catalogue=config.catalogue)
class MainUI(QtWidgets.QMainWindow, Ui_MainWindow):
def __init__(self):
super(MainUI, self).__init__()
self.setupUi(self)
self.setWindowTitle("Handbibliotheksleihsystem")
self.setWindowTitle(f"Handbibliotheksleihsystem {config.institution_name}")
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)
@@ -33,8 +40,13 @@ class MainUI(QtWidgets.QMainWindow, Ui_MainWindow):
self.actionRueckgabemodus.triggered.connect(self.changeMode)
self.actionNutzer.triggered.connect(self.showUser)
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_createNewUser.clicked.connect(self.createUser)
self.btn_createNewUser.setText("")
self.btn_createNewUser.setIcon(Icon("add_user").overwriteColor("#1E90FF"))
# LineEdits
self.input_userno.returnPressed.connect(
@@ -44,22 +56,54 @@ class MainUI(QtWidgets.QMainWindow, Ui_MainWindow):
lambda: self.checkUser("username", self.input_username.text())
)
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
# set header size to be width/number of columns
self.mediaOverview.horizontalHeader().setSectionResizeMode(
QtWidgets.QHeaderView.ResizeMode.Stretch
)
self.input_file_ident.setFocus()
# self.userdata.textChanged.connect(lambda: self.mode.setText("Ausleihe"))
# 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()
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):
log.info("Showing Settings")
settings = Settings()
settings.exec()
def changeMode(self):
log.info("Changing Mode")
dbg(f"Current mode: {self.mode.text()}")
self.mode.setText("Rückgabe")
self.input_username.clear()
self.input_userno.clear()
@@ -68,10 +112,13 @@ class MainUI(QtWidgets.QMainWindow, Ui_MainWindow):
self.input_file_ident.clear()
self.label_7.hide()
self.nextReturnDate.hide()
self.mediaOverview.setRowCount(0)
def showUser(self):
log.info(f"Showing User {self.activeUser}")
if self.activeUser is None:
# create warning dialog
log.info("Showing no user selected warning")
dialog = QtWidgets.QMessageBox()
dialog.setWindowTitle("Kein Nutzer ausgewählt")
dialog.setIcon(QtWidgets.QMessageBox.Icon.Warning)
@@ -87,81 +134,156 @@ class MainUI(QtWidgets.QMainWindow, Ui_MainWindow):
self.user_ui.show()
def setUserData(self):
log.info("Setting User Data")
self.input_username.setText(self.activeUser.username)
self.input_userno.setText(str(self.activeUser.id))
self.userdata.setText(self.activeUser.__repr__())
self.mode.setText("Ausleihe")
def createUser(self):
log.info("Creating User")
user = CreateUser(fieldname="id", data="")
user.exec()
userid = user.userid
if userid:
log.info(f"User created {userid}")
data = self.db.getUser(userid)
self.activeUser = data
# set user to active user
self.setUserData()
self.input_file_ident.setFocus()
return
def checkUser(self, fieldname, data):
print("Checking User", 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:
user = CreateUser(fieldname, data)
user.exec()
userid = user.userid
if userid:
data = self.db.getUser(userid)
self.activeUser = data
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:
if len(user) > 1:
log.info("Multiple Users found")
multi = MultiUserFound(user)
multi.exec()
self.activeUser = multi.userdata
else:
# print("User found", user[0])
self.activeUser = user[0]
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.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)
date = stringToDate(retdate).toString("dd.MM.yyyy")
self.nextReturnDate.setText(date)
self.nextReturnDate.show()
self.label_7.show()
def moveToLine(self, line):
log.debug("Moving to Line", line)
line.setFocus()
def handleLineInput(self):
value = self.input_file_ident.text().strip()
if len(value) <= 2:
self.callShortcut(value)
log.debug(f"Handling Line Input {value}")
if self.mode.text() == "Rückgabe":
self.returnMedia(value)
else:
if self.mode.text() == "Rückgabe":
self.returnMedia(value)
else:
self.mediaAdd(value)
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)
def mediaAdd(self, identifier):
self.clearStatusTip
print("Adding Media", identifier)
# 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)
media = Book(signature=identifier)
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 len(book_id) > 1:
print("Multiple Books found")
if isinstance(book_id, list) and len(book_id) > 1:
# print("Multiple Books found")
# TODO: implement book selection dialog
return
else:
if isinstance(book_id, int):
book_id = [book_id]
# check if book is already loaned
loaned = self.db.checkLoanState(book_id[0])
if loaned:
print("Book already loaned")
# print("Book already loaned")
self.setStatusTipMessage("Buch bereits entliehen")
# dialog with yes no to create new entry
dialog = QtWidgets.QMessageBox()
dialog.setWindowTitle("Buch bereits entliehen")
dialog.setWindowIcon(Icon("duplicate").icon)
dialog.setText(
"Buch bereits entliehen, soll ein neues hinzugefügt werden?"
)
@@ -173,22 +295,22 @@ class MainUI(QtWidgets.QMainWindow, Ui_MainWindow):
dialog.exec()
result = dialog.result()
if result == QtWidgets.QMessageBox.StandardButton.No:
self.input_file_ident.setEnabled(True)
return
newentry = NewEntry([book_id[0]])
newentry.exec()
self.setStatusTipMessage("Neues Exemplar hinzugefügt")
created_ids = newentry.newIds
print(created_ids)
# print(created_ids)
self.input_file_ident.setEnabled(True)
return
else:
print("Book not loaned, loaning now")
# print("Book not loaned, loaning now")
self.db.insertLoan(
user_id,
book_id[0],
self.currentDate.toString(),
self.duedate.date().toString(),
self.currentDate.toString("yyyy-MM-dd"),
self.duedate.date().toString("yyyy-MM-dd"),
)
self.mediaOverview.insertRow(0)
self.mediaOverview.setItem(
@@ -200,48 +322,39 @@ class MainUI(QtWidgets.QMainWindow, Ui_MainWindow):
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(),
)
# else:
self.btn_show_lentmedia.setText(self.db.getActiveLoans(self.activeUser.id))
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.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)
# print("Returning Media", identifier)
# get book id from database
# self.
identifier = Book(
isbn=identifier, title=identifier, signature=identifier, ppn=identifier
)
book_id = self.db.checkMediaExists(identifier)
print(book_id)
# 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")
# 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())
book = self.db.returnMedia(
book_id[0], self.currentDate.toString("yyyy-MM-dd")
)
self.mediaOverview.insertRow(0)
self.mediaOverview.setItem(0, 0, QtWidgets.QTableWidgetItem(book.isbn))
self.mediaOverview.setItem(0, 1, QtWidgets.QTableWidgetItem(book.title))
@@ -254,7 +367,9 @@ class MainUI(QtWidgets.QMainWindow, Ui_MainWindow):
)
#
else:
print("Book not loaned")
# print("Book not loaned")
self.setStatusTipMessage("Buch nicht entliehen")
self.input_file_ident.clear()
else:
print("Book not found")
@@ -265,19 +380,38 @@ class MainUI(QtWidgets.QMainWindow, Ui_MainWindow):
def clearStatusTip(self):
self.setStatusTip("")
def exit_handler():
print("Exiting")
state = backup.createBackup()
# create dialog to show state
dbg("Exiting, creating backup")
app = QtWidgets.QApplication(sys.argv)
dialog = QtWidgets.QMessageBox()
if state == True:
dialog.setText("Backup created successfully")
if config.database.do_backup:
state = backup.createBackup()
# create dialog to show state
if state == True:
return
else:
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.setText("Backup creation failed")
dialog.exec()
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()
def launch():
app = QtWidgets.QApplication(sys.argv)
main_ui = MainUI()