diff --git a/src/ui/userInterface.py b/src/ui/userInterface.py index 8cc228a..347c3c0 100644 --- a/src/ui/userInterface.py +++ b/src/ui/userInterface.py @@ -13,36 +13,40 @@ from icecream import ic from natsort import natsorted from omegaconf import OmegaConf from PyQt6 import QtCore, QtGui, QtWidgets -from PyQt6.QtCore import QThread, QDate +from PyQt6.QtCore import QDate, QThread from PyQt6.QtGui import QRegularExpressionValidator +from src import Icon from src.backend import ( AdminCommands, + Database, + generateSemesterByDate, recreateElsaFile, recreateFile, - Database, tempdelete, - generateSemesterByDate, ) from src.logic import ( - AvailChecker, - BookGrabber, - custom_sort, APP_NRS, PROF_TITLES, ApparatData, + AvailChecker, BookData, + BookGrabber, + MyLogger, csv_to_list, + custom_sort, elsa_word_to_csv, word_docx_to_csv, - MyLogger, ) - from src.ui import ( + About, App_Ext_Dialog, + CalendarEntry, DataGraph, FilePicker, Mail_Dialog, + MessageCalendar, + Settings, Ui_Semesterapparat, edit_bookdata_ui, login_ui, @@ -50,12 +54,7 @@ from src.ui import ( parsed_titles_ui, popus_confirm, reminder_ui, - Settings, - About, - CalendarEntry, - MessageCalendar, ) -from src import Icon from src.ui.widgets.searchPage import SearchStatisticPage config = OmegaConf.load("config.yaml") @@ -140,6 +139,8 @@ class Ui(Ui_Semesterapparat): self.actionAbout.triggered.connect(self.open_about) # set validators + self.sem_sommer.clicked.connect(lambda: self.toggleButton(self.sem_winter)) + self.sem_winter.clicked.connect(lambda: self.toggleButton(self.sem_sommer)) self.sem_year.setText(str(QtCore.QDate.currentDate().year())) self.prof_mail.setValidator( QRegularExpressionValidator( @@ -215,6 +216,10 @@ class Ui(Ui_Semesterapparat): self.tabWidget.currentChanged.connect(self.tabW1_changed) + self.statistics = SearchStatisticPage() + self.statistics.apparat_open.connect(self.open_apparat) + self.statistics.reloadSignal.connect(self.reload) + # create a thread, that continually checks the validity of the inputs self.validate_thread = QThread() self.validate_thread.started.connect(self.thread_check) @@ -275,6 +280,10 @@ class Ui(Ui_Semesterapparat): self.mail_thread = None self.autoGrabber = None + def toggleButton(self, button): + if button.isChecked(): + button.setChecked(False) + def open_about(self): about = About() about.exec() @@ -288,6 +297,7 @@ class Ui(Ui_Semesterapparat): self.create_frame_elsa.setEnabled(True) self.elsa_cancel_create.setEnabled(True) self.active_semester.setEnabled(True) + self.dokument_list_elsa.setRowCount(0) profs = self.db.getProfs() for prof in profs: self.elsa_prof.addItem(f"{prof[3]}, {prof[2]}") @@ -500,9 +510,12 @@ class Ui(Ui_Semesterapparat): # documentation.show() def tabW1_changed(self): - if self.tabWidget.currentIndex() == 1: # Statistics - self.statistics = SearchStatisticPage() + if self.tabWidget.currentIndex() == 1: # Statistics + stats_layout = self.search_statistics.layout() + if stats_layout is not None: + # delete tabpage, re-add with same name at same position + return layout = QtWidgets.QVBoxLayout(self.search_statistics) layout.addWidget(self.statistics) @@ -773,59 +786,16 @@ class Ui(Ui_Semesterapparat): currentYear = self.sem_year.text() currentYear = int(currentYear[-2:]) - semester = ( - self.sem_sommer.text() - if self.sem_sommer.isChecked() - else self.sem_winter.text() - ) - if semester == "Sommer": + semester = "SoSe" if self.sem_sommer.isChecked() else "WiSe" + if semester == "SoSe": return "SoSe " + str(currentYear) else: return f"WiSe {currentYear}/{currentYear+1}" - def open_apparat(self, header: str, apparat: str, parent_depth: int): - print(header) - if header == "deleted" and parent_depth == 2: - # TODO: warn message here - print("warning") - if parent_depth == 1: - print(apparat) - # person selected case - open all apparats from this person in the tableWidget - self.tableWidget.setRowCount(0) - prof_id = self.db.getProfId(apparat.split("(")[0].strip()) - apparats = self.db.getApparatsByProf(prof_id) - for app in apparats: - print(app) - # set the items 0 = clickable checkbox, 1 = appname, 2 = profname, 3 = fach - # insert new row - self.tableWidget.insertRow(0) - self.tableWidget.setItem(0, 0, QtWidgets.QTableWidgetItem("")) - self.tableWidget.setItem(0, 1, QtWidgets.QTableWidgetItem(app[1])) - self.tableWidget.setItem(0, 2, QtWidgets.QTableWidgetItem(str(app[4]))) - self.tableWidget.setItem(0, 3, QtWidgets.QTableWidgetItem(app[2])) - self.tableWidget.setItem(0, 4, QtWidgets.QTableWidgetItem(app[3])) - # replace the 0 with a checkbox - checkbox = QtWidgets.QCheckBox() - checkbox.setChecked(False) - self.tableWidget.setCellWidget(0, 0, checkbox) - # if i[9] is 1, set the background of the row to red - if int(app[9]) == 1: - for j in range(5): - self.tableWidget.item(0, j).setBackground( - QtGui.QColor(235, 74, 71) - ) - # disable the checkbox - self.tableWidget.cellWidget(0, 0).setEnabled(False) - # set the tooltip - self.tableWidget.cellWidget(0, 0).setToolTip( - "Dieser Semesterapparat kann nicht gelöscht werden, da er bereits gelöscht wurde" - ) - elif parent_depth == 2: - # apparat selected case - open the apparat in the frame - self.load_app_data(apparat) + def open_apparat(self, apparat): + if self.load_app_data(apparat): # change tab focus to tab 0 self.tabWidget.setCurrentIndex(0) - return def populate_dropdown(self, box, data): box.clear() @@ -941,11 +911,11 @@ class Ui(Ui_Semesterapparat): def validate_prof_name(self): if self.app_group_box.isEnabled(): if "," in self.drpdwn_prof_name.currentText(): - self.drpdwn_prof_name.setStyleSheet("border: 1px solid green;") + Icon("valid_true", self.valid_check_profname) self.profname_mand.setText("") self.change_state(0, 1) else: - self.drpdwn_prof_name.setStyleSheet("border: 1px solid red;") + Icon("valid_false", self.valid_check_profname) self.profname_mand.setText("*") self.change_state(0, 0) else: @@ -955,35 +925,33 @@ class Ui(Ui_Semesterapparat): def validate_prof_mail(self): if self.app_group_box.isEnabled(): if self.prof_mail.hasAcceptableInput(): - self.prof_mail.setStyleSheet("border: 1px solid green;") + Icon("valid_true", self.valid_check_mail) self.mail_mand.setText("") self.change_state(1, 1) else: - self.prof_mail.setStyleSheet("border: 1px solid red;") + Icon("valid_false", self.valid_check_mail) self.mail_mand.setText("*") self.change_state(1, 0) - else: - self.prof_mail.setStyleSheet("border: 1px solid black;") def validate_prof_tel(self): if self.app_group_box.isEnabled(): if self.prof_tel_nr.text() != "": - self.prof_tel_nr.setStyleSheet("border: 1px solid green;") + Icon("valid_true", self.valid_check_telnr) self.telnr_mand.setText("") self.change_state(2, 1) else: - self.prof_tel_nr.setStyleSheet("border: 1px solid red;") + Icon("valid_false", self.valid_check_telnr) self.telnr_mand.setText("*") self.change_state(2, 0) def validate_app_name(self): if self.app_group_box.isEnabled(): if self.app_name.hasAcceptableInput(): - self.app_name.setStyleSheet("border: 1px solid green;") + Icon("valid_true", self.valid_check_appname) self.appname_mand.setText("") self.change_state(3, 1) else: - self.app_name.setStyleSheet("border: 1px solid red;") + Icon("valid_false", self.valid_check_appname) self.appname_mand.setText("*") self.change_state(3, 0) @@ -997,7 +965,7 @@ class Ui(Ui_Semesterapparat): self.change_state(4, 1) else: # self.app_fach.setStyleSheet("border: 1px solid red;") - Icon("valid_false", self.valid_check) + Icon("valid_false", self.valid_check_app_fach) self.valid_check_app_fach.setToolTip("Fach ist nicht gesetzt") self.fach_mand.setText("*") self.change_state(4, 0) @@ -1006,14 +974,17 @@ class Ui(Ui_Semesterapparat): if self.app_group_box.isEnabled(): if ( (self.sem_sommer.isChecked() or self.sem_winter.isChecked()) - and self.sem_year.hasAcceptableInput() + and self.sem_year.text() != "" + and len(self.sem_year.text()) == 4 ) or self.check_eternal_app.isChecked(): self._mand.setText("") self.change_state(5, 1) self.check_eternal_app.setEnabled(True) + Icon("valid_true", self.valid_check_semester) else: self._mand.setText("*") self.change_state(5, 0) + Icon("valid_false", self.valid_check_semester) self.check_eternal_app.setEnabled(False) def change_state(self, index, state): @@ -1073,13 +1044,15 @@ class Ui(Ui_Semesterapparat): and table_widget.item(i, j).text() == value ): return i, j - return None + return (None, None) def load_app_data(self, app_id=None): self.cancel_active_selection.setEnabled(True) if isinstance(app_id, str): # double click the tableWidget_apparate row with the given app_id row, column = self.get_index_of_value(self.tableWidget_apparate, app_id) + if row is None and column is None: + return False # set the current index to the row self.tableWidget_apparate.setCurrentCell(row, 0) self.check_send_mail.hide() @@ -1102,6 +1075,7 @@ class Ui(Ui_Semesterapparat): self.drpdwn_app_nr.setDisabled(True) self.update_app_media_list() self.update_documemt_list() + return True def update_documemt_list(self): app_id = self.active_apparat @@ -1812,7 +1786,7 @@ class Ui(Ui_Semesterapparat): # self.update_app_media_list() def get_reminders(self): - messages = self.db.getMessages() + messages = self.db.getAllMessages() self.logger.log_info(f"Got {len(messages)} messages from database") self.calendarWidget.setMessages(messages) self.calendarWidget.updateCells() @@ -1858,9 +1832,10 @@ class Ui(Ui_Semesterapparat): # # on valuechanged, update the message # self.spin_select_message.valueChanged.connect(__update_message) # self.btn_delete_message.clicked.connect(__delete_message) - dialog = CalendarEntry(messages=messages) + dialog = CalendarEntry(messages=messages, date=selected_date) # append dialog to self.frame_2 self.calendarlayout.addWidget(dialog) + dialog.repaintSignal.connect(lambda: self.calendarWidget.reload(selected_date)) # dialog.deleteSignal.connect(__delete_message) # if selected_date is not None: # dialog.repaintSignal.connect(