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