diff --git a/src/ui/widgets/searchPage.py b/src/ui/widgets/searchPage.py new file mode 100644 index 0000000..b6d3915 --- /dev/null +++ b/src/ui/widgets/searchPage.py @@ -0,0 +1,370 @@ +from .widget_sources.Ui_search_statistic_page import Ui_Dialog +from PyQt6 import QtWidgets, QtGui +from PyQt6.QtCore import pyqtSignal +from src.backend import Database, generateSemesterByDate +from src.logic import custom_sort +from src import MyLogger +from src import Icon +from src.ui import DataGraph, Mail_Dialog, StatusWidget +from natsort import natsorted +from icecream import ic + + +class MyComboBox(QtWidgets.QComboBox): + + def __init__(self, parent=None): + super().__init__(parent) + + +class SearchStatisticPage(QtWidgets.QDialog, Ui_Dialog): + apparat_open = pyqtSignal(str) + reloadSignal = pyqtSignal() + + def __init__(self): + self.logger = MyLogger("search_statistic_page") + super().__init__() + self.setupUi(self) + self.book_search_result.horizontalHeader().setSectionResizeMode( + QtWidgets.QHeaderView.ResizeMode.Stretch + ) + self.check_deletable.stateChanged.connect(self.gridchange) + self.tableWidget.horizontalHeader().setSectionResizeMode( + QtWidgets.QHeaderView.ResizeMode.Stretch + ) + self.btn_del_select_apparats.clicked.connect(self.delete_selected_apparats) + self.statistics_table.doubleClicked.connect(self.display_detailed_data) + self.tabWidget_2.currentChanged.connect(self.tabW2_changed) + self.btn_search.clicked.connect(self.statistics) + self.book_search.clicked.connect(self.search_book) + self.tableWidget.customContextMenuRequested.connect( + self.statistics_table_context_menu + ) + # statistic side buttons + self.btn_notify_for_deletion.clicked.connect(self.notify_for_deletion) + self.btn_notify_for_deletion.setEnabled(False) + self.tableWidget.resizeColumnsToContents() + self.tableWidget.resizeRowsToContents() + self.db = Database() + self.populate_tab() + + def restore_apparat(self): + row = self.tableWidget.currentRow() + apparat = self.tableWidget.item(row, 1).text() + ic(apparat) + apparat_id = self.db.getApparatId(apparat) + # restore the apparat + self.db.restoreApparat(apparat_id) + # update the table + self.reloadSignal.emit() + + def statistics_table_context_menu(self, position): + menu = QtWidgets.QMenu() + restore_action = menu.addAction("Wiederherstellen") + menu.addAction(restore_action) + restore_action.triggered.connect(self.restore_apparat) + menu.exec(self.tableWidget.mapToGlobal(position)) + + def tabW2_changed(self): + + if self.tabWidget_2.currentIndex() == 0: + self.stackedWidget_4.setCurrentIndex(0) + else: + self.stackedWidget_4.setCurrentIndex(1) + + def search_book(self): + self.book_search_result.setRowCount(0) + signature = self.seach_by_signature.text() + title = self.search_by_title.text() + params = { + "signature": signature if signature != "" else None, + "title": title if title != "" else None, + } + params = {key: value for key, value in params.items() if value is not None} + # ic(params) + retdata = self.db.searchBook(params) + if retdata is None: + return + for book in retdata: + + self.book_search_result.insertRow(0) + self.book_search_result.setItem( + 0, 0, QtWidgets.QTableWidgetItem(book[0].title) + ) + self.book_search_result.setItem( + 0, 1, QtWidgets.QTableWidgetItem(book[0].signature) + ) + print(book[1]) + self.book_search_result.setItem( + 0, + 2, + QtWidgets.QTableWidgetItem(self.db.getApparatName(book[1], book[2])), + ) + + def notify_for_deletion(self): + # get all selected apparats + selected_apparats: list[dict] = [] + for i in range(self.tableWidget.rowCount()): + data = {} + if self.tableWidget.cellWidget(i, 0).isChecked(): + data["app_id"] = self.tableWidget.item(i, 2).text() + data["app_name"] = self.tableWidget.item(i, 1).text() + data["prof_name"] = self.tableWidget.item(i, 3).text() + + selected_apparats.append(data) + # delete all selected apparats + ic(selected_apparats) + dialogs = [] + for i in selected_apparats: + + app_id = i["app_id"] + app_name = i["app_name"] + prof_name = i["prof_name"] + prof_mail = self.db.getProfData(prof_name)[0] + self.mail_thread = Mail_Dialog( + app_id=app_id, + app_name=app_name, + prof_name=prof_name, + prof_mail=prof_mail, + app_subject="", + default_mail="Information bezüglich der Auflösung des Semesterapparates", + ) + dialogs.append(self.mail_thread) + for dialog in dialogs: + dialog.exec() + + self.btn_notify_for_deletion.setEnabled(False) + + def setStatisticTableSize(self): + # print(self.statistics_table.size(), self.statistics_table.rowCount()) + size = self.statistics_table.size() + h = size.height() + w = size.width() + rows = self.statistics_table.rowCount() + rowheight = round(h / rows) - 5 + header_width = round(w / 3) - 5 + for i in range(3): + self.statistics_table.setColumnWidth(i, header_width) + for i in range(rows): + self.statistics_table.setRowHeight(i, rowheight) + + def gridchange(self): + print("gridchange") + if self.check_deletable.isChecked(): + self.box_semester.setEnabled(False) + self.box_semester.clear() + self.box_appnrs.setEnabled(False) + self.box_appnrs.clear() + self.box_person.setEnabled(False) + self.box_person.clear() + self.box_fach.setEnabled(False) + self.box_fach.clear() + self.box_erstellsemester.setEnabled(False) + self.box_erstellsemester.clear() + self.box_dauerapp.setEnabled(False) + self.box_dauerapp.clear() + else: + self.box_semester.setEnabled(True) + self.box_appnrs.setEnabled(True) + self.box_person.setEnabled(True) + self.box_fach.setEnabled(True) + self.box_erstellsemester.setEnabled(True) + self.box_dauerapp.setEnabled(True) + + def populate_tab(self): + # add default values to the dropdowns + self.box_appnrs.clear() + self.box_appnrs.addItem("") + self.box_appnrs.setCurrentText("") + self.box_person.clear() + self.box_person.addItem("") + self.box_person.setCurrentText("") + self.box_fach.clear() + self.box_fach.addItem("") + self.box_fach.setCurrentText("") + self.box_erstellsemester.clear() + self.box_erstellsemester.addItem("") + self.box_erstellsemester.setCurrentText("") + self.box_semester.clear() + self.box_semester.addItem("") + self.box_semester.setCurrentText("") + self.box_dauerapp.clear() + self.box_dauerapp.addItems(["Ja", "Nein", ""]) + self.box_dauerapp.setCurrentText("") + # add custom vaules + appnrs = self.db.getUnavailableApparatNumbers() + apparats = natsorted(appnrs) + apparats = [str(apparat) for apparat in apparats] + self.box_appnrs.addItems(apparats) + persons = self.db.getProfs() + self.box_person.addItems([f"{person[3]}, {person[2]}" for person in persons]) + self.box_fach.addItems(subject[1] for subject in self.db.getSubjects()) + semester = self.db.getSemersters() + self.box_erstellsemester.addItems(semester) + self.statistics_table.setRowCount(0) + + # set data for table and graph in tab 2 tableWidget_3 + data = self.db.getApparatCountBySemester() + data = custom_sort(data) + # self.tabWidget_3.clear() + self.tabWidget_3.removeTab(1) + self.statistics_table.setRowCount(len(data)) + for i in range(len(data)): + self.statistics_table.setItem(i, 0, QtWidgets.QTableWidgetItem(data[i][0])) + self.statistics_table.setItem( + i, 1, QtWidgets.QTableWidgetItem(str(data[i][1])) + ) + self.statistics_table.setItem( + i, 2, QtWidgets.QTableWidgetItem(str(data[i][2])) + ) + self.statistics_table.resizeColumnsToContents() + self.statistics_table.resizeRowsToContents() + # self.setStatisticTableSize() + + # get height of the table + # create graph + + graph_data = { + "x": [i[0] for i in data], + "y": {"Erstellt": [i[1] for i in data], "Gelöscht": [i[2] for i in data]}, + } + graph = DataGraph(title="Erstellte und gelöschte Apparate", data=graph_data) + + # place the graph into tabWidget_3 + self.tabWidget_3.addTab(graph, "Graph") + self.tabWidget_3.setCurrentIndex(0) + + def delete_selected_apparats(self): + # get all selected apparats + selected_apparats = [] + selected_apparat_rows = [] + for i in range(self.tableWidget.rowCount()): + if self.tableWidget.cellWidget(i, 0).isChecked(): + selected_apparats.append(self.tableWidget.item(i, 2).text()) + selected_apparat_rows.append(i) + # delete all selected apparats + # print(selected_apparats) + for apparat in selected_apparats: + self.db.deleteApparat(apparat, generateSemesterByDate()) + for row in selected_apparat_rows: + # set the background of the row to red + for j in range(5): + self.tableWidget.item(row, j).setBackground(QtGui.QColor(235, 74, 71)) + # refresh the table + self.populate_tab() + self.btn_del_select_apparats.setEnabled(False) + + def statistics(self): + """Generate the statistics based on the selected filters.""" + self.db_err_message.setText("") + self.btn_del_select_apparats.setEnabled(True) + self.btn_notify_for_deletion.setEnabled(True) + params = { + "appnr": ( + self.box_appnrs.currentText() + if self.box_appnrs.currentText() != "" + else None + ), + "prof_id": ( + self.db.getProfId(self.box_person.currentText()) + if self.box_person.currentText() != "" + else None + ), + "fach": ( + self.box_fach.currentText() + if self.box_fach.currentText() != "" + else None + ), + "erstellsemester": ( + self.box_erstellsemester.currentText() + if self.box_erstellsemester.currentText() != "" + else None + ), + "dauer": ( + "1" + if self.box_dauerapp.currentText() == "Ja" + else "0" if self.box_dauerapp.currentText() == "Nein" else None + ), + "endsemester": ( + self.box_semester.currentText() + if self.box_semester.currentText() != "" + else None + ), + "deletable": "True" if self.check_deletable.isChecked() else None, + "deletesemester": generateSemesterByDate(), + } + params = { + key: value for key, value in params.items() if value is not None + } # remove empty lines to prevent errors + params = { + key: value for key, value in params.items() if value != "Alle" + } # remove empty lines to prevent errors + result = self.db.statistic_request(**params) + # add QTableWidgetItems to the table + self.tableWidget.setRowCount(len(result)) + if len(result) == 0: + self.db_err_message.setText("Keine Ergebnisse gefunden") + return + for i in range(len(result)): + # set the items 0 = clickable checkbox, 1 = appname, 2 = profname, 3 = fach + self.tableWidget.setItem(i, 0, QtWidgets.QTableWidgetItem("")) + self.tableWidget.setItem(i, 1, QtWidgets.QTableWidgetItem(result[i][1])) + self.tableWidget.setItem( + i, 2, QtWidgets.QTableWidgetItem(str(result[i][4])) + ) + self.tableWidget.setItem(i, 3, QtWidgets.QTableWidgetItem(result[i][2])) + self.tableWidget.setItem(i, 4, QtWidgets.QTableWidgetItem(result[i][3])) + # replace the 0 with a checkbox + checkbox = QtWidgets.QCheckBox() + checkbox.setChecked(False) + self.tableWidget.setCellWidget(i, 0, checkbox) + # if i[9] is 1, set the background of the row to red + if int(result[i][9]) == 1: + for j in range(5): + self.tableWidget.item(i, j).setBackground(QtGui.QColor(235, 74, 71)) + # disable the checkbox + self.tableWidget.cellWidget(i, 0).setEnabled(False) + # set the tooltip + self.tableWidget.cellWidget(i, 0).setToolTip( + "Dieser Semesterapparat kann nicht gelöscht werden, da er bereits gelöscht wurde" + ) + + def display_detailed_data(self): + selected_semester = self.statistics_table.item( + self.statistics_table.currentRow(), 0 + ).text() + # get all apparats from the selected semester + data = self.db.getApparatsBySemester(selected_semester) + # replace keys for german names + # split to two lists + created = {"Erstellt": data["created"]} + deleted = {"Gelöscht": data["deleted"]} + created_status = StatusWidget(created, selected_semester) + deleted_status = StatusWidget(deleted, selected_semester) + created_status.setSizePolicy( + QtWidgets.QSizePolicy.Policy.Expanding, + QtWidgets.QSizePolicy.Policy.Expanding, + ) + deleted_status.setSizePolicy( + QtWidgets.QSizePolicy.Policy.Expanding, + QtWidgets.QSizePolicy.Policy.Expanding, + ) + + # add them to the gridLayout_4 + if self.dataLayout.count() > 0: + self.dataLayout.itemAt(0).widget().deleteLater() + self.dataLayout.itemAt(1).widget().deleteLater() + self.dataLayout.addWidget(created_status) + self.dataLayout.addWidget(deleted_status) + + # self.setStatisticTableSize() + created_status.person_double_clicked.emit(self.apparat_open) + created_status.setToolTip("Doppelklick um den Semesterapparat zu öffnen") + deleted_status.setToolTip("Nur zur Übersicht") + # set deleted_status background to slightly gray + + +def show_ui(): + app = QtWidgets.QApplication([]) + window = SearchStatisticPage() + window.show() + app.exec() diff --git a/src/ui/widgets/widget_sources/Ui_search_statistic_page.py b/src/ui/widgets/widget_sources/Ui_search_statistic_page.py new file mode 100644 index 0000000..99aa360 --- /dev/null +++ b/src/ui/widgets/widget_sources/Ui_search_statistic_page.py @@ -0,0 +1,324 @@ +# Form implementation generated from reading ui file 'c:\Users\aky547\GitHub\SemesterapparatsManager\src\ui\widgets\widget_sources\search_statistic_page.ui' +# +# Created by: PyQt6 UI code generator 6.6.1 +# +# WARNING: Any manual changes made to this file will be lost when pyuic6 is +# run again. Do not edit this file unless you know what you are doing. + + +from PyQt6 import QtCore, QtGui, QtWidgets + + +class Ui_Dialog(object): + def setupUi(self, Dialog): + Dialog.setObjectName("Dialog") + Dialog.resize(1244, 756) + self.verticalLayout = QtWidgets.QVBoxLayout(Dialog) + self.verticalLayout.setObjectName("verticalLayout") + self.tabWidget_2 = QtWidgets.QTabWidget(parent=Dialog) + self.tabWidget_2.setMaximumSize(QtCore.QSize(16777215, 250)) + self.tabWidget_2.setFocusPolicy(QtCore.Qt.FocusPolicy.ClickFocus) + self.tabWidget_2.setTabPosition(QtWidgets.QTabWidget.TabPosition.North) + self.tabWidget_2.setTabShape(QtWidgets.QTabWidget.TabShape.Rounded) + self.tabWidget_2.setObjectName("tabWidget_2") + self.tab_3 = QtWidgets.QWidget() + self.tab_3.setObjectName("tab_3") + self.horizontalLayout_2 = QtWidgets.QHBoxLayout(self.tab_3) + self.horizontalLayout_2.setObjectName("horizontalLayout_2") + self.gridLayout_3 = QtWidgets.QGridLayout() + self.gridLayout_3.setObjectName("gridLayout_3") + self.box_semester = QtWidgets.QComboBox(parent=self.tab_3) + self.box_semester.setEditable(True) + self.box_semester.setObjectName("box_semester") + self.gridLayout_3.addWidget(self.box_semester, 0, 3, 1, 1) + self.label_18 = QtWidgets.QLabel(parent=self.tab_3) + self.label_18.setObjectName("label_18") + self.gridLayout_3.addWidget(self.label_18, 2, 2, 1, 1) + self.box_fach = QtWidgets.QComboBox(parent=self.tab_3) + self.box_fach.setEditable(True) + self.box_fach.setObjectName("box_fach") + self.gridLayout_3.addWidget(self.box_fach, 2, 1, 1, 1) + self.label_15 = QtWidgets.QLabel(parent=self.tab_3) + self.label_15.setObjectName("label_15") + self.gridLayout_3.addWidget(self.label_15, 3, 0, 1, 1) + self.label_11 = QtWidgets.QLabel(parent=self.tab_3) + self.label_11.setObjectName("label_11") + self.gridLayout_3.addWidget(self.label_11, 1, 0, 1, 1) + spacerItem = QtWidgets.QSpacerItem(20, 40, QtWidgets.QSizePolicy.Policy.Minimum, QtWidgets.QSizePolicy.Policy.Expanding) + self.gridLayout_3.addItem(spacerItem, 4, 0, 1, 1) + self.label_7 = QtWidgets.QLabel(parent=self.tab_3) + self.label_7.setObjectName("label_7") + self.gridLayout_3.addWidget(self.label_7, 0, 0, 1, 1) + self.label_17 = QtWidgets.QLabel(parent=self.tab_3) + self.label_17.setObjectName("label_17") + self.gridLayout_3.addWidget(self.label_17, 0, 2, 1, 1) + self.box_appnrs = QtWidgets.QComboBox(parent=self.tab_3) + self.box_appnrs.setEditable(True) + self.box_appnrs.setObjectName("box_appnrs") + self.gridLayout_3.addWidget(self.box_appnrs, 0, 1, 1, 1) + self.box_dauerapp = QtWidgets.QComboBox(parent=self.tab_3) + self.box_dauerapp.setObjectName("box_dauerapp") + self.gridLayout_3.addWidget(self.box_dauerapp, 2, 3, 1, 1) + self.box_person = QtWidgets.QComboBox(parent=self.tab_3) + self.box_person.setEditable(True) + self.box_person.setObjectName("box_person") + self.gridLayout_3.addWidget(self.box_person, 1, 1, 1, 1) + self.box_erstellsemester = QtWidgets.QComboBox(parent=self.tab_3) + self.box_erstellsemester.setEditable(True) + self.box_erstellsemester.setObjectName("box_erstellsemester") + self.gridLayout_3.addWidget(self.box_erstellsemester, 1, 3, 1, 1) + self.label_19 = QtWidgets.QLabel(parent=self.tab_3) + self.label_19.setObjectName("label_19") + self.gridLayout_3.addWidget(self.label_19, 1, 2, 1, 1) + self.label_16 = QtWidgets.QLabel(parent=self.tab_3) + self.label_16.setObjectName("label_16") + self.gridLayout_3.addWidget(self.label_16, 2, 0, 1, 1) + self.check_deletable = QtWidgets.QCheckBox(parent=self.tab_3) + self.check_deletable.setFocusPolicy(QtCore.Qt.FocusPolicy.StrongFocus) + self.check_deletable.setText("") + self.check_deletable.setObjectName("check_deletable") + self.gridLayout_3.addWidget(self.check_deletable, 3, 1, 1, 1) + self.btn_search = QtWidgets.QPushButton(parent=self.tab_3) + self.btn_search.setObjectName("btn_search") + self.gridLayout_3.addWidget(self.btn_search, 5, 0, 1, 1) + self.db_err_message = QtWidgets.QLabel(parent=self.tab_3) + self.db_err_message.setText("") + self.db_err_message.setObjectName("db_err_message") + self.gridLayout_3.addWidget(self.db_err_message, 5, 1, 1, 1) + self.gridLayout_3.setColumnMinimumWidth(0, 40) + self.gridLayout_3.setColumnStretch(0, 1) + self.gridLayout_3.setColumnStretch(1, 1) + self.gridLayout_3.setColumnStretch(2, 1) + self.gridLayout_3.setColumnStretch(3, 1) + self.horizontalLayout_2.addLayout(self.gridLayout_3) + spacerItem1 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Policy.Expanding, QtWidgets.QSizePolicy.Policy.Minimum) + self.horizontalLayout_2.addItem(spacerItem1) + self.horizontalLayout_2.setStretch(0, 1) + self.horizontalLayout_2.setStretch(1, 1) + self.tabWidget_2.addTab(self.tab_3, "") + self.tab_4 = QtWidgets.QWidget() + self.tab_4.setObjectName("tab_4") + self.formLayoutWidget = QtWidgets.QWidget(parent=self.tab_4) + self.formLayoutWidget.setGeometry(QtCore.QRect(10, 10, 451, 121)) + self.formLayoutWidget.setObjectName("formLayoutWidget") + self.formLayout_6 = QtWidgets.QFormLayout(self.formLayoutWidget) + self.formLayout_6.setContentsMargins(0, 0, 0, 0) + self.formLayout_6.setObjectName("formLayout_6") + self.label_25 = QtWidgets.QLabel(parent=self.formLayoutWidget) + self.label_25.setObjectName("label_25") + self.formLayout_6.setWidget(0, QtWidgets.QFormLayout.ItemRole.LabelRole, self.label_25) + self.seach_by_signature = QtWidgets.QLineEdit(parent=self.formLayoutWidget) + self.seach_by_signature.setClearButtonEnabled(True) + self.seach_by_signature.setObjectName("seach_by_signature") + self.formLayout_6.setWidget(0, QtWidgets.QFormLayout.ItemRole.FieldRole, self.seach_by_signature) + self.label_26 = QtWidgets.QLabel(parent=self.formLayoutWidget) + self.label_26.setObjectName("label_26") + self.formLayout_6.setWidget(1, QtWidgets.QFormLayout.ItemRole.LabelRole, self.label_26) + self.search_by_title = QtWidgets.QLineEdit(parent=self.formLayoutWidget) + self.search_by_title.setClearButtonEnabled(True) + self.search_by_title.setObjectName("search_by_title") + self.formLayout_6.setWidget(1, QtWidgets.QFormLayout.ItemRole.FieldRole, self.search_by_title) + spacerItem2 = QtWidgets.QSpacerItem(20, 40, QtWidgets.QSizePolicy.Policy.Minimum, QtWidgets.QSizePolicy.Policy.Expanding) + self.formLayout_6.setItem(2, QtWidgets.QFormLayout.ItemRole.LabelRole, spacerItem2) + self.book_search = QtWidgets.QPushButton(parent=self.tab_4) + self.book_search.setGeometry(QtCore.QRect(10, 180, 75, 23)) + self.book_search.setObjectName("book_search") + self.tabWidget_2.addTab(self.tab_4, "") + self.verticalLayout.addWidget(self.tabWidget_2) + self.verticalLayout_3 = QtWidgets.QVBoxLayout() + self.verticalLayout_3.setSizeConstraint(QtWidgets.QLayout.SizeConstraint.SetDefaultConstraint) + self.verticalLayout_3.setObjectName("verticalLayout_3") + self.stackedWidget_4 = QtWidgets.QStackedWidget(parent=Dialog) + sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Policy.Expanding, QtWidgets.QSizePolicy.Policy.Expanding) + sizePolicy.setHorizontalStretch(0) + sizePolicy.setVerticalStretch(0) + sizePolicy.setHeightForWidth(self.stackedWidget_4.sizePolicy().hasHeightForWidth()) + self.stackedWidget_4.setSizePolicy(sizePolicy) + self.stackedWidget_4.setFrameShape(QtWidgets.QFrame.Shape.StyledPanel) + self.stackedWidget_4.setFrameShadow(QtWidgets.QFrame.Shadow.Raised) + self.stackedWidget_4.setObjectName("stackedWidget_4") + self.apparatResult = QtWidgets.QWidget() + self.apparatResult.setObjectName("apparatResult") + self.horizontalLayout = QtWidgets.QHBoxLayout(self.apparatResult) + self.horizontalLayout.setObjectName("horizontalLayout") + self.verticalLayout_4 = QtWidgets.QVBoxLayout() + self.verticalLayout_4.setObjectName("verticalLayout_4") + self.horizontalLayout_7 = QtWidgets.QHBoxLayout() + self.horizontalLayout_7.setObjectName("horizontalLayout_7") + self.verticalLayout_5 = QtWidgets.QVBoxLayout() + self.verticalLayout_5.setObjectName("verticalLayout_5") + self.horizontalLayout_7.addLayout(self.verticalLayout_5) + self.btn_del_select_apparats = QtWidgets.QPushButton(parent=self.apparatResult) + self.btn_del_select_apparats.setFocusPolicy(QtCore.Qt.FocusPolicy.StrongFocus) + self.btn_del_select_apparats.setObjectName("btn_del_select_apparats") + self.horizontalLayout_7.addWidget(self.btn_del_select_apparats) + self.btn_notify_for_deletion = QtWidgets.QPushButton(parent=self.apparatResult) + self.btn_notify_for_deletion.setObjectName("btn_notify_for_deletion") + self.horizontalLayout_7.addWidget(self.btn_notify_for_deletion) + spacerItem3 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Policy.Expanding, QtWidgets.QSizePolicy.Policy.Minimum) + self.horizontalLayout_7.addItem(spacerItem3) + self.verticalLayout_4.addLayout(self.horizontalLayout_7) + self.tableWidget = QtWidgets.QTableWidget(parent=self.apparatResult) + self.tableWidget.setFocusPolicy(QtCore.Qt.FocusPolicy.NoFocus) + self.tableWidget.setContextMenuPolicy(QtCore.Qt.ContextMenuPolicy.CustomContextMenu) + self.tableWidget.setEditTriggers(QtWidgets.QAbstractItemView.EditTrigger.NoEditTriggers) + self.tableWidget.setObjectName("tableWidget") + self.tableWidget.setColumnCount(5) + self.tableWidget.setRowCount(0) + item = QtWidgets.QTableWidgetItem() + self.tableWidget.setHorizontalHeaderItem(0, item) + item = QtWidgets.QTableWidgetItem() + self.tableWidget.setHorizontalHeaderItem(1, item) + item = QtWidgets.QTableWidgetItem() + self.tableWidget.setHorizontalHeaderItem(2, item) + item = QtWidgets.QTableWidgetItem() + self.tableWidget.setHorizontalHeaderItem(3, item) + item = QtWidgets.QTableWidgetItem() + self.tableWidget.setHorizontalHeaderItem(4, item) + self.tableWidget.horizontalHeader().setStretchLastSection(True) + self.verticalLayout_4.addWidget(self.tableWidget) + self.horizontalLayout.addLayout(self.verticalLayout_4) + self.tabWidget_3 = QtWidgets.QTabWidget(parent=self.apparatResult) + self.tabWidget_3.setObjectName("tabWidget_3") + self.statistic_table = QtWidgets.QWidget() + self.statistic_table.setObjectName("statistic_table") + self.verticalLayout_6 = QtWidgets.QVBoxLayout(self.statistic_table) + self.verticalLayout_6.setObjectName("verticalLayout_6") + self.statistics_table = QtWidgets.QTableWidget(parent=self.statistic_table) + sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Policy.Expanding, QtWidgets.QSizePolicy.Policy.Expanding) + sizePolicy.setHorizontalStretch(0) + sizePolicy.setVerticalStretch(0) + sizePolicy.setHeightForWidth(self.statistics_table.sizePolicy().hasHeightForWidth()) + self.statistics_table.setSizePolicy(sizePolicy) + self.statistics_table.setMaximumSize(QtCore.QSize(16777215, 16777215)) + self.statistics_table.setFocusPolicy(QtCore.Qt.FocusPolicy.NoFocus) + self.statistics_table.setHorizontalScrollBarPolicy(QtCore.Qt.ScrollBarPolicy.ScrollBarAlwaysOff) + self.statistics_table.setEditTriggers(QtWidgets.QAbstractItemView.EditTrigger.NoEditTriggers) + self.statistics_table.setAlternatingRowColors(True) + self.statistics_table.setObjectName("statistics_table") + self.statistics_table.setColumnCount(3) + self.statistics_table.setRowCount(0) + item = QtWidgets.QTableWidgetItem() + self.statistics_table.setHorizontalHeaderItem(0, item) + item = QtWidgets.QTableWidgetItem() + self.statistics_table.setHorizontalHeaderItem(1, item) + item = QtWidgets.QTableWidgetItem() + self.statistics_table.setHorizontalHeaderItem(2, item) + self.statistics_table.horizontalHeader().setCascadingSectionResizes(True) + self.statistics_table.horizontalHeader().setDefaultSectionSize(59) + self.statistics_table.horizontalHeader().setMinimumSectionSize(40) + self.statistics_table.horizontalHeader().setSortIndicatorShown(True) + self.statistics_table.horizontalHeader().setStretchLastSection(True) + self.statistics_table.verticalHeader().setStretchLastSection(True) + self.verticalLayout_6.addWidget(self.statistics_table) + self.dataLayout = QtWidgets.QHBoxLayout() + self.dataLayout.setObjectName("dataLayout") + self.verticalLayout_6.addLayout(self.dataLayout) + self.tabWidget_3.addTab(self.statistic_table, "") + self.graph_table = QtWidgets.QWidget() + self.graph_table.setObjectName("graph_table") + self.tabWidget_3.addTab(self.graph_table, "") + self.horizontalLayout.addWidget(self.tabWidget_3) + self.stackedWidget_4.addWidget(self.apparatResult) + self.bookresult = QtWidgets.QWidget() + sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Policy.Expanding, QtWidgets.QSizePolicy.Policy.Expanding) + sizePolicy.setHorizontalStretch(0) + sizePolicy.setVerticalStretch(0) + sizePolicy.setHeightForWidth(self.bookresult.sizePolicy().hasHeightForWidth()) + self.bookresult.setSizePolicy(sizePolicy) + self.bookresult.setObjectName("bookresult") + self.verticalLayout_2 = QtWidgets.QVBoxLayout(self.bookresult) + self.verticalLayout_2.setObjectName("verticalLayout_2") + self.book_search_result = QtWidgets.QTableWidget(parent=self.bookresult) + self.book_search_result.setFrameShadow(QtWidgets.QFrame.Shadow.Plain) + self.book_search_result.setEditTriggers(QtWidgets.QAbstractItemView.EditTrigger.NoEditTriggers) + self.book_search_result.setAlternatingRowColors(True) + self.book_search_result.setRowCount(0) + self.book_search_result.setObjectName("book_search_result") + self.book_search_result.setColumnCount(3) + item = QtWidgets.QTableWidgetItem() + self.book_search_result.setHorizontalHeaderItem(0, item) + item = QtWidgets.QTableWidgetItem() + self.book_search_result.setHorizontalHeaderItem(1, item) + item = QtWidgets.QTableWidgetItem() + self.book_search_result.setHorizontalHeaderItem(2, item) + self.book_search_result.horizontalHeader().setCascadingSectionResizes(True) + self.book_search_result.horizontalHeader().setDefaultSectionSize(200) + self.book_search_result.horizontalHeader().setMinimumSectionSize(100) + self.book_search_result.horizontalHeader().setStretchLastSection(True) + self.verticalLayout_2.addWidget(self.book_search_result) + self.stackedWidget_4.addWidget(self.bookresult) + self.verticalLayout_3.addWidget(self.stackedWidget_4) + self.verticalLayout.addLayout(self.verticalLayout_3) + self.label_18.setBuddy(self.box_dauerapp) + self.label_15.setBuddy(self.check_deletable) + self.label_11.setBuddy(self.box_person) + self.label_7.setBuddy(self.box_appnrs) + self.label_17.setBuddy(self.box_semester) + self.label_19.setBuddy(self.box_erstellsemester) + self.label_16.setBuddy(self.box_fach) + self.label_25.setBuddy(self.seach_by_signature) + self.label_26.setBuddy(self.search_by_title) + + self.retranslateUi(Dialog) + self.tabWidget_2.setCurrentIndex(0) + self.stackedWidget_4.setCurrentIndex(0) + self.tabWidget_3.setCurrentIndex(0) + QtCore.QMetaObject.connectSlotsByName(Dialog) + Dialog.setTabOrder(self.box_appnrs, self.box_person) + Dialog.setTabOrder(self.box_person, self.box_fach) + Dialog.setTabOrder(self.box_fach, self.check_deletable) + Dialog.setTabOrder(self.check_deletable, self.box_semester) + Dialog.setTabOrder(self.box_semester, self.box_erstellsemester) + Dialog.setTabOrder(self.box_erstellsemester, self.box_dauerapp) + Dialog.setTabOrder(self.box_dauerapp, self.btn_search) + Dialog.setTabOrder(self.btn_search, self.btn_del_select_apparats) + Dialog.setTabOrder(self.btn_del_select_apparats, self.btn_notify_for_deletion) + Dialog.setTabOrder(self.btn_notify_for_deletion, self.tabWidget_3) + Dialog.setTabOrder(self.tabWidget_3, self.book_search_result) + Dialog.setTabOrder(self.book_search_result, self.seach_by_signature) + Dialog.setTabOrder(self.seach_by_signature, self.search_by_title) + Dialog.setTabOrder(self.search_by_title, self.book_search) + + def retranslateUi(self, Dialog): + _translate = QtCore.QCoreApplication.translate + Dialog.setWindowTitle(_translate("Dialog", "Dialog")) + self.label_18.setText(_translate("Dialog", "Dauerapp:")) + self.label_15.setText(_translate("Dialog", "Löschbar")) + self.label_11.setText(_translate("Dialog", "Person:")) + self.label_7.setText(_translate("Dialog", "Appnr.:")) + self.label_17.setText(_translate("Dialog", "Endsemester:")) + self.label_19.setText(_translate("Dialog", "Erstellsemester:")) + self.label_16.setText(_translate("Dialog", "Fach:")) + self.btn_search.setText(_translate("Dialog", "Suchen")) + self.tabWidget_2.setTabText(self.tabWidget_2.indexOf(self.tab_3), _translate("Dialog", "Statistik")) + self.label_25.setText(_translate("Dialog", "Signatur")) + self.label_26.setText(_translate("Dialog", "Titel")) + self.book_search.setText(_translate("Dialog", "Suchen")) + self.tabWidget_2.setTabText(self.tabWidget_2.indexOf(self.tab_4), _translate("Dialog", "Suchen")) + self.btn_del_select_apparats.setText(_translate("Dialog", "Ausgewählte Löschen")) + self.btn_notify_for_deletion.setStatusTip(_translate("Dialog", "Zeigt für jeden ausgewählten Apparat eine eMail-Vorlage an")) + self.btn_notify_for_deletion.setText(_translate("Dialog", "Ausgewählte Benachrichtigen")) + self.tableWidget.setSortingEnabled(True) + item = self.tableWidget.horizontalHeaderItem(1) + item.setText(_translate("Dialog", "Apparatsname")) + item = self.tableWidget.horizontalHeaderItem(2) + item.setText(_translate("Dialog", "Apparatsnummer")) + item = self.tableWidget.horizontalHeaderItem(3) + item.setText(_translate("Dialog", "Person")) + item = self.tableWidget.horizontalHeaderItem(4) + item.setText(_translate("Dialog", "Fach")) + item = self.statistics_table.horizontalHeaderItem(0) + item.setText(_translate("Dialog", "Semester")) + item = self.statistics_table.horizontalHeaderItem(1) + item.setText(_translate("Dialog", "Zugang")) + item = self.statistics_table.horizontalHeaderItem(2) + item.setText(_translate("Dialog", "Abgang")) + self.tabWidget_3.setTabText(self.tabWidget_3.indexOf(self.statistic_table), _translate("Dialog", "Tabelle")) + self.tabWidget_3.setTabText(self.tabWidget_3.indexOf(self.graph_table), _translate("Dialog", "Erstellte und gelöschte Semesterapparate")) + item = self.book_search_result.horizontalHeaderItem(0) + item.setText(_translate("Dialog", "Titel")) + item = self.book_search_result.horizontalHeaderItem(1) + item.setText(_translate("Dialog", "Signatur")) + item = self.book_search_result.horizontalHeaderItem(2) + item.setText(_translate("Dialog", "Apparat")) diff --git a/src/ui/widgets/widget_sources/search_statistic_page.ui b/src/ui/widgets/widget_sources/search_statistic_page.ui new file mode 100644 index 0000000..0d160d2 --- /dev/null +++ b/src/ui/widgets/widget_sources/search_statistic_page.ui @@ -0,0 +1,560 @@ + + + Dialog + + + + 0 + 0 + 1244 + 756 + + + + Dialog + + + + + + + 16777215 + 250 + + + + Qt::ClickFocus + + + QTabWidget::North + + + QTabWidget::Rounded + + + 0 + + + + Statistik + + + + + + + + true + + + + + + + Dauerapp: + + + box_dauerapp + + + + + + + true + + + + + + + Löschbar + + + check_deletable + + + + + + + Person: + + + box_person + + + + + + + Qt::Vertical + + + + 20 + 40 + + + + + + + + Appnr.: + + + box_appnrs + + + + + + + Endsemester: + + + box_semester + + + + + + + true + + + + + + + + + + true + + + + + + + true + + + + + + + Erstellsemester: + + + box_erstellsemester + + + + + + + Fach: + + + box_fach + + + + + + + Qt::StrongFocus + + + + + + + + + + Suchen + + + + + + + + + + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + Suchen + + + + + 10 + 10 + 451 + 121 + + + + + + + Signatur + + + seach_by_signature + + + + + + + true + + + + + + + Titel + + + search_by_title + + + + + + + true + + + + + + + Qt::Vertical + + + + 20 + 40 + + + + + + + + + + 10 + 180 + 75 + 23 + + + + Suchen + + + + + + + + + QLayout::SetDefaultConstraint + + + + + + 0 + 0 + + + + QFrame::StyledPanel + + + QFrame::Raised + + + 0 + + + + + + + + + + + + + + Qt::StrongFocus + + + Ausgewählte Löschen + + + + + + + Zeigt für jeden ausgewählten Apparat eine eMail-Vorlage an + + + Ausgewählte Benachrichtigen + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + + Qt::NoFocus + + + Qt::CustomContextMenu + + + QAbstractItemView::NoEditTriggers + + + true + + + true + + + + + + + + + Apparatsname + + + + + Apparatsnummer + + + + + Person + + + + + Fach + + + + + + + + + + 0 + + + + Tabelle + + + + + + + 0 + 0 + + + + + 16777215 + 16777215 + + + + Qt::NoFocus + + + Qt::ScrollBarAlwaysOff + + + QAbstractItemView::NoEditTriggers + + + true + + + true + + + 40 + + + 59 + + + true + + + true + + + true + + + + Semester + + + + + Zugang + + + + + Abgang + + + + + + + + + + + + Erstellte und gelöschte Semesterapparate + + + + + + + + + + 0 + 0 + + + + + + + QFrame::Plain + + + QAbstractItemView::NoEditTriggers + + + true + + + 0 + + + true + + + 100 + + + 200 + + + true + + + + Titel + + + + + Signatur + + + + + Apparat + + + + + + + + + + + + + + box_appnrs + box_person + box_fach + check_deletable + box_semester + box_erstellsemester + box_dauerapp + btn_search + btn_del_select_apparats + btn_notify_for_deletion + tabWidget_3 + book_search_result + seach_by_signature + search_by_title + book_search + + + +