add statistics widget & code

This commit is contained in:
WorldTeacher
2024-06-12 09:51:56 +02:00
parent 74656535f6
commit f8e8e1fa18
3 changed files with 1254 additions and 0 deletions

View File

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

View File

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

View File

@@ -0,0 +1,560 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>Dialog</class>
<widget class="QDialog" name="Dialog">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>1244</width>
<height>756</height>
</rect>
</property>
<property name="windowTitle">
<string>Dialog</string>
</property>
<layout class="QVBoxLayout" name="verticalLayout">
<item>
<widget class="QTabWidget" name="tabWidget_2">
<property name="maximumSize">
<size>
<width>16777215</width>
<height>250</height>
</size>
</property>
<property name="focusPolicy">
<enum>Qt::ClickFocus</enum>
</property>
<property name="tabPosition">
<enum>QTabWidget::North</enum>
</property>
<property name="tabShape">
<enum>QTabWidget::Rounded</enum>
</property>
<property name="currentIndex">
<number>0</number>
</property>
<widget class="QWidget" name="tab_3">
<attribute name="title">
<string>Statistik</string>
</attribute>
<layout class="QHBoxLayout" name="horizontalLayout_2" stretch="1,1">
<item>
<layout class="QGridLayout" name="gridLayout_3" rowstretch="0,0,0,0,0,0" columnstretch="1,1,1,1" columnminimumwidth="40,0,0,0">
<item row="0" column="3">
<widget class="QComboBox" name="box_semester">
<property name="editable">
<bool>true</bool>
</property>
</widget>
</item>
<item row="2" column="2">
<widget class="QLabel" name="label_18">
<property name="text">
<string>Dauerapp:</string>
</property>
<property name="buddy">
<cstring>box_dauerapp</cstring>
</property>
</widget>
</item>
<item row="2" column="1">
<widget class="QComboBox" name="box_fach">
<property name="editable">
<bool>true</bool>
</property>
</widget>
</item>
<item row="3" column="0">
<widget class="QLabel" name="label_15">
<property name="text">
<string>Löschbar</string>
</property>
<property name="buddy">
<cstring>check_deletable</cstring>
</property>
</widget>
</item>
<item row="1" column="0">
<widget class="QLabel" name="label_11">
<property name="text">
<string>Person:</string>
</property>
<property name="buddy">
<cstring>box_person</cstring>
</property>
</widget>
</item>
<item row="4" column="0">
<spacer name="verticalSpacer_3">
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>20</width>
<height>40</height>
</size>
</property>
</spacer>
</item>
<item row="0" column="0">
<widget class="QLabel" name="label_7">
<property name="text">
<string>Appnr.:</string>
</property>
<property name="buddy">
<cstring>box_appnrs</cstring>
</property>
</widget>
</item>
<item row="0" column="2">
<widget class="QLabel" name="label_17">
<property name="text">
<string>Endsemester:</string>
</property>
<property name="buddy">
<cstring>box_semester</cstring>
</property>
</widget>
</item>
<item row="0" column="1">
<widget class="QComboBox" name="box_appnrs">
<property name="editable">
<bool>true</bool>
</property>
</widget>
</item>
<item row="2" column="3">
<widget class="QComboBox" name="box_dauerapp"/>
</item>
<item row="1" column="1">
<widget class="QComboBox" name="box_person">
<property name="editable">
<bool>true</bool>
</property>
</widget>
</item>
<item row="1" column="3">
<widget class="QComboBox" name="box_erstellsemester">
<property name="editable">
<bool>true</bool>
</property>
</widget>
</item>
<item row="1" column="2">
<widget class="QLabel" name="label_19">
<property name="text">
<string>Erstellsemester:</string>
</property>
<property name="buddy">
<cstring>box_erstellsemester</cstring>
</property>
</widget>
</item>
<item row="2" column="0">
<widget class="QLabel" name="label_16">
<property name="text">
<string>Fach:</string>
</property>
<property name="buddy">
<cstring>box_fach</cstring>
</property>
</widget>
</item>
<item row="3" column="1">
<widget class="QCheckBox" name="check_deletable">
<property name="focusPolicy">
<enum>Qt::StrongFocus</enum>
</property>
<property name="text">
<string/>
</property>
</widget>
</item>
<item row="5" column="0">
<widget class="QPushButton" name="btn_search">
<property name="text">
<string>Suchen</string>
</property>
</widget>
</item>
<item row="5" column="1">
<widget class="QLabel" name="db_err_message">
<property name="text">
<string/>
</property>
</widget>
</item>
</layout>
</item>
<item>
<spacer name="horizontalSpacer">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
</layout>
</widget>
<widget class="QWidget" name="tab_4">
<attribute name="title">
<string>Suchen</string>
</attribute>
<widget class="QWidget" name="formLayoutWidget">
<property name="geometry">
<rect>
<x>10</x>
<y>10</y>
<width>451</width>
<height>121</height>
</rect>
</property>
<layout class="QFormLayout" name="formLayout_6">
<item row="0" column="0">
<widget class="QLabel" name="label_25">
<property name="text">
<string>Signatur</string>
</property>
<property name="buddy">
<cstring>seach_by_signature</cstring>
</property>
</widget>
</item>
<item row="0" column="1">
<widget class="QLineEdit" name="seach_by_signature">
<property name="clearButtonEnabled">
<bool>true</bool>
</property>
</widget>
</item>
<item row="1" column="0">
<widget class="QLabel" name="label_26">
<property name="text">
<string>Titel</string>
</property>
<property name="buddy">
<cstring>search_by_title</cstring>
</property>
</widget>
</item>
<item row="1" column="1">
<widget class="QLineEdit" name="search_by_title">
<property name="clearButtonEnabled">
<bool>true</bool>
</property>
</widget>
</item>
<item row="2" column="0">
<spacer name="verticalSpacer_4">
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>20</width>
<height>40</height>
</size>
</property>
</spacer>
</item>
</layout>
</widget>
<widget class="QPushButton" name="book_search">
<property name="geometry">
<rect>
<x>10</x>
<y>180</y>
<width>75</width>
<height>23</height>
</rect>
</property>
<property name="text">
<string>Suchen</string>
</property>
</widget>
</widget>
</widget>
</item>
<item>
<layout class="QVBoxLayout" name="verticalLayout_3">
<property name="sizeConstraint">
<enum>QLayout::SetDefaultConstraint</enum>
</property>
<item>
<widget class="QStackedWidget" name="stackedWidget_4">
<property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="Expanding">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="frameShape">
<enum>QFrame::StyledPanel</enum>
</property>
<property name="frameShadow">
<enum>QFrame::Raised</enum>
</property>
<property name="currentIndex">
<number>0</number>
</property>
<widget class="QWidget" name="apparatResult">
<layout class="QHBoxLayout" name="horizontalLayout">
<item>
<layout class="QVBoxLayout" name="verticalLayout_4">
<item>
<layout class="QHBoxLayout" name="horizontalLayout_7">
<item>
<layout class="QVBoxLayout" name="verticalLayout_5"/>
</item>
<item>
<widget class="QPushButton" name="btn_del_select_apparats">
<property name="focusPolicy">
<enum>Qt::StrongFocus</enum>
</property>
<property name="text">
<string>Ausgewählte Löschen</string>
</property>
</widget>
</item>
<item>
<widget class="QPushButton" name="btn_notify_for_deletion">
<property name="statusTip">
<string>Zeigt für jeden ausgewählten Apparat eine eMail-Vorlage an</string>
</property>
<property name="text">
<string>Ausgewählte Benachrichtigen</string>
</property>
</widget>
</item>
<item>
<spacer name="horizontalSpacer_5">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
</layout>
</item>
<item>
<widget class="QTableWidget" name="tableWidget">
<property name="focusPolicy">
<enum>Qt::NoFocus</enum>
</property>
<property name="contextMenuPolicy">
<enum>Qt::CustomContextMenu</enum>
</property>
<property name="editTriggers">
<set>QAbstractItemView::NoEditTriggers</set>
</property>
<property name="sortingEnabled">
<bool>true</bool>
</property>
<attribute name="horizontalHeaderStretchLastSection">
<bool>true</bool>
</attribute>
<column>
<property name="text">
<string/>
</property>
</column>
<column>
<property name="text">
<string>Apparatsname</string>
</property>
</column>
<column>
<property name="text">
<string>Apparatsnummer</string>
</property>
</column>
<column>
<property name="text">
<string>Person</string>
</property>
</column>
<column>
<property name="text">
<string>Fach</string>
</property>
</column>
</widget>
</item>
</layout>
</item>
<item>
<widget class="QTabWidget" name="tabWidget_3">
<property name="currentIndex">
<number>0</number>
</property>
<widget class="QWidget" name="statistic_table">
<attribute name="title">
<string>Tabelle</string>
</attribute>
<layout class="QVBoxLayout" name="verticalLayout_6">
<item>
<widget class="QTableWidget" name="statistics_table">
<property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="Expanding">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="maximumSize">
<size>
<width>16777215</width>
<height>16777215</height>
</size>
</property>
<property name="focusPolicy">
<enum>Qt::NoFocus</enum>
</property>
<property name="horizontalScrollBarPolicy">
<enum>Qt::ScrollBarAlwaysOff</enum>
</property>
<property name="editTriggers">
<set>QAbstractItemView::NoEditTriggers</set>
</property>
<property name="alternatingRowColors">
<bool>true</bool>
</property>
<attribute name="horizontalHeaderCascadingSectionResizes">
<bool>true</bool>
</attribute>
<attribute name="horizontalHeaderMinimumSectionSize">
<number>40</number>
</attribute>
<attribute name="horizontalHeaderDefaultSectionSize">
<number>59</number>
</attribute>
<attribute name="horizontalHeaderShowSortIndicator" stdset="0">
<bool>true</bool>
</attribute>
<attribute name="horizontalHeaderStretchLastSection">
<bool>true</bool>
</attribute>
<attribute name="verticalHeaderStretchLastSection">
<bool>true</bool>
</attribute>
<column>
<property name="text">
<string>Semester</string>
</property>
</column>
<column>
<property name="text">
<string>Zugang</string>
</property>
</column>
<column>
<property name="text">
<string>Abgang</string>
</property>
</column>
</widget>
</item>
<item>
<layout class="QHBoxLayout" name="dataLayout"/>
</item>
</layout>
</widget>
<widget class="QWidget" name="graph_table">
<attribute name="title">
<string>Erstellte und gelöschte Semesterapparate</string>
</attribute>
</widget>
</widget>
</item>
</layout>
</widget>
<widget class="QWidget" name="bookresult">
<property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="Expanding">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<layout class="QVBoxLayout" name="verticalLayout_2">
<item>
<widget class="QTableWidget" name="book_search_result">
<property name="frameShadow">
<enum>QFrame::Plain</enum>
</property>
<property name="editTriggers">
<set>QAbstractItemView::NoEditTriggers</set>
</property>
<property name="alternatingRowColors">
<bool>true</bool>
</property>
<property name="rowCount">
<number>0</number>
</property>
<attribute name="horizontalHeaderCascadingSectionResizes">
<bool>true</bool>
</attribute>
<attribute name="horizontalHeaderMinimumSectionSize">
<number>100</number>
</attribute>
<attribute name="horizontalHeaderDefaultSectionSize">
<number>200</number>
</attribute>
<attribute name="horizontalHeaderStretchLastSection">
<bool>true</bool>
</attribute>
<column>
<property name="text">
<string>Titel</string>
</property>
</column>
<column>
<property name="text">
<string>Signatur</string>
</property>
</column>
<column>
<property name="text">
<string>Apparat</string>
</property>
</column>
</widget>
</item>
</layout>
</widget>
</widget>
</item>
</layout>
</item>
</layout>
</widget>
<tabstops>
<tabstop>box_appnrs</tabstop>
<tabstop>box_person</tabstop>
<tabstop>box_fach</tabstop>
<tabstop>check_deletable</tabstop>
<tabstop>box_semester</tabstop>
<tabstop>box_erstellsemester</tabstop>
<tabstop>box_dauerapp</tabstop>
<tabstop>btn_search</tabstop>
<tabstop>btn_del_select_apparats</tabstop>
<tabstop>btn_notify_for_deletion</tabstop>
<tabstop>tabWidget_3</tabstop>
<tabstop>book_search_result</tabstop>
<tabstop>seach_by_signature</tabstop>
<tabstop>search_by_title</tabstop>
<tabstop>book_search</tabstop>
</tabstops>
<resources/>
<connections/>
</ui>