formatting, change validation display, change calendar interaction, update code

This commit is contained in:
WorldTeacher
2024-06-13 09:36:23 +02:00
parent b7b1c106ea
commit ce11a51d32

View File

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