diff --git a/docs/Bericht erstellen.md b/docs/Bericht erstellen.md
index 009a936..4e858f8 100644
--- a/docs/Bericht erstellen.md
+++ b/docs/Bericht erstellen.md
@@ -14,6 +14,10 @@ Um einen Bericht zu erstellen, müssen folgende Kriterien erfüllt sein:
- Zeitspanne festgelegt (Entweder über den Slider, oder über die Buttons für Woche / Monat / Jahr)
- Dateiformat muss festgelegt worden sein.
+!!! info "Optional: Signatur"
+
+ Optional kann ein Haken bei `Signatur anzeigen` gesetzt werden. Der Bericht wird nun die Signatur der ausgeführten Aktion enthalten.
+
Bei größeren Datensätzen kann es länger dauern. Eine Fortschrittsanzeige gibt an, wie weit der Prozess ist.
Wurde der Bericht erfolgreich erstellt, sieht die Oberfläche wie folgt aus:
diff --git a/docs/images/generateReport.png b/docs/images/generateReport.png
index 2ee367a..ce67dbb 100644
Binary files a/docs/images/generateReport.png and b/docs/images/generateReport.png differ
diff --git a/docs/images/generatedReport.png b/docs/images/generatedReport.png
index 6122367..fb51732 100644
Binary files a/docs/images/generatedReport.png and b/docs/images/generatedReport.png differ
diff --git a/src/ui/reportUi.py b/src/ui/reportUi.py
index 4d09f75..6f2bd95 100644
--- a/src/ui/reportUi.py
+++ b/src/ui/reportUi.py
@@ -4,6 +4,7 @@ from src.utils import Icon
from src.utils.reportThread import ReportThread
from src.logic import Database
import os
+from src import config, log
class ReportUi(QtWidgets.QDialog, Ui_Dialog):
@@ -31,14 +32,19 @@ class ReportUi(QtWidgets.QDialog, Ui_Dialog):
self.format_txt.clicked.connect(lambda: self.rthread.setFormat("txt"))
self.format_csv.clicked.connect(lambda: self.rthread.setFormat("tsv"))
self.format_csv.clicked.connect(lambda: self.generateReport.setEnabled(True))
- self.format_txt.clicked.connect(lambda: self.generateReport.setEnabled(True))
+ self.format_txt.clicked.connect(lambda: self.generateReport.setEnabled(True)) #
+ self.signature.clicked.connect(self.setSignature)
# sliders
- self.dayslider.valueChanged.connect(self.set_days)
+ self.dayslider.valueChanged.connect(self.set_days_slider)
self.show()
# labels
self.label_4.hide()
+ def setSignature(self):
+ show_signature = self.signature.isChecked()
+ config.report.show_signature = show_signature
+
def set_days_by_radio(self):
if self.radio_year.isChecked():
self.set_days(365)
@@ -50,15 +56,26 @@ class ReportUi(QtWidgets.QDialog, Ui_Dialog):
self.set_days(7)
self.dayslider.setValue(7)
- def set_days(self, value):
- # if value is not 7,30,365, deactivate radio buttons
- if value != 7 and value != 30 and value != 365:
- self.radioButton.setChecked(True)
+ def set_days(self, days=None):
+ self.days = days
- self.days = value
- self.dayValue.setText(str(value))
+ self.dayValue.setText(str(self.days))
+ def set_days_slider(self):
+ slider_value = self.dayslider.value()
+ self.set_days(slider_value)
+ match slider_value:
+ case 365:
+ self.radio_year.setChecked(True)
+ case 30:
+ self.radio_month.setChecked(True)
+ case 7:
+ self.radio_week.setChecked(True)
+ case _:
+ self.radioButton.setChecked(True)
def generate_report(self):
+ # self.set_days()
+ log.debug("Generating report for the last " + str(self.days) + " days")
self.rthread.setDays(self.days)
self.rthread.report_signal.connect(self.report_generated)
self.rthread.report_nums_signal.connect(self.show_progress)
@@ -68,7 +85,6 @@ class ReportUi(QtWidgets.QDialog, Ui_Dialog):
self.rthread.start()
def reset(self):
- self.days = 0
self.reportprogress.hide()
self.reportprogress.setValue(0)
self.label_4.setText("Fortschritt:")
diff --git a/src/ui/sources/Ui_dialog_generateReport.py b/src/ui/sources/Ui_dialog_generateReport.py
index c065ea3..7485954 100644
--- a/src/ui/sources/Ui_dialog_generateReport.py
+++ b/src/ui/sources/Ui_dialog_generateReport.py
@@ -12,7 +12,7 @@ from PyQt6 import QtCore, QtGui, QtWidgets
class Ui_Dialog(object):
def setupUi(self, Dialog):
Dialog.setObjectName("Dialog")
- Dialog.setWindowModality(QtCore.Qt.WindowModality.ApplicationModal)
+ Dialog.setWindowModality(QtCore.Qt.WindowModality.NonModal)
Dialog.resize(375, 245)
Dialog.setMinimumSize(QtCore.QSize(40, 0))
self.verticalLayout = QtWidgets.QVBoxLayout(Dialog)
@@ -22,9 +22,11 @@ class Ui_Dialog(object):
self.verticalLayout.addWidget(self.label)
self.gridLayout = QtWidgets.QGridLayout()
self.gridLayout.setObjectName("gridLayout")
- self.label_2 = QtWidgets.QLabel(parent=Dialog)
- self.label_2.setObjectName("label_2")
- self.gridLayout.addWidget(self.label_2, 0, 0, 1, 1)
+ self.radioButton = QtWidgets.QRadioButton(parent=Dialog)
+ self.radioButton.setText("")
+ self.radioButton.setCheckable(True)
+ self.radioButton.setObjectName("radioButton")
+ self.gridLayout.addWidget(self.radioButton, 4, 2, 1, 1)
self.horizontalLayout = QtWidgets.QHBoxLayout()
self.horizontalLayout.setObjectName("horizontalLayout")
self.radio_week = QtWidgets.QRadioButton(parent=Dialog)
@@ -37,10 +39,11 @@ class Ui_Dialog(object):
self.radio_year.setObjectName("radio_year")
self.horizontalLayout.addWidget(self.radio_year)
self.gridLayout.addLayout(self.horizontalLayout, 1, 1, 1, 1)
+ self.label_3 = QtWidgets.QLabel(parent=Dialog)
+ self.label_3.setObjectName("label_3")
+ self.gridLayout.addWidget(self.label_3, 2, 0, 1, 1)
self.dayValue = QtWidgets.QLineEdit(parent=Dialog)
- sizePolicy = QtWidgets.QSizePolicy(
- QtWidgets.QSizePolicy.Policy.Fixed, QtWidgets.QSizePolicy.Policy.Fixed
- )
+ sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Policy.Fixed, QtWidgets.QSizePolicy.Policy.Fixed)
sizePolicy.setHorizontalStretch(0)
sizePolicy.setVerticalStretch(0)
sizePolicy.setHeightForWidth(self.dayValue.sizePolicy().hasHeightForWidth())
@@ -51,15 +54,24 @@ class Ui_Dialog(object):
self.dayValue.setReadOnly(True)
self.dayValue.setObjectName("dayValue")
self.gridLayout.addWidget(self.dayValue, 0, 2, 1, 1)
- self.radioButton = QtWidgets.QRadioButton(parent=Dialog)
- self.radioButton.setText("")
- self.radioButton.setCheckable(True)
- self.radioButton.setObjectName("radioButton")
- self.gridLayout.addWidget(self.radioButton, 3, 2, 1, 1)
self.reportlink = QtWidgets.QLabel(parent=Dialog)
self.reportlink.setText("")
self.reportlink.setObjectName("reportlink")
- self.gridLayout.addWidget(self.reportlink, 3, 1, 1, 1)
+ self.gridLayout.addWidget(self.reportlink, 4, 1, 1, 1)
+ self.frame = QtWidgets.QFrame(parent=Dialog)
+ self.frame.setFrameShape(QtWidgets.QFrame.Shape.NoFrame)
+ self.frame.setFrameShadow(QtWidgets.QFrame.Shadow.Plain)
+ self.frame.setLineWidth(0)
+ self.frame.setObjectName("frame")
+ self.gridLayout_2 = QtWidgets.QGridLayout(self.frame)
+ self.gridLayout_2.setObjectName("gridLayout_2")
+ self.format_csv = QtWidgets.QRadioButton(parent=self.frame)
+ self.format_csv.setObjectName("format_csv")
+ self.gridLayout_2.addWidget(self.format_csv, 0, 1, 1, 1)
+ self.format_txt = QtWidgets.QRadioButton(parent=self.frame)
+ self.format_txt.setObjectName("format_txt")
+ self.gridLayout_2.addWidget(self.format_txt, 0, 0, 1, 1)
+ self.gridLayout.addWidget(self.frame, 2, 1, 1, 1)
self.dayslider = QtWidgets.QSlider(parent=Dialog)
self.dayslider.setFocusPolicy(QtCore.Qt.FocusPolicy.ClickFocus)
self.dayslider.setMinimum(1)
@@ -70,23 +82,12 @@ class Ui_Dialog(object):
self.dayslider.setTickInterval(10)
self.dayslider.setObjectName("dayslider")
self.gridLayout.addWidget(self.dayslider, 0, 1, 1, 1)
- self.frame = QtWidgets.QFrame(parent=Dialog)
- self.frame.setFrameShape(QtWidgets.QFrame.Shape.NoFrame)
- self.frame.setFrameShadow(QtWidgets.QFrame.Shadow.Plain)
- self.frame.setLineWidth(0)
- self.frame.setObjectName("frame")
- self.gridLayout_2 = QtWidgets.QGridLayout(self.frame)
- self.gridLayout_2.setObjectName("gridLayout_2")
- self.format_txt = QtWidgets.QRadioButton(parent=self.frame)
- self.format_txt.setObjectName("format_txt")
- self.gridLayout_2.addWidget(self.format_txt, 0, 0, 1, 1)
- self.format_csv = QtWidgets.QRadioButton(parent=self.frame)
- self.format_csv.setObjectName("format_csv")
- self.gridLayout_2.addWidget(self.format_csv, 0, 1, 1, 1)
- self.gridLayout.addWidget(self.frame, 2, 1, 1, 1)
- self.label_3 = QtWidgets.QLabel(parent=Dialog)
- self.label_3.setObjectName("label_3")
- self.gridLayout.addWidget(self.label_3, 2, 0, 1, 1)
+ self.label_2 = QtWidgets.QLabel(parent=Dialog)
+ self.label_2.setObjectName("label_2")
+ self.gridLayout.addWidget(self.label_2, 0, 0, 1, 1)
+ self.signature = QtWidgets.QCheckBox(parent=Dialog)
+ self.signature.setObjectName("signature")
+ self.gridLayout.addWidget(self.signature, 3, 1, 1, 1)
self.verticalLayout.addLayout(self.gridLayout)
self.label_4 = QtWidgets.QLabel(parent=Dialog)
self.label_4.setObjectName("label_4")
@@ -110,15 +111,14 @@ class Ui_Dialog(object):
def retranslateUi(self, Dialog):
_translate = QtCore.QCoreApplication.translate
Dialog.setWindowTitle(_translate("Dialog", "Dialog"))
- self.label.setText(
- _translate("Dialog", "Wieviele Tage sollen im Bericht erfasst werden?")
- )
- self.label_2.setText(_translate("Dialog", "Tage"))
+ self.label.setText(_translate("Dialog", "Wieviele Tage sollen im Bericht erfasst werden?"))
self.radio_week.setText(_translate("Dialog", "Woche"))
self.radio_month.setText(_translate("Dialog", "Monat"))
self.radio_year.setText(_translate("Dialog", "Jahr"))
- self.format_txt.setText(_translate("Dialog", "Text"))
- self.format_csv.setText(_translate("Dialog", "Excel"))
self.label_3.setText(_translate("Dialog", "Dateiformat"))
+ self.format_csv.setText(_translate("Dialog", "Excel"))
+ self.format_txt.setText(_translate("Dialog", "Text"))
+ self.label_2.setText(_translate("Dialog", "Tage"))
+ self.signature.setText(_translate("Dialog", "Signatur anzeigen"))
self.label_4.setText(_translate("Dialog", "Fortschritt:"))
self.generateReport.setText(_translate("Dialog", " Bericht erstellen"))
diff --git a/src/ui/sources/dialog_generateReport.ui b/src/ui/sources/dialog_generateReport.ui
index c03dd83..b450d49 100644
--- a/src/ui/sources/dialog_generateReport.ui
+++ b/src/ui/sources/dialog_generateReport.ui
@@ -32,10 +32,13 @@
-
-
-
-
+
-
+
- Tage
+
+
+
+ true
@@ -64,6 +67,13 @@
+ -
+
+
+ Dateiformat
+
+
+
-
@@ -92,23 +102,42 @@
- -
-
-
-
-
-
- true
-
-
-
- -
+
-
+ -
+
+
+ QFrame::NoFrame
+
+
+ QFrame::Plain
+
+
+ 0
+
+
+
-
+
+
+ Excel
+
+
+
+ -
+
+
+ Text
+
+
+
+
+
+
-
@@ -134,39 +163,17 @@
- -
-
-
- QFrame::NoFrame
+
-
+
+
+ Tage
-
- QFrame::Plain
-
-
- 0
-
-
-
-
-
-
- Text
-
-
-
- -
-
-
- Excel
-
-
-
-
- -
-
+
-
+
- Dateiformat
+ Signatur anzeigen
diff --git a/src/utils/reportThread.py b/src/utils/reportThread.py
index ff7a827..c4eb662 100644
--- a/src/utils/reportThread.py
+++ b/src/utils/reportThread.py
@@ -3,6 +3,7 @@ from prettytable import PrettyTable
from src.logic import Database
from src.utils import stringToDate
import sqlite3 as sql
+from src import config, log
class ReportThread(QThread):
report_signal = pyqtSignal(str)
@@ -26,7 +27,12 @@ class ReportThread(QThread):
path = db.db_path
day = QDate.currentDate().addDays(-self.days).toString("yyyy-MM-dd")
query = f"""SELECT * FROM loans WHERE loan_date >= '{day}';"""
+ log.debug(query)
colnames = ["UserId", "Title", "Action", "Datum"]
+ if config.report.show_signature:
+ # insert the signature column at the second position
+ colnames.insert(2, "Signature")
+ log.debug("adding signature")
table = PrettyTable(colnames)
table.align[colnames[0]] = "l"
table.align[colnames[1]] = "l"
@@ -37,6 +43,7 @@ class ReportThread(QThread):
cursor.execute(query)
loans = cursor.fetchall()
self.report_nums_signal.emit(len(loans))
+ log.debug(f"Found {len(loans)} loans")
counter = 0
for loan in loans:
counter += 1
@@ -45,14 +52,15 @@ class ReportThread(QThread):
loan_action_date = stringToDate(
loan[3] if loan[5] == 0 else loan[6]
).toString("dd.MM.yyyy")
- table.add_row(
- [
- loan[1],
- db.getMedia(loan[2]).title,
- loan_action,
- loan_action_date,
- ]
- )
+ row = [
+ loan[1],
+ db.getMedia(loan[2]).title,
+ loan_action,
+ loan_action_date,
+ ]
+ if config.report.show_signature:
+ row.insert(2, db.getMedia(loan[2]).signature)
+ table.add_row(row)
if self.format == "tsv":
table = table.get_csv_string()
tsv_table = table.replace(",", "\t")