Merge commit '95d3de6490c423c4754975f66900f154bea43c89' into dev
This commit is contained in:
@@ -1,10 +1,9 @@
|
||||
import omegaconf
|
||||
import sys
|
||||
# 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 "--debug" in sys.argv:
|
||||
@@ -13,6 +12,7 @@ if "--debug" in sys.argv:
|
||||
if "--log" in sys.argv:
|
||||
config.log_debug = True
|
||||
|
||||
|
||||
# arguments = argparse.ArgumentParser(
|
||||
# prog="Ausleihsystem",
|
||||
# description="Ein Ausleihsystem für Handbibliotheken",
|
||||
|
||||
@@ -180,7 +180,7 @@ class Database:
|
||||
|
||||
users = cursor.fetchall()
|
||||
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)
|
||||
return users
|
||||
|
||||
@@ -190,7 +190,7 @@ class Database:
|
||||
cursor = conn.cursor()
|
||||
try:
|
||||
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()
|
||||
except sql.IntegrityError:
|
||||
@@ -198,15 +198,22 @@ class Database:
|
||||
self.close_connection(conn)
|
||||
return True
|
||||
|
||||
def getUser(self, userid) -> User:
|
||||
def getUser(self, user_id) -> User:
|
||||
conn = self.connect()
|
||||
cursor = conn.cursor()
|
||||
cursor.execute(f"SELECT * FROM users WHERE id = '{userid}'")
|
||||
result = cursor.fetchone()
|
||||
cursor.execute(f"SELECT * FROM users")
|
||||
result = cursor.fetchall()
|
||||
self.close_connection(conn)
|
||||
user = User(id=result[0], username=result[1], email=result[2])
|
||||
log.info(f"Returning User {user}")
|
||||
return user
|
||||
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}")
|
||||
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:
|
||||
conn = self.connect()
|
||||
@@ -214,22 +221,22 @@ class Database:
|
||||
cursor.execute(f"SELECT * FROM users WHERE username = '{username}'")
|
||||
result = cursor.fetchone()
|
||||
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}")
|
||||
return user
|
||||
|
||||
def updateUser(self, username, userno, usermail):
|
||||
def updateUser(self, username, user_id, usermail):
|
||||
log.debug(f"Updating User {userno}, {username}, {usermail}")
|
||||
conn = self.connect()
|
||||
cursor = conn.cursor()
|
||||
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()
|
||||
self.close_connection(conn)
|
||||
|
||||
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()
|
||||
cursor = conn.cursor()
|
||||
cursor.execute(query)
|
||||
@@ -237,24 +244,27 @@ class Database:
|
||||
dbg(f"Setting User {userid} to active on {date}")
|
||||
|
||||
def renameInactiveUsers(self):
|
||||
lastYear = QtCore.QDate.currentDate().addDays(int(f"-{config.inactive_user_deletion}")).toString("yyyy-MM-dd")
|
||||
query = f"SELECT * FROM users WHERE lastActive < '{lastYear}'"
|
||||
lastYear = QtCore.QDate.currentDate().addDays(int(f"-{config.delete_inactive_user_duration}")).toString("yyyy-MM-dd")
|
||||
query = f"SELECT id FROM users WHERE lastActive < '{lastYear}'"
|
||||
conn = self.connect()
|
||||
cursor = conn.cursor()
|
||||
result = cursor.execute(query).fetchall()
|
||||
self.close_connection(conn)
|
||||
for user in result:
|
||||
self.updateUser("gelöscht", user[0], "gelöscht")
|
||||
if len(result) == 0:
|
||||
log.info(f"Deleting {len(result)} inactive users")
|
||||
for user in result:
|
||||
self.deleteUser(user)
|
||||
|
||||
def deleteUser(self, userid):
|
||||
log.debug(f"Deleting User {userid}")
|
||||
conn = self.connect()
|
||||
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()
|
||||
self.close_connection(conn)
|
||||
|
||||
def getActiveLoans(self, userid):
|
||||
dbg("id", str(userid))
|
||||
conn = self.connect()
|
||||
cursor = conn.cursor()
|
||||
try:
|
||||
@@ -442,6 +452,7 @@ class Database:
|
||||
cursor = conn.cursor()
|
||||
cursor.execute(query)
|
||||
result = cursor.fetchone()
|
||||
print(result)
|
||||
self.close_connection(conn)
|
||||
if result is not None:
|
||||
return result[0]
|
||||
|
||||
@@ -48,7 +48,7 @@ class MainUI(QtWidgets.QMainWindow, Ui_MainWindow):
|
||||
|
||||
# LineEdits
|
||||
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(
|
||||
lambda: self.checkUser("username", self.input_username.text())
|
||||
@@ -72,7 +72,7 @@ class MainUI(QtWidgets.QMainWindow, Ui_MainWindow):
|
||||
# variables
|
||||
self.db = Database()
|
||||
self.currentDate = QtCore.QDate.currentDate()
|
||||
loanDate = self.currentDate.addDays(config.default_loan_duration)
|
||||
loanDate = self.currentDate.addDays(config.loan_duration)
|
||||
self.activeUser = None
|
||||
self.activeState = "Rückgabe"
|
||||
|
||||
@@ -107,6 +107,9 @@ class MainUI(QtWidgets.QMainWindow, Ui_MainWindow):
|
||||
log.info("Showing Settings")
|
||||
settings = Settings()
|
||||
settings.exec()
|
||||
if settings.settingschanged:
|
||||
# reload settings
|
||||
print(config)
|
||||
|
||||
def changeMode(self):
|
||||
log.info("Changing Mode")
|
||||
@@ -119,8 +122,10 @@ class MainUI(QtWidgets.QMainWindow, Ui_MainWindow):
|
||||
self.label_7.hide()
|
||||
self.nextReturnDate.hide()
|
||||
self.mediaOverview.setRowCount(0)
|
||||
self.activeUser = None #! remove if last user should be kept
|
||||
if self.activeState == "Rückgabe":
|
||||
self.activateLoanMode()
|
||||
|
||||
else:
|
||||
self.activateReturnMode()
|
||||
|
||||
@@ -135,6 +140,11 @@ class MainUI(QtWidgets.QMainWindow, Ui_MainWindow):
|
||||
self.mode.setStyleSheet("background-color: #1E90FF")
|
||||
self.mode.setText("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):
|
||||
dbg("Activating Return Mode")
|
||||
@@ -145,6 +155,8 @@ class MainUI(QtWidgets.QMainWindow, Ui_MainWindow):
|
||||
self.duedate.setEnabled(False)
|
||||
self.activeState = "Rückgabe"
|
||||
self.mode.setText("Rückgabe")
|
||||
self.input_file_ident.setEnabled(True)
|
||||
self.input_file_ident.setPlaceholderText("Buchidentifikation eingeben")
|
||||
|
||||
def showUser(self):
|
||||
log.info(f"Showing User {self.activeUser}")
|
||||
@@ -160,18 +172,18 @@ class MainUI(QtWidgets.QMainWindow, Ui_MainWindow):
|
||||
return
|
||||
|
||||
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.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.input_username.setText(str(self.activeUser.username))
|
||||
self.input_userno.setText(str(self.activeUser.userid))
|
||||
self.userdata.setText(self.activeUser.__repr__())
|
||||
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")
|
||||
|
||||
def createUser(self):
|
||||
@@ -222,14 +234,19 @@ class MainUI(QtWidgets.QMainWindow, Ui_MainWindow):
|
||||
self.setUserData()
|
||||
self.input_file_ident.setFocus()
|
||||
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)
|
||||
if retdate:
|
||||
date = stringToDate(retdate).toString("dd.MM.yyyy")
|
||||
self.nextReturnDate.setText(date)
|
||||
self.nextReturnDate.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):
|
||||
log.debug("Moving to Line", line)
|
||||
line.setFocus()
|
||||
@@ -253,9 +270,9 @@ class MainUI(QtWidgets.QMainWindow, Ui_MainWindow):
|
||||
dialog.exec()
|
||||
return
|
||||
self.mediaAdd(value)
|
||||
|
||||
self.input_file_ident.setFocus()
|
||||
def mediaAdd(self, identifier):
|
||||
# print("Adding Media", identifier)
|
||||
dbg("Adding Media", identifier = identifier)
|
||||
self.input_file_ident.clear()
|
||||
self.input_file_ident.setEnabled(False)
|
||||
|
||||
@@ -282,7 +299,7 @@ class MainUI(QtWidgets.QMainWindow, Ui_MainWindow):
|
||||
|
||||
elif book_id:
|
||||
if isinstance(book_id, list) and len(book_id) > 1:
|
||||
# print("Multiple Books found")
|
||||
print("Multiple Books found")
|
||||
# TODO: implement book selection dialog
|
||||
return
|
||||
else:
|
||||
@@ -324,15 +341,17 @@ class MainUI(QtWidgets.QMainWindow, Ui_MainWindow):
|
||||
return
|
||||
else:
|
||||
# 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(
|
||||
user_id,
|
||||
book_id[0],
|
||||
self.currentDate.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.setItem(0, 0, QtWidgets.QTableWidgetItem(media.signature))
|
||||
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")
|
||||
)
|
||||
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, 2, QtWidgets.QTableWidgetItem("Zurückgegeben")
|
||||
@@ -384,6 +403,7 @@ class MainUI(QtWidgets.QMainWindow, Ui_MainWindow):
|
||||
self.input_file_ident.clear()
|
||||
else:
|
||||
print("Book not found")
|
||||
#self.input_file_ident.setPlaceholderText(f"Buch {identifier} nicht gefunden")
|
||||
|
||||
def setStatusTipMessage(self, message):
|
||||
dialog = QtWidgets.QMessageBox()
|
||||
@@ -397,7 +417,7 @@ def exit_handler():
|
||||
app = QtWidgets.QApplication(sys.argv)
|
||||
print(backup.backup)
|
||||
# generate report if monday
|
||||
if datetime.datetime.now().weekday() == 0:
|
||||
if datetime.datetime.now().weekday() == config.report.report_day:
|
||||
generate_report()
|
||||
dbg("Generated Report")
|
||||
Database().renameInactiveUsers()
|
||||
@@ -427,8 +447,8 @@ def exit_handler():
|
||||
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)
|
||||
def launch(options = None):
|
||||
app = QtWidgets.QApplication(sys.argv if options is None else [options])
|
||||
main_ui = MainUI()
|
||||
atexit.register(exit_handler)
|
||||
sys.exit(app.exec())
|
||||
|
||||
@@ -20,6 +20,11 @@ class Settings(QtWidgets.QDialog, Ui_Dialog):
|
||||
self.database_path.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
|
||||
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_name.clicked.connect(self.selectDatabaseName)
|
||||
self.btn_select_report_path.clicked.connect(self.selectReportPath)
|
||||
#variables
|
||||
|
||||
self.settingschanged = False
|
||||
|
||||
def enableButtonBox(self):
|
||||
self.buttonBox.button(QtWidgets.QDialogButtonBox.StandardButton.Ok).setEnabled(
|
||||
@@ -64,6 +73,18 @@ class Settings(QtWidgets.QDialog, Ui_Dialog):
|
||||
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):
|
||||
databasePath = QtWidgets.QFileDialog.getExistingDirectory(
|
||||
self, "Select Database Path", self.originalSettings.database.path
|
||||
@@ -97,18 +118,26 @@ class Settings(QtWidgets.QDialog, Ui_Dialog):
|
||||
# save settings to config file
|
||||
institution_name = self.institution_name.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_path = self.database_path.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
|
||||
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.path = database_path
|
||||
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
|
||||
OmegaConf.save(self.originalSettings, "config/settings.yaml")
|
||||
|
||||
config.save()
|
||||
self.settingschanged = True
|
||||
self.close()
|
||||
|
||||
def DiscardSettings(self):
|
||||
@@ -117,14 +146,20 @@ class Settings(QtWidgets.QDialog, Ui_Dialog):
|
||||
|
||||
def loadSettings(self):
|
||||
self.institution_name.setText(self.originalSettings.institution_name)
|
||||
self.default_loan_duration.setText(
|
||||
str(self.originalSettings.default_loan_duration)
|
||||
self.default_loan_duration.setValue(
|
||||
int(self.originalSettings.loan_duration)
|
||||
)
|
||||
self.delete_inactive_user_duration.setValue(
|
||||
int(self.originalSettings.delete_inactive_user_duration)
|
||||
)
|
||||
self.database_backupLocation.setText(
|
||||
self.originalSettings.database.backupLocation
|
||||
)
|
||||
self.database_path.setText(self.originalSettings.database.path)
|
||||
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
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user