Files
LibrarySystem/src/ui/main_ui.py
2024-07-17 09:02:27 +02:00

264 lines
9.1 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 src import config
from src.logic import Database, Catalogue, Backup
from src.utils import stringToDate
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.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)
#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.addMedia)
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 changeMode(self):
current = self.mode.text()
if current == "Ausleihe":
self.mode.setText("Rückgabe")
self.input_username.clear()
self.input_userno.clear()
self.userdata.clear()
self.btn_show_lentmedia.setText("")
self.label_7.hide()
self.nextReturnDate.hide()
if current == "Rückgabe":
self.input_username.clear()
self.input_userno.clear()
self.userdata.clear()
self.mediaOverview.setRowCount(0)
self.btn_show_lentmedia.setText("")
self.input_file_ident.clear()
self.nextReturnDate.hide()
self.label_7.hide()
def showUser(self):
if self.activeUser is None:
# create warning dialog
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 mediaAdd(self, 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)
book_id = self.db.checkMediaExists(media)
print(book_id)
if book_id:
if len(book_id) > 1:
print("Multiple Books found")
return
else:
# check if book is already loaned
loaned = self.db.checkLoanState(book_id[0])
if loaned:
print("Book already loaned")
self.setStatusTip("Book already loaned")
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 addMedia(self):
mode = self.mode.text()
value = self.input_file_ident.text()
# if vaule is string, call shortcut, else mediaAdd
if mode == "Rückgabe":
self.returnMedia(value)
else:
self.lendMedia(value)
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 lendMedia(self, value):
value = value.strip()
if value.isnumeric():
self.mediaAdd(value)
else:
if len(value) <= 2:
self.callShortcut(value)
else:
self.mediaAdd(value)
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())