diff --git a/docs/Allgemeines.md b/docs/Allgemeines.md new file mode 100644 index 0000000..b963ff8 --- /dev/null +++ b/docs/Allgemeines.md @@ -0,0 +1,11 @@ +# Allgemeines + +Hier werden alle allgemeinen Informationen zur Anwendung aufgeführt, die nicht direkt in die anderen Bereiche passen. + +## Datenbankbackup + +Bei jedem schließen der Anwendung wird ein Backup der Datenbank erstellt. Dieses Backup wird im Sicherungspfad gespeichert, dieser ist in den Einstellungen einsehbar und änderbar. + +Sollte der normale Speicherpfad nicht existieren oder nicht erreichbar sein (im Falle eines Netzwerklaufwerks), wird der Backuppfad verwendet. Beim Schließen der Anwendung wird ein Fehler erscheinen, dass das erstellen des Backups nicht erfolgreich war. Solange der Originale Pfad nicht erreichbar ist, wird der Backuppfad verwendet. + +Sobald der Originale Pfad wieder erreichbar ist, wird die Datenbank in den Originalen Pfad kopiert, die veraltete Datenbank wird gelöscht und der Backuppfad wird wieder verwendet. diff --git a/docs/Einstellungen.md b/docs/Einstellungen.md index 19d3963..89bf84f 100644 --- a/docs/Einstellungen.md +++ b/docs/Einstellungen.md @@ -4,6 +4,48 @@ ## Bedienung Hier werden die Einstellungen geändert. Sobald ein Wert geändert wird, ist es möglich die Einstellungen rückgängig zu machen, oder die Änderungen zu speichern. +## Einstellungsoptionen + +### Name der Einrichtung +Hier kann der Name der Einrichtung geändert werden. Dieser wird in der Kopfzeile der Anwendung angezeigt, und im Katalog verwendet um Exemplare zu finden. + +### Leihdauer +Hier kann die Leihdauer festgelegt werden. Standardmäßig ist diese auf 7 Tage gesetzt + +### Inaktive Nutzer löschen +Hier kann festgelegt werden, wie lange Inaktive Nutzer im System bleiben. Dieser Zeitraum wird ab dem letzten Öffnen des Nutzerkontos berechnet. Standardmäßig ist dieser auf 365 Tage gesetzt. +### Erweiterter Rückgabemodus +Wird hier der Haken gesetzt, wird die Bedinung der Anwendung geändert. Anstatt dass F5 zwischen Ausleihe und Rückgabe wechselt, wird, wenn die Rückgabe offen und ein Nutzer Offen ist, die Rückgabe zurückgesetzt. Diese Aktion orientiert sich an aDIS, dem Ausleihsystem der Bibliothek + + + +### Datenbank +Hier werden die Datenbankoptionen geändert. + +- Speicherort: Hier wird der Speicherort der Datenbank geändert. Standardmäßig ist dieser auf den Ordner der Anwendung gesetzt (database) + +- Datenbankname: Hier wird der Name der Datenbank geändert. Standardmäßig ist dieser auf "library.db" gesetzt + +- Sicherungspfad: Hier wird der Pfad für die Sicherung der Datenbank geändert. Standardmäßig ist dieser auf den Ordner der Anwendung gesetzt (backup) + +### Bericht +Hier werden die Einstellungen für die Berichte geändert. + +- Tag: Der Wochentag, an dem die Berichte erstellt werden sollen +- Berichte erstellen: Ist der Haken gesetzt, werden Berichte erstellt +- Speicherpfad: Speicherort für Berichte, standardmäßig ist dieser auf den Ordner der Anwendung gesetzt (report) +!!! Info + Automatische Berichte werden in diesem Format erstellt: + `report__.tsv` + +Wird die Anwendung am Tag der Berichterstellung mehrfach geöffnet, wird nur ein Bericht erstellt + +### Shortcuts +Hier können die Shortcuts angepasst werden. Um einen Shortcut zu ändern, muss ein Doppelklick auf das entsprechende Feld in der Spalte "Aktuell" gemacht werden. +Anschließend kann der gewünschte Shortcut eingegeben werden. +(Eine Änderung der Shortcuts erfordert einen Neustart der Anwendung) + + ## Besonderheiten Der Knopf neben Speicherort, Datenbankname, Sicherungspfad und Speicherpfad kann verwendet werden, um den Pfad gezielt zu setzen. @@ -15,7 +57,4 @@ Einige Aktionen (bspw. Änderungen der Shortcuts) erfordern einen Neustart der A ![restart](images/restart.png) -Im Anschluss an diesen Dialog erscheint ein neuer Dialog: - -![restart Application](images/settings_changed_restart.png) - +Mit einem Klick auf "Ja" wird die Anwendung neu gestartet und die Änderungen übernommen. Mit einem Klick auf "Nein" werden die Änderungen nicht übernommen und die Anwendung bleibt im aktuellen Zustand. \ No newline at end of file diff --git a/docs/images/restart.png b/docs/images/restart.png index 249f44d..71d3fdc 100644 Binary files a/docs/images/restart.png and b/docs/images/restart.png differ diff --git a/docs/index.md b/docs/index.md index 0f0c53a..58475c0 100644 --- a/docs/index.md +++ b/docs/index.md @@ -17,5 +17,6 @@ Unterbereiche umfassen: - [Ausleihhistorie](Ausleihhistorie.md) - Historie der Ausleihen - [Bericht erstellen](Bericht erstellen.md) - Bericht für einen festgelegten Zeitrahmen erstellen - [Einstellungen](Einstellungen.md) - Einstellungen der Anwendung ändern +- [Allgemeines](Allgemeines.md) - Allgemeine Informationen zur Anwendung diff --git a/src/__init__.py b/src/__init__.py index 520de58..01fe4aa 100644 --- a/src/__init__.py +++ b/src/__init__.py @@ -9,7 +9,7 @@ __version__ = "0.2.18" __author__ = "Alexander Kirchner" __email__ = "alexander.kirchner@ph-freiburg.de" __license__ = "MIT" -docport = 6543 +docport = 8000 config = Config("config/settings.yaml") @@ -56,7 +56,6 @@ log.add( rotation="1 day", compression="zip", ) -print(config.debug) if config.debug: import sys diff --git a/src/logic/documentation_thread.py b/src/logic/documentation_thread.py index 65b7d7e..f25e320 100644 --- a/src/logic/documentation_thread.py +++ b/src/logic/documentation_thread.py @@ -1,10 +1,10 @@ from PyQt6.QtCore import QThread, pyqtSignal -from src.utils import launch_documentation - +from src.utils.documentation import run_mkdocs class DocumentationThread(QThread): def __init__(self): super().__init__() def run(self): - launch_documentation() + # launch_documentation() + run_mkdocs() diff --git a/src/schemas/book.py b/src/schemas/book.py index 76893c8..6e9a904 100644 --- a/src/schemas/book.py +++ b/src/schemas/book.py @@ -3,14 +3,14 @@ from dataclasses import dataclass @dataclass class Book: - title: str = "" - ppn: int = "" - signature: str = "" - isbn: str = "" - link: str = "" - database_id: int = "" - link: str = "" - loan_from: str = "" - loan_to: str = "" - returned: int = "" - returned_date: str = "" + title: str | None = None + ppn: int | None = None + signature: str | None = None + isbn: str | None = None + link: str | None = None + database_id: int | None = None + link: str | None = None + loan_from: str | None = None + loan_to: str | None = None + returned: int | None = None + returned_date: str | None = None diff --git a/src/ui/main_ui.py b/src/ui/main_ui.py index 6a98abe..8d9bcd3 100644 --- a/src/ui/main_ui.py +++ b/src/ui/main_ui.py @@ -1,3 +1,4 @@ +import os import sys import atexit import datetime @@ -281,9 +282,11 @@ class MainUI(QtWidgets.QMainWindow, Ui_MainWindow): def createUser(self): log.info("Creating User") user = CreateUser(fieldname="id", data="") + user.setWindowModality( + QtCore.Qt.WindowModality.ApplicationModal + ) # Block MainUI fom being accessed user.exec() userid = user.userid - print(userid) if userid: log.info(f"User created {userid}") data = self.db.getUserBy("user_id", userid) @@ -319,16 +322,13 @@ class MainUI(QtWidgets.QMainWindow, Ui_MainWindow): multi.exec() self.activeUser = multi.userdata else: - # print("User found", user[0]) self.activeUser = user[0] if self.activeUser is not None: log.info(f"User found {self.activeUser}") - # print("User found", self.activeUser) self.setUserData() self.input_file_ident.setFocus() self.mode.setText("Ausleihe") - # print(self.activeUser.__dict__) loans = self.db.getActiveLoans(self.activeUser.id) log.debug("Active Loans", loans) self.btn_show_lentmedia.setText(loans) @@ -416,8 +416,8 @@ class MainUI(QtWidgets.QMainWindow, Ui_MainWindow): elif book_id: if isinstance(book_id, list) and len(book_id) > 1: - # print("Multiple Books found") # TODO: implement book selection dialog + raise NotImplementedError("Multiple books found") return else: if isinstance(book_id, int): @@ -456,8 +456,16 @@ class MainUI(QtWidgets.QMainWindow, Ui_MainWindow): if newentries: for entry in newentries: book = self.db.getMedia(entry) - self.loanMedia(user_id, [entry], book) + log.debug( + "Inserting duplicated book {} with id {} to user {}".format( + book, entry, user_id + ) + ) + self.loanMedia(user_id, [entry]) log.info("inserted duplicated book into database") + else: + log.info("No new entry created") + self.input_file_ident.setEnabled(True) return else: # print("Book not loaned, loaning now") @@ -559,7 +567,13 @@ def exit_handler(): # set icon dialog.setWindowIcon(Icon("backup").icon) dialog.setWindowTitle("Backup") - dialog.setText("Backup konnte nicht erstellt werden") + errormsg = "Backup konnte nicht erstellt werden\nGrund: {}" + files = os.listdir(config.database.backupLocation) + if ".backup" in files: + errormsg = errormsg.format("Normaler speicherort nicht gefunden") + else: + errormsg = errormsg.format("Backuppfad nicht gefunden") + dialog.setText(errormsg) dialog.exec() log.info("Exiting, backup:", state) diff --git a/src/ui/newentry.py b/src/ui/newentry.py index 92997e1..31cea02 100644 --- a/src/ui/newentry.py +++ b/src/ui/newentry.py @@ -36,16 +36,27 @@ class NewEntry(QtWidgets.QDialog, Ui_Dialog): self.tableWidget.setItem( row, i, QtWidgets.QTableWidgetItem(self.tableWidget.item(row - 1, i)) ) - if i == 2 and "+" in self.tableWidget.item(row, i).text(): - entry = self.tableWidget.item(row, i).text().split("+")[1] - entry = str(int(entry) + 1) - self.tableWidget.setItem( - row, - i, - QtWidgets.QTableWidgetItem( - self.tableWidget.item(row, i).text().split("+")[0] + "+" + entry - ), - ) + if i == 2: + if "+" in self.tableWidget.item(row, i).text(): + entry = self.tableWidget.item(row, i).text().split("+")[1] + entry = str(int(entry) + 1) + self.tableWidget.setItem( + row, + i, + QtWidgets.QTableWidgetItem( + self.tableWidget.item(row, i).text().split("+")[0] + + "+" + + entry + ), + ) + else: + self.tableWidget.setItem( + row, + i, + QtWidgets.QTableWidgetItem( + self.tableWidget.item(row, i).text() + "+1" + ), + ) def populateTable(self): for title in self.titles: @@ -61,7 +72,11 @@ class NewEntry(QtWidgets.QDialog, Ui_Dialog): 0, 2, QtWidgets.QTableWidgetItem(entry.signature) ) self.tableWidget.setItem(0, 3, QtWidgets.QTableWidgetItem(entry.ppn)) - + # set row to be not editable + for i in range(4): + self.tableWidget.item(0, i).setFlags( + QtCore.Qt.ItemFlag.ItemIsEnabled + ) def insertEntry(self): # get all rows, convert them to Book and insert into database for row in range(self.tableWidget.rowCount()):