diff --git a/src/__init__.py b/src/__init__.py index 0ae70f2..0459e99 100644 --- a/src/__init__.py +++ b/src/__init__.py @@ -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: @@ -12,6 +11,7 @@ if "--debug" in sys.argv: # if programm launched with argument --log, set log_debug if "--log" in sys.argv: config.log_debug = True + # arguments = argparse.ArgumentParser( # prog="Ausleihsystem", diff --git a/src/logic/database.py b/src/logic/database.py index d1e2939..6c8f216 100644 --- a/src/logic/database.py +++ b/src/logic/database.py @@ -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] diff --git a/src/ui/main_ui.py b/src/ui/main_ui.py index 9d656f5..3df118c 100644 --- a/src/ui/main_ui.py +++ b/src/ui/main_ui.py @@ -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()) diff --git a/src/ui/settings.py b/src/ui/settings.py index d3d79c6..5612877 100644 --- a/src/ui/settings.py +++ b/src/ui/settings.py @@ -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( @@ -63,6 +72,18 @@ class Settings(QtWidgets.QDialog, Ui_Dialog): self.buttonBox.button(QtWidgets.QDialogButtonBox.StandardButton.Ok).setEnabled( 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( @@ -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