enable the addition of the signature in the report in the UI, update docs
This commit is contained in:
@@ -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 |
@@ -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:")
|
||||
|
||||
@@ -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"))
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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")
|
||||
|
||||
Reference in New Issue
Block a user