new settings class

This commit is contained in:
WorldTeacher
2024-09-11 15:39:06 +02:00
parent a72d76b94e
commit 95d3de6490
4 changed files with 110 additions and 44 deletions

View File

@@ -1,10 +1,9 @@
import omegaconf
import sys
# import argparse # import argparse
__version__ = "0.0.1"
__author__ = "Alexander Kirchner"
config = omegaconf.OmegaConf.load("config/settings.yaml")
import sys
from config import Config
config = Config("config/settings.yaml")
# if programm launched with argument --debug, set debug to True # if programm launched with argument --debug, set debug to True
if "--debug" in sys.argv: if "--debug" in sys.argv:
@@ -13,6 +12,7 @@ if "--debug" in sys.argv:
if "--log" in sys.argv: if "--log" in sys.argv:
config.log_debug = True config.log_debug = True
# arguments = argparse.ArgumentParser( # arguments = argparse.ArgumentParser(
# prog="Ausleihsystem", # prog="Ausleihsystem",
# description="Ein Ausleihsystem für Handbibliotheken", # description="Ein Ausleihsystem für Handbibliotheken",

View File

@@ -180,7 +180,7 @@ class Database:
users = cursor.fetchall() users = cursor.fetchall()
for index, user in enumerate(users): for index, user in enumerate(users):
users[index] = User(id=user[0], username=user[1], email=user[2]) users[index] = User(userid=user[1], username=user[2], email=user[3], id=user[0])
self.close_connection(conn) self.close_connection(conn)
return users return users
@@ -190,7 +190,7 @@ class Database:
cursor = conn.cursor() cursor = conn.cursor()
try: try:
cursor.execute( cursor.execute(
f"INSERT INTO users (id,username, usermail) VALUES ('{userno}', '{username}', '{usermail}' )" f"INSERT INTO users (user_id,username, usermail) VALUES ('{userno}', '{username}', '{usermail}' )"
) )
conn.commit() conn.commit()
except sql.IntegrityError: except sql.IntegrityError:
@@ -198,15 +198,22 @@ class Database:
self.close_connection(conn) self.close_connection(conn)
return True return True
def getUser(self, userid) -> User: def getUser(self, user_id) -> User:
conn = self.connect() conn = self.connect()
cursor = conn.cursor() cursor = conn.cursor()
cursor.execute(f"SELECT * FROM users WHERE id = '{userid}'") cursor.execute(f"SELECT * FROM users")
result = cursor.fetchone() result = cursor.fetchall()
self.close_connection(conn) self.close_connection(conn)
user = User(id=result[0], username=result[1], email=result[2]) print(result)
for res in result:
if res[0] == user_id:
user = User(userid=res[1], username=res[2], email=res[3], id=res[0])
dbg(f"Returning User {user}")
log.info(f"Returning User {user}") log.info(f"Returning User {user}")
return user return user
return User(userid="gelöscht", username="gelöscht", email="gelöscht", id="gelöscht")
# user = User(userid=result[1], username=result[2], email=result[3],id = result[0])
# return user
def getUserId(self, username) -> User: def getUserId(self, username) -> User:
conn = self.connect() conn = self.connect()
@@ -214,22 +221,22 @@ class Database:
cursor.execute(f"SELECT * FROM users WHERE username = '{username}'") cursor.execute(f"SELECT * FROM users WHERE username = '{username}'")
result = cursor.fetchone() result = cursor.fetchone()
self.close_connection(conn) self.close_connection(conn)
user = User(id=result[0], username=result[1], email=result[2]) user = User(userid=result[1], username=result[2], email=result[3],id = result[0])
log.info(f"Returning User {user}") log.info(f"Returning User {user}")
return user return user
def updateUser(self, username, userno, usermail): def updateUser(self, username, user_id, usermail):
log.debug(f"Updating User {userno}, {username}, {usermail}") log.debug(f"Updating User {userno}, {username}, {usermail}")
conn = self.connect() conn = self.connect()
cursor = conn.cursor() cursor = conn.cursor()
cursor.execute( cursor.execute(
f"UPDATE users SET username = '{username}', usermail = '{usermail}' WHERE id = '{userno}'" f"UPDATE users SET username = '{username}', usermail = '{usermail}' WHERE user_id = '{user_id}'"
) )
conn.commit() conn.commit()
self.close_connection(conn) self.close_connection(conn)
def setUserActiveDate(self, userid,date): def setUserActiveDate(self, userid,date):
query = f"UPDATE users SET lastActive = '{date}' WHERE id = '{userid}'" query = f"UPDATE users SET lastActive = '{date}' WHERE user_id = '{userid}'"
conn = self.connect() conn = self.connect()
cursor = conn.cursor() cursor = conn.cursor()
cursor.execute(query) cursor.execute(query)
@@ -237,24 +244,27 @@ class Database:
dbg(f"Setting User {userid} to active on {date}") dbg(f"Setting User {userid} to active on {date}")
def renameInactiveUsers(self): def renameInactiveUsers(self):
lastYear = QtCore.QDate.currentDate().addDays(int(f"-{config.inactive_user_deletion}")).toString("yyyy-MM-dd") lastYear = QtCore.QDate.currentDate().addDays(int(f"-{config.delete_inactive_user_duration}")).toString("yyyy-MM-dd")
query = f"SELECT * FROM users WHERE lastActive < '{lastYear}'" query = f"SELECT id FROM users WHERE lastActive < '{lastYear}'"
conn = self.connect() conn = self.connect()
cursor = conn.cursor() cursor = conn.cursor()
result = cursor.execute(query).fetchall() result = cursor.execute(query).fetchall()
self.close_connection(conn) self.close_connection(conn)
if len(result) == 0:
log.info(f"Deleting {len(result)} inactive users")
for user in result: for user in result:
self.updateUser("gelöscht", user[0], "gelöscht") self.deleteUser(user)
def deleteUser(self, userid): def deleteUser(self, userid):
log.debug(f"Deleting User {userid}") log.debug(f"Deleting User {userid}")
conn = self.connect() conn = self.connect()
cursor = conn.cursor() cursor = conn.cursor()
cursor.execute(f"UPDATE users SET username='gelöscht', usermail = 'gelöscht' WHERE id = '{userid}'") cursor.execute(f"UPDATE users SET username='gelöscht', usermail = 'gelöscht', user_id='gelöscht' WHERE id = '{userid}'")
conn.commit() conn.commit()
self.close_connection(conn) self.close_connection(conn)
def getActiveLoans(self, userid): def getActiveLoans(self, userid):
dbg("id", str(userid))
conn = self.connect() conn = self.connect()
cursor = conn.cursor() cursor = conn.cursor()
try: try:
@@ -442,6 +452,7 @@ class Database:
cursor = conn.cursor() cursor = conn.cursor()
cursor.execute(query) cursor.execute(query)
result = cursor.fetchone() result = cursor.fetchone()
print(result)
self.close_connection(conn) self.close_connection(conn)
if result is not None: if result is not None:
return result[0] return result[0]

View File

@@ -48,7 +48,7 @@ class MainUI(QtWidgets.QMainWindow, Ui_MainWindow):
# LineEdits # LineEdits
self.input_userno.returnPressed.connect( self.input_userno.returnPressed.connect(
lambda: self.checkUser("id", self.input_userno.text()) lambda: self.checkUser("user_id", self.input_userno.text())
) )
self.input_username.returnPressed.connect( self.input_username.returnPressed.connect(
lambda: self.checkUser("username", self.input_username.text()) lambda: self.checkUser("username", self.input_username.text())
@@ -72,7 +72,7 @@ class MainUI(QtWidgets.QMainWindow, Ui_MainWindow):
# variables # variables
self.db = Database() self.db = Database()
self.currentDate = QtCore.QDate.currentDate() self.currentDate = QtCore.QDate.currentDate()
loanDate = self.currentDate.addDays(config.default_loan_duration) loanDate = self.currentDate.addDays(config.loan_duration)
self.activeUser = None self.activeUser = None
self.activeState = "Rückgabe" self.activeState = "Rückgabe"
@@ -107,6 +107,9 @@ class MainUI(QtWidgets.QMainWindow, Ui_MainWindow):
log.info("Showing Settings") log.info("Showing Settings")
settings = Settings() settings = Settings()
settings.exec() settings.exec()
if settings.settingschanged:
# reload settings
print(config)
def changeMode(self): def changeMode(self):
log.info("Changing Mode") log.info("Changing Mode")
@@ -119,8 +122,10 @@ class MainUI(QtWidgets.QMainWindow, Ui_MainWindow):
self.label_7.hide() self.label_7.hide()
self.nextReturnDate.hide() self.nextReturnDate.hide()
self.mediaOverview.setRowCount(0) self.mediaOverview.setRowCount(0)
self.activeUser = None #! remove if last user should be kept
if self.activeState == "Rückgabe": if self.activeState == "Rückgabe":
self.activateLoanMode() self.activateLoanMode()
else: else:
self.activateReturnMode() self.activateReturnMode()
@@ -135,6 +140,11 @@ class MainUI(QtWidgets.QMainWindow, Ui_MainWindow):
self.mode.setStyleSheet("background-color: #1E90FF") self.mode.setStyleSheet("background-color: #1E90FF")
self.mode.setText("Ausleihe") self.mode.setText("Ausleihe")
self.activeState = "Ausleihe" self.activeState = "Ausleihe"
if self.input_userno.text() == "" or self.input_username.text() == "":
self.input_file_ident.setEnabled(False)
self.input_file_ident.setPlaceholderText("Bitte zuerst Nutzerdaten eingeben")
else:
self.input_file_ident.setEnabled(True)
def activateReturnMode(self): def activateReturnMode(self):
dbg("Activating Return Mode") dbg("Activating Return Mode")
@@ -145,6 +155,8 @@ class MainUI(QtWidgets.QMainWindow, Ui_MainWindow):
self.duedate.setEnabled(False) self.duedate.setEnabled(False)
self.activeState = "Rückgabe" self.activeState = "Rückgabe"
self.mode.setText("Rückgabe") self.mode.setText("Rückgabe")
self.input_file_ident.setEnabled(True)
self.input_file_ident.setPlaceholderText("Buchidentifikation eingeben")
def showUser(self): def showUser(self):
log.info(f"Showing User {self.activeUser}") log.info(f"Showing User {self.activeUser}")
@@ -160,18 +172,18 @@ class MainUI(QtWidgets.QMainWindow, Ui_MainWindow):
return return
self.user_ui = UserUI( self.user_ui = UserUI(
self.activeUser.username, self.activeUser.id, self.activeUser.email self.activeUser
) )
# self.user_ui.setFields("John Doe", "123456789", "test@mail.com") # self.user_ui.setFields("John Doe", "123456789", "test@mail.com")
self.user_ui.show() self.user_ui.show()
def setUserData(self): def setUserData(self):
log.info("Setting User Data") log.info("Setting User Data")
self.input_username.setText(self.activeUser.username) self.input_username.setText(str(self.activeUser.username))
self.input_userno.setText(str(self.activeUser.id)) self.input_userno.setText(str(self.activeUser.userid))
self.userdata.setText(self.activeUser.__repr__()) self.userdata.setText(self.activeUser.__repr__())
today = QtCore.QDate.currentDate().toString("yyyy-MM-dd") today = QtCore.QDate.currentDate().toString("yyyy-MM-dd")
self.db.setUserActiveDate(self.activeUser.id, today) self.db.setUserActiveDate(self.activeUser.userid, today)
# self.mode.setText("Ausleihe") # self.mode.setText("Ausleihe")
def createUser(self): def createUser(self):
@@ -222,14 +234,19 @@ class MainUI(QtWidgets.QMainWindow, Ui_MainWindow):
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)) print(self.activeUser.__dict__)
loans = self.db.getActiveLoans(self.activeUser.id)
dbg(loans=loans)
self.btn_show_lentmedia.setText(loans)
retdate = self.db.selectClosestReturnDate(self.activeUser.id) retdate = self.db.selectClosestReturnDate(self.activeUser.id)
if retdate: if retdate:
date = stringToDate(retdate).toString("dd.MM.yyyy") 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()
self.input_file_ident.setEnabled(True)
self.input_file_ident.setPlaceholderText("Buchidentifikation eingeben")
self.input_file_ident.setFocus()
def moveToLine(self, line): def moveToLine(self, line):
log.debug("Moving to Line", line) log.debug("Moving to Line", line)
line.setFocus() line.setFocus()
@@ -253,9 +270,9 @@ class MainUI(QtWidgets.QMainWindow, Ui_MainWindow):
dialog.exec() dialog.exec()
return return
self.mediaAdd(value) self.mediaAdd(value)
self.input_file_ident.setFocus()
def mediaAdd(self, identifier): def mediaAdd(self, identifier):
# print("Adding Media", identifier) dbg("Adding Media", identifier = identifier)
self.input_file_ident.clear() self.input_file_ident.clear()
self.input_file_ident.setEnabled(False) self.input_file_ident.setEnabled(False)
@@ -282,7 +299,7 @@ class MainUI(QtWidgets.QMainWindow, Ui_MainWindow):
elif book_id: elif book_id:
if isinstance(book_id, list) and 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:
@@ -324,15 +341,17 @@ class MainUI(QtWidgets.QMainWindow, Ui_MainWindow):
return return
else: else:
# print("Book not loaned, loaning now") # print("Book not loaned, loaning now")
self.loanMedia(user_id, book_id, media) self.loanMedia(user_id, book_id)
def loanMedia(self, user_id, book_id, media): def loanMedia(self, user_id, book_id):
self.db.insertLoan( self.db.insertLoan(
user_id, user_id,
book_id[0], book_id[0],
self.currentDate.toString("yyyy-MM-dd"), self.currentDate.toString("yyyy-MM-dd"),
self.duedate.date().toString("yyyy-MM-dd"), self.duedate.date().toString("yyyy-MM-dd"),
) )
media = self.db.getMedia(book_id[0])
print(media)
self.mediaOverview.insertRow(0) self.mediaOverview.insertRow(0)
self.mediaOverview.setItem(0, 0, QtWidgets.QTableWidgetItem(media.signature)) self.mediaOverview.setItem(0, 0, QtWidgets.QTableWidgetItem(media.signature))
self.mediaOverview.setItem(0, 1, QtWidgets.QTableWidgetItem(media.title)) self.mediaOverview.setItem(0, 1, QtWidgets.QTableWidgetItem(media.title))
@@ -369,7 +388,7 @@ class MainUI(QtWidgets.QMainWindow, Ui_MainWindow):
book_id[0], self.currentDate.toString("yyyy-MM-dd") 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.signature))
self.mediaOverview.setItem(0, 1, QtWidgets.QTableWidgetItem(book.title)) self.mediaOverview.setItem(0, 1, QtWidgets.QTableWidgetItem(book.title))
self.mediaOverview.setItem( self.mediaOverview.setItem(
0, 2, QtWidgets.QTableWidgetItem("Zurückgegeben") 0, 2, QtWidgets.QTableWidgetItem("Zurückgegeben")
@@ -384,6 +403,7 @@ class MainUI(QtWidgets.QMainWindow, Ui_MainWindow):
self.input_file_ident.clear() self.input_file_ident.clear()
else: else:
print("Book not found") print("Book not found")
#self.input_file_ident.setPlaceholderText(f"Buch {identifier} nicht gefunden")
def setStatusTipMessage(self, message): def setStatusTipMessage(self, message):
dialog = QtWidgets.QMessageBox() dialog = QtWidgets.QMessageBox()
@@ -397,7 +417,7 @@ def exit_handler():
app = QtWidgets.QApplication(sys.argv) app = QtWidgets.QApplication(sys.argv)
print(backup.backup) print(backup.backup)
# generate report if monday # generate report if monday
if datetime.datetime.now().weekday() == 0: if datetime.datetime.now().weekday() == config.report.report_day:
generate_report() generate_report()
dbg("Generated Report") dbg("Generated Report")
Database().renameInactiveUsers() Database().renameInactiveUsers()
@@ -427,8 +447,8 @@ def exit_handler():
dialog.setWindowTitle("Backup nicht möglich") dialog.setWindowTitle("Backup nicht möglich")
dialog.setText("Backup konnte nicht erstellt werden\nGrund: {}".format(reason)) dialog.setText("Backup konnte nicht erstellt werden\nGrund: {}".format(reason))
dialog.exec() dialog.exec()
def launch(): def launch(options = None):
app = QtWidgets.QApplication(sys.argv) app = QtWidgets.QApplication(sys.argv if options is None else [options])
main_ui = MainUI() main_ui = MainUI()
atexit.register(exit_handler) atexit.register(exit_handler)
sys.exit(app.exec()) sys.exit(app.exec())

View File

@@ -20,6 +20,11 @@ class Settings(QtWidgets.QDialog, Ui_Dialog):
self.database_path.textChanged.connect(self.enableButtonBox) self.database_path.textChanged.connect(self.enableButtonBox)
self.database_name.textChanged.connect(self.enableButtonBox) self.database_name.textChanged.connect(self.enableButtonBox)
self.database_name.textChanged.connect(self.enableButtonBox) self.database_name.textChanged.connect(self.enableButtonBox)
self.delete_inactive_user_duration.textChanged.connect(self.enableButtonBox)
self.report_path.textChanged.connect(self.enableButtonBox)
self.report_day.currentIndexChanged.connect(self.enableButtonBox)
self.check_generate_report.stateChanged.connect(self.enableButtonBox)
# buttonbox # buttonbox
self.buttonBox.accepted.connect(self.saveSettings) self.buttonBox.accepted.connect(self.saveSettings)
@@ -41,6 +46,10 @@ class Settings(QtWidgets.QDialog, Ui_Dialog):
) )
self.btn_select_database_path.clicked.connect(self.selectDatabasePath) self.btn_select_database_path.clicked.connect(self.selectDatabasePath)
self.btn_select_database_name.clicked.connect(self.selectDatabaseName) self.btn_select_database_name.clicked.connect(self.selectDatabaseName)
self.btn_select_report_path.clicked.connect(self.selectReportPath)
#variables
self.settingschanged = False
def enableButtonBox(self): def enableButtonBox(self):
self.buttonBox.button(QtWidgets.QDialogButtonBox.StandardButton.Ok).setEnabled( self.buttonBox.button(QtWidgets.QDialogButtonBox.StandardButton.Ok).setEnabled(
@@ -64,6 +73,18 @@ class Settings(QtWidgets.QDialog, Ui_Dialog):
True True
) )
def selectReportPath(self):
reportPath = QtWidgets.QFileDialog.getExistingDirectory(
self, "Select Report Path", self.originalSettings.report.path
)
self.report_path.setText(reportPath)
self.buttonBox.button(
QtWidgets.QDialogButtonBox.StandardButton.Discard
).setEnabled(True)
self.buttonBox.button(QtWidgets.QDialogButtonBox.StandardButton.Ok).setEnabled(
True
)
def selectDatabasePath(self): def selectDatabasePath(self):
databasePath = QtWidgets.QFileDialog.getExistingDirectory( databasePath = QtWidgets.QFileDialog.getExistingDirectory(
self, "Select Database Path", self.originalSettings.database.path self, "Select Database Path", self.originalSettings.database.path
@@ -97,18 +118,26 @@ class Settings(QtWidgets.QDialog, Ui_Dialog):
# save settings to config file # save settings to config file
institution_name = self.institution_name.text() institution_name = self.institution_name.text()
default_loan_duration = int(self.default_loan_duration.text()) default_loan_duration = int(self.default_loan_duration.text())
delete_inactive_users = int(self.delete_inactive_user_duration.text())
database_backupLocation = self.database_backupLocation.text() database_backupLocation = self.database_backupLocation.text()
database_path = self.database_path.text() database_path = self.database_path.text()
database_name = self.database_name.text() database_name = self.database_name.text()
report_day = self.report_day.currentIndex()
report_generate = self.check_generate_report.isChecked()
report_path = self.report_path.text()
# overwrite the original settings # overwrite the original settings
self.originalSettings.institution_name = institution_name self.originalSettings.institution_name = institution_name
self.originalSettings.default_loan_duration = default_loan_duration self.originalSettings.loan_duration = default_loan_duration
self.originalSettings.database.backupLocation = database_backupLocation self.originalSettings.database.backupLocation = database_backupLocation
self.originalSettings.database.path = database_path self.originalSettings.database.path = database_path
self.originalSettings.database.name = database_name self.originalSettings.database.name = database_name
self.originalSettings.delete_inactive_user_duration = delete_inactive_users
self.originalSettings.report.report_day = report_day
self.originalSettings.report.path = report_path
self.originalSettings.report.generate_report = report_generate
# save the new settings # save the new settings
OmegaConf.save(self.originalSettings, "config/settings.yaml") config.save()
self.settingschanged = True
self.close() self.close()
def DiscardSettings(self): def DiscardSettings(self):
@@ -117,14 +146,20 @@ class Settings(QtWidgets.QDialog, Ui_Dialog):
def loadSettings(self): def loadSettings(self):
self.institution_name.setText(self.originalSettings.institution_name) self.institution_name.setText(self.originalSettings.institution_name)
self.default_loan_duration.setText( self.default_loan_duration.setValue(
str(self.originalSettings.default_loan_duration) int(self.originalSettings.loan_duration)
)
self.delete_inactive_user_duration.setValue(
int(self.originalSettings.delete_inactive_user_duration)
) )
self.database_backupLocation.setText( self.database_backupLocation.setText(
self.originalSettings.database.backupLocation self.originalSettings.database.backupLocation
) )
self.database_path.setText(self.originalSettings.database.path) self.database_path.setText(self.originalSettings.database.path)
self.database_name.setText(self.originalSettings.database.name) self.database_name.setText(self.originalSettings.database.name)
self.report_day.setCurrentIndex(self.originalSettings.report.report_day -1)
self.check_generate_report.setChecked(self.originalSettings.report.generate_report)
self.report_path.setText(self.originalSettings.report.path)
pass pass