remove statistics code
This commit is contained in:
@@ -13,7 +13,7 @@ from icecream import ic
|
||||
from natsort import natsorted
|
||||
from omegaconf import OmegaConf
|
||||
from PyQt6 import QtCore, QtGui, QtWidgets
|
||||
from PyQt6.QtCore import QThread
|
||||
from PyQt6.QtCore import QThread, QDate
|
||||
from PyQt6.QtGui import QRegularExpressionValidator
|
||||
|
||||
from src.backend import (
|
||||
@@ -43,7 +43,6 @@ from src.ui import (
|
||||
DataGraph,
|
||||
FilePicker,
|
||||
Mail_Dialog,
|
||||
StatusWidget,
|
||||
Ui_Semesterapparat,
|
||||
edit_bookdata_ui,
|
||||
login_ui,
|
||||
@@ -56,7 +55,8 @@ from src.ui import (
|
||||
CalendarEntry,
|
||||
MessageCalendar,
|
||||
)
|
||||
from src.utils import Icon
|
||||
from src import Icon
|
||||
from src.ui.widgets.searchPage import SearchStatisticPage
|
||||
|
||||
config = OmegaConf.load("config.yaml")
|
||||
|
||||
@@ -168,9 +168,7 @@ class Ui(Ui_Semesterapparat):
|
||||
# connect contextmenuevent to tablewidget
|
||||
|
||||
# enable automatic resizing of columns for book_search_result
|
||||
self.book_search_result.horizontalHeader().setSectionResizeMode(
|
||||
QtWidgets.QHeaderView.ResizeMode.Stretch
|
||||
)
|
||||
|
||||
self.tableWidget_apparate.doubleClicked.connect(self.load_app_data)
|
||||
self.load_app.hide()
|
||||
print(f"user:{self.active_user}")
|
||||
@@ -213,18 +211,9 @@ class Ui(Ui_Semesterapparat):
|
||||
self.chkbx_show_del_media.hide()
|
||||
self.groupBox_2.hide()
|
||||
self.groupBox.hide()
|
||||
self.btn_del_select_apparats.setEnabled(False)
|
||||
# self.btn_del_select_apparats.setEnabled(False)
|
||||
|
||||
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.tabWidget.currentChanged.connect(self.tabW1_changed)
|
||||
self.tableWidget.resizeColumnsToContents()
|
||||
self.tableWidget.resizeRowsToContents()
|
||||
|
||||
# create a thread, that continually checks the validity of the inputs
|
||||
self.validate_thread = QThread()
|
||||
@@ -237,8 +226,6 @@ class Ui(Ui_Semesterapparat):
|
||||
self.old_apparats = self.apparats # create a clone to compare against later
|
||||
# if length of apparats changes, update box_apparats
|
||||
# if tab is changed, gather data needed
|
||||
self.tabWidget.currentChanged.connect(self.tab_changed)
|
||||
self.btn_search.clicked.connect(self.statistics)
|
||||
|
||||
### Admin interface ###
|
||||
self.select_action_box.addItem("")
|
||||
@@ -248,7 +235,6 @@ class Ui(Ui_Semesterapparat):
|
||||
self.edit_faculty_member_select_member.currentTextChanged.connect(
|
||||
self.edit_faculty_member_set_data
|
||||
)
|
||||
self.book_search.clicked.connect(self.search_book)
|
||||
|
||||
# Context Menus
|
||||
self.tableWidget_apparate.setContextMenuPolicy(
|
||||
@@ -263,12 +249,7 @@ class Ui(Ui_Semesterapparat):
|
||||
self.tableWidget_apparat_media.customContextMenuRequested.connect(
|
||||
self.media_context_menu
|
||||
)
|
||||
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)
|
||||
|
||||
# elsa buttons
|
||||
self.elsa_add_new.clicked.connect(self.add_new_elsa)
|
||||
self.elsa_cancel_create.clicked.connect(self.cancel_elsa_creation)
|
||||
@@ -300,7 +281,7 @@ class Ui(Ui_Semesterapparat):
|
||||
|
||||
def quit(self):
|
||||
# delete all temporary files
|
||||
delete_temp_contents()
|
||||
tempdelete()
|
||||
sys.exit()
|
||||
|
||||
def add_new_elsa(self):
|
||||
@@ -499,53 +480,6 @@ class Ui(Ui_Semesterapparat):
|
||||
else:
|
||||
os.system(f"{filename}")
|
||||
|
||||
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 get_apparats(self):
|
||||
alist = self.db.getAllAparats(deleted=0)
|
||||
alist = natsorted(alist, key=lambda x: x[4], reverse=True)
|
||||
@@ -566,11 +500,13 @@ class Ui(Ui_Semesterapparat):
|
||||
# documentation.show()
|
||||
|
||||
def tabW1_changed(self):
|
||||
if self.tabWidget.currentIndex() == 1: # Statistic
|
||||
# self.tabWidget.setCurrentIndex(1)
|
||||
self.tabWidget_2.setCurrentIndex(1)
|
||||
self.tabWidget_2.setCurrentIndex(0)
|
||||
self.populate_tab()
|
||||
if self.tabWidget.currentIndex() == 1: # Statistics
|
||||
|
||||
self.statistics = SearchStatisticPage()
|
||||
layout = QtWidgets.QVBoxLayout(self.search_statistics)
|
||||
layout.addWidget(self.statistics)
|
||||
|
||||
print("searchpage")
|
||||
if self.tabWidget.currentIndex() == 0: # Apparate
|
||||
# clear all entries from the table
|
||||
self.tableWidget_apparate.setRowCount(0)
|
||||
@@ -617,35 +553,6 @@ class Ui(Ui_Semesterapparat):
|
||||
)
|
||||
self.elsa_statistics.addTab(graph, "Graph")
|
||||
|
||||
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 edit_faculty_member_set_data(self):
|
||||
# get the selected member
|
||||
name = self.edit_faculty_member_select_member.currentText()
|
||||
@@ -851,13 +758,6 @@ class Ui(Ui_Semesterapparat):
|
||||
self.edit_faculty_member_select_member.addItem("")
|
||||
self.edit_faculty_member_select_member.setCurrentText("")
|
||||
|
||||
def tabW2_changed(self):
|
||||
|
||||
if self.tabWidget_2.currentIndex() == 0:
|
||||
self.stackedWidget_4.setCurrentIndex(0)
|
||||
else:
|
||||
self.stackedWidget_4.setCurrentIndex(1)
|
||||
|
||||
def generateSemester(self, today=False):
|
||||
"""Generates the current semester.
|
||||
|
||||
@@ -883,36 +783,6 @@ class Ui(Ui_Semesterapparat):
|
||||
else:
|
||||
return f"WiSe {currentYear}/{currentYear+1}"
|
||||
|
||||
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
|
||||
self.gridLayout_4.addWidget(created_status, 1, 0)
|
||||
self.gridLayout_4.addWidget(deleted_status, 1, 1)
|
||||
# self.setStatisticTableSize()
|
||||
created_status.person_double_clicked.connect(self.open_apparat)
|
||||
created_status.setToolTip("Doppelklick um den Semesterapparat zu öffnen")
|
||||
deleted_status.setToolTip("Nur zur Übersicht")
|
||||
# set deleted_status background to slightly gray
|
||||
|
||||
def open_apparat(self, header: str, apparat: str, parent_depth: int):
|
||||
print(header)
|
||||
if header == "deleted" and parent_depth == 2:
|
||||
@@ -957,203 +827,12 @@ class Ui(Ui_Semesterapparat):
|
||||
self.tabWidget.setCurrentIndex(0)
|
||||
return
|
||||
|
||||
def gridchange(self):
|
||||
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)
|
||||
self.tab_changed()
|
||||
|
||||
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 tab_changed(self):
|
||||
curr_tab = self.tabWidget.currentIndex()
|
||||
if curr_tab == 0: # create tab
|
||||
return
|
||||
elif curr_tab == 1: # statistics tab
|
||||
self.populate_tab()
|
||||
|
||||
def populate_dropdown(self, box, data):
|
||||
box.clear()
|
||||
box.addItem("")
|
||||
box.setCurrentText("")
|
||||
box.addItems(data)
|
||||
|
||||
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, self.generateSemester(today=True))
|
||||
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": self.generateSemester(today=True),
|
||||
}
|
||||
params = {
|
||||
key: value for key, value in params.items() if value is not None
|
||||
} # remove empty lines to prevent errors
|
||||
print(params)
|
||||
params = {
|
||||
key: value for key, value in params.items() if value != "Alle"
|
||||
} # remove empty lines to prevent errors
|
||||
print(params)
|
||||
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)):
|
||||
print(result[i])
|
||||
# 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 populate_frame(self, appdata: ApparatData):
|
||||
# populate the frame with the data from the database
|
||||
# ic(appdata)
|
||||
@@ -1311,11 +990,15 @@ class Ui(Ui_Semesterapparat):
|
||||
def validate_app_fach(self):
|
||||
if self.app_group_box.isEnabled():
|
||||
if self.app_fach.currentText() != "":
|
||||
self.app_fach.setStyleSheet("border: 1px solid green;")
|
||||
# change color to green to signal that the field is filled
|
||||
Icon("valid_true", self.valid_check_app_fach)
|
||||
self.valid_check_app_fach.setToolTip("Fach ist gesetzt")
|
||||
self.fach_mand.setText("")
|
||||
self.change_state(4, 1)
|
||||
else:
|
||||
self.app_fach.setStyleSheet("border: 1px solid red;")
|
||||
# self.app_fach.setStyleSheet("border: 1px solid red;")
|
||||
Icon("valid_false", self.valid_check)
|
||||
self.valid_check_app_fach.setToolTip("Fach ist nicht gesetzt")
|
||||
self.fach_mand.setText("*")
|
||||
self.change_state(4, 0)
|
||||
|
||||
@@ -2107,23 +1790,6 @@ class Ui(Ui_Semesterapparat):
|
||||
remind_action.triggered.connect(self.reminder)
|
||||
menu.exec(self.tableWidget_apparate.mapToGlobal(position))
|
||||
|
||||
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 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.reload()
|
||||
|
||||
def reminder(self):
|
||||
self.logger.log_info("Opening reminder dialog")
|
||||
dialog = QtWidgets.QDialog()
|
||||
|
||||
Reference in New Issue
Block a user