enable the addition of the signature in the report in the UI, update docs

This commit is contained in:
2025-01-29 11:09:34 +01:00
parent 21e09d1dc0
commit b5015b11d9
7 changed files with 131 additions and 96 deletions

View File

@@ -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:

Binary file not shown.

Before

Width:  |  Height:  |  Size: 9.1 KiB

After

Width:  |  Height:  |  Size: 9.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 9.7 KiB

After

Width:  |  Height:  |  Size: 11 KiB

View File

@@ -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:")

View File

@@ -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"))

View File

@@ -32,10 +32,13 @@
</item>
<item>
<layout class="QGridLayout" name="gridLayout">
<item row="0" column="0">
<widget class="QLabel" name="label_2">
<item row="4" column="2">
<widget class="QRadioButton" name="radioButton">
<property name="text">
<string>Tage</string>
<string/>
</property>
<property name="checkable">
<bool>true</bool>
</property>
</widget>
</item>
@@ -64,6 +67,13 @@
</item>
</layout>
</item>
<item row="2" column="0">
<widget class="QLabel" name="label_3">
<property name="text">
<string>Dateiformat</string>
</property>
</widget>
</item>
<item row="0" column="2">
<widget class="QLineEdit" name="dayValue">
<property name="sizePolicy">
@@ -92,23 +102,42 @@
</property>
</widget>
</item>
<item row="3" column="2">
<widget class="QRadioButton" name="radioButton">
<property name="text">
<string/>
</property>
<property name="checkable">
<bool>true</bool>
</property>
</widget>
</item>
<item row="3" column="1">
<item row="4" column="1">
<widget class="QLabel" name="reportlink">
<property name="text">
<string/>
</property>
</widget>
</item>
<item row="2" column="1">
<widget class="QFrame" name="frame">
<property name="frameShape">
<enum>QFrame::NoFrame</enum>
</property>
<property name="frameShadow">
<enum>QFrame::Plain</enum>
</property>
<property name="lineWidth">
<number>0</number>
</property>
<layout class="QGridLayout" name="gridLayout_2">
<item row="0" column="1">
<widget class="QRadioButton" name="format_csv">
<property name="text">
<string>Excel</string>
</property>
</widget>
</item>
<item row="0" column="0">
<widget class="QRadioButton" name="format_txt">
<property name="text">
<string>Text</string>
</property>
</widget>
</item>
</layout>
</widget>
</item>
<item row="0" column="1">
<widget class="QSlider" name="dayslider">
<property name="focusPolicy">
@@ -134,39 +163,17 @@
</property>
</widget>
</item>
<item row="2" column="1">
<widget class="QFrame" name="frame">
<property name="frameShape">
<enum>QFrame::NoFrame</enum>
<item row="0" column="0">
<widget class="QLabel" name="label_2">
<property name="text">
<string>Tage</string>
</property>
<property name="frameShadow">
<enum>QFrame::Plain</enum>
</property>
<property name="lineWidth">
<number>0</number>
</property>
<layout class="QGridLayout" name="gridLayout_2">
<item row="0" column="0">
<widget class="QRadioButton" name="format_txt">
<property name="text">
<string>Text</string>
</property>
</widget>
</item>
<item row="0" column="1">
<widget class="QRadioButton" name="format_csv">
<property name="text">
<string>Excel</string>
</property>
</widget>
</item>
</layout>
</widget>
</item>
<item row="2" column="0">
<widget class="QLabel" name="label_3">
<item row="3" column="1">
<widget class="QCheckBox" name="signature">
<property name="text">
<string>Dateiformat</string>
<string>Signatur anzeigen</string>
</property>
</widget>
</item>

View File

@@ -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")