remove statistics code

This commit is contained in:
WorldTeacher
2024-06-12 09:52:24 +02:00
parent f8e8e1fa18
commit 88fae1a5ec

View File

@@ -13,7 +13,7 @@ from icecream import ic
from natsort import natsorted from natsort import natsorted
from omegaconf import OmegaConf from omegaconf import OmegaConf
from PyQt6 import QtCore, QtGui, QtWidgets from PyQt6 import QtCore, QtGui, QtWidgets
from PyQt6.QtCore import QThread from PyQt6.QtCore import QThread, QDate
from PyQt6.QtGui import QRegularExpressionValidator from PyQt6.QtGui import QRegularExpressionValidator
from src.backend import ( from src.backend import (
@@ -43,7 +43,6 @@ from src.ui import (
DataGraph, DataGraph,
FilePicker, FilePicker,
Mail_Dialog, Mail_Dialog,
StatusWidget,
Ui_Semesterapparat, Ui_Semesterapparat,
edit_bookdata_ui, edit_bookdata_ui,
login_ui, login_ui,
@@ -56,7 +55,8 @@ from src.ui import (
CalendarEntry, CalendarEntry,
MessageCalendar, MessageCalendar,
) )
from src.utils import Icon from src import Icon
from src.ui.widgets.searchPage import SearchStatisticPage
config = OmegaConf.load("config.yaml") config = OmegaConf.load("config.yaml")
@@ -168,9 +168,7 @@ class Ui(Ui_Semesterapparat):
# connect contextmenuevent to tablewidget # connect contextmenuevent to tablewidget
# enable automatic resizing of columns for book_search_result # 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.tableWidget_apparate.doubleClicked.connect(self.load_app_data)
self.load_app.hide() self.load_app.hide()
print(f"user:{self.active_user}") print(f"user:{self.active_user}")
@@ -213,18 +211,9 @@ class Ui(Ui_Semesterapparat):
self.chkbx_show_del_media.hide() self.chkbx_show_del_media.hide()
self.groupBox_2.hide() self.groupBox_2.hide()
self.groupBox.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.tabWidget.currentChanged.connect(self.tabW1_changed)
self.tableWidget.resizeColumnsToContents()
self.tableWidget.resizeRowsToContents()
# create a thread, that continually checks the validity of the inputs # create a thread, that continually checks the validity of the inputs
self.validate_thread = QThread() self.validate_thread = QThread()
@@ -237,8 +226,6 @@ class Ui(Ui_Semesterapparat):
self.old_apparats = self.apparats # create a clone to compare against later self.old_apparats = self.apparats # create a clone to compare against later
# if length of apparats changes, update box_apparats # if length of apparats changes, update box_apparats
# if tab is changed, gather data needed # if tab is changed, gather data needed
self.tabWidget.currentChanged.connect(self.tab_changed)
self.btn_search.clicked.connect(self.statistics)
### Admin interface ### ### Admin interface ###
self.select_action_box.addItem("") 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_select_member.currentTextChanged.connect(
self.edit_faculty_member_set_data self.edit_faculty_member_set_data
) )
self.book_search.clicked.connect(self.search_book)
# Context Menus # Context Menus
self.tableWidget_apparate.setContextMenuPolicy( self.tableWidget_apparate.setContextMenuPolicy(
@@ -263,12 +249,7 @@ class Ui(Ui_Semesterapparat):
self.tableWidget_apparat_media.customContextMenuRequested.connect( self.tableWidget_apparat_media.customContextMenuRequested.connect(
self.media_context_menu 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 # elsa buttons
self.elsa_add_new.clicked.connect(self.add_new_elsa) self.elsa_add_new.clicked.connect(self.add_new_elsa)
self.elsa_cancel_create.clicked.connect(self.cancel_elsa_creation) self.elsa_cancel_create.clicked.connect(self.cancel_elsa_creation)
@@ -300,7 +281,7 @@ class Ui(Ui_Semesterapparat):
def quit(self): def quit(self):
# delete all temporary files # delete all temporary files
delete_temp_contents() tempdelete()
sys.exit() sys.exit()
def add_new_elsa(self): def add_new_elsa(self):
@@ -499,53 +480,6 @@ class Ui(Ui_Semesterapparat):
else: else:
os.system(f"{filename}") 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): def get_apparats(self):
alist = self.db.getAllAparats(deleted=0) alist = self.db.getAllAparats(deleted=0)
alist = natsorted(alist, key=lambda x: x[4], reverse=True) alist = natsorted(alist, key=lambda x: x[4], reverse=True)
@@ -566,11 +500,13 @@ class Ui(Ui_Semesterapparat):
# documentation.show() # documentation.show()
def tabW1_changed(self): def tabW1_changed(self):
if self.tabWidget.currentIndex() == 1: # Statistic if self.tabWidget.currentIndex() == 1: # Statistics
# self.tabWidget.setCurrentIndex(1)
self.tabWidget_2.setCurrentIndex(1) self.statistics = SearchStatisticPage()
self.tabWidget_2.setCurrentIndex(0) layout = QtWidgets.QVBoxLayout(self.search_statistics)
self.populate_tab() layout.addWidget(self.statistics)
print("searchpage")
if self.tabWidget.currentIndex() == 0: # Apparate if self.tabWidget.currentIndex() == 0: # Apparate
# clear all entries from the table # clear all entries from the table
self.tableWidget_apparate.setRowCount(0) self.tableWidget_apparate.setRowCount(0)
@@ -617,35 +553,6 @@ class Ui(Ui_Semesterapparat):
) )
self.elsa_statistics.addTab(graph, "Graph") 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): def edit_faculty_member_set_data(self):
# get the selected member # get the selected member
name = self.edit_faculty_member_select_member.currentText() 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.addItem("")
self.edit_faculty_member_select_member.setCurrentText("") 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): def generateSemester(self, today=False):
"""Generates the current semester. """Generates the current semester.
@@ -883,36 +783,6 @@ class Ui(Ui_Semesterapparat):
else: else:
return f"WiSe {currentYear}/{currentYear+1}" 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): def open_apparat(self, header: str, apparat: str, parent_depth: int):
print(header) print(header)
if header == "deleted" and parent_depth == 2: if header == "deleted" and parent_depth == 2:
@@ -957,203 +827,12 @@ class Ui(Ui_Semesterapparat):
self.tabWidget.setCurrentIndex(0) self.tabWidget.setCurrentIndex(0)
return 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): def populate_dropdown(self, box, data):
box.clear() box.clear()
box.addItem("") box.addItem("")
box.setCurrentText("") box.setCurrentText("")
box.addItems(data) 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): def populate_frame(self, appdata: ApparatData):
# populate the frame with the data from the database # populate the frame with the data from the database
# ic(appdata) # ic(appdata)
@@ -1311,11 +990,15 @@ class Ui(Ui_Semesterapparat):
def validate_app_fach(self): def validate_app_fach(self):
if self.app_group_box.isEnabled(): if self.app_group_box.isEnabled():
if self.app_fach.currentText() != "": 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.fach_mand.setText("")
self.change_state(4, 1) self.change_state(4, 1)
else: 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.fach_mand.setText("*")
self.change_state(4, 0) self.change_state(4, 0)
@@ -2107,23 +1790,6 @@ class Ui(Ui_Semesterapparat):
remind_action.triggered.connect(self.reminder) remind_action.triggered.connect(self.reminder)
menu.exec(self.tableWidget_apparate.mapToGlobal(position)) 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): def reminder(self):
self.logger.log_info("Opening reminder dialog") self.logger.log_info("Opening reminder dialog")
dialog = QtWidgets.QDialog() dialog = QtWidgets.QDialog()