update documentation, rework documentation thread, rework book dataclass, fix newentry bug
This commit is contained in:
11
docs/Allgemeines.md
Normal file
11
docs/Allgemeines.md
Normal file
@@ -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.
|
||||
@@ -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_<Jahr>_<Kalenderwoche>.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
|
||||
|
||||

|
||||
|
||||
Im Anschluss an diesen Dialog erscheint ein neuer Dialog:
|
||||
|
||||

|
||||
|
||||
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.
|
||||
Binary file not shown.
|
Before Width: | Height: | Size: 7.2 KiB After Width: | Height: | Size: 6.8 KiB |
@@ -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
|
||||
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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()):
|
||||
|
||||
Reference in New Issue
Block a user