From 88fae1a5ec257bfdf0b6b59711dfdd9ad87531fe Mon Sep 17 00:00:00 2001 From: WorldTeacher <41587052+WorldTeacher@users.noreply.github.com> Date: Wed, 12 Jun 2024 09:52:24 +0200 Subject: [PATCH] remove statistics code --- src/ui/userInterface.py | 374 +++------------------------------------- 1 file changed, 20 insertions(+), 354 deletions(-) diff --git a/src/ui/userInterface.py b/src/ui/userInterface.py index f5965c4..8cc228a 100644 --- a/src/ui/userInterface.py +++ b/src/ui/userInterface.py @@ -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()