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 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, QDate from PyQt6.QtCore import QDate, QThread
from PyQt6.QtGui import QRegularExpressionValidator from PyQt6.QtGui import QRegularExpressionValidator
from src import Icon
from src.backend import ( from src.backend import (
AdminCommands, AdminCommands,
Database,
generateSemesterByDate,
recreateElsaFile, recreateElsaFile,
recreateFile, recreateFile,
Database,
tempdelete, tempdelete,
generateSemesterByDate,
) )
from src.logic import ( from src.logic import (
AvailChecker,
BookGrabber,
custom_sort,
APP_NRS, APP_NRS,
PROF_TITLES, PROF_TITLES,
ApparatData, ApparatData,
AvailChecker,
BookData, BookData,
BookGrabber,
MyLogger,
csv_to_list, csv_to_list,
custom_sort,
elsa_word_to_csv, elsa_word_to_csv,
word_docx_to_csv, word_docx_to_csv,
MyLogger,
) )
from src.ui import ( from src.ui import (
About,
App_Ext_Dialog, App_Ext_Dialog,
CalendarEntry,
DataGraph, DataGraph,
FilePicker, FilePicker,
Mail_Dialog, Mail_Dialog,
MessageCalendar,
Settings,
Ui_Semesterapparat, Ui_Semesterapparat,
edit_bookdata_ui, edit_bookdata_ui,
login_ui, login_ui,
@@ -50,12 +54,7 @@ from src.ui import (
parsed_titles_ui, parsed_titles_ui,
popus_confirm, popus_confirm,
reminder_ui, reminder_ui,
Settings,
About,
CalendarEntry,
MessageCalendar,
) )
from src import Icon
from src.ui.widgets.searchPage import SearchStatisticPage from src.ui.widgets.searchPage import SearchStatisticPage
config = OmegaConf.load("config.yaml") config = OmegaConf.load("config.yaml")
@@ -140,6 +139,8 @@ class Ui(Ui_Semesterapparat):
self.actionAbout.triggered.connect(self.open_about) self.actionAbout.triggered.connect(self.open_about)
# set validators # 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.sem_year.setText(str(QtCore.QDate.currentDate().year()))
self.prof_mail.setValidator( self.prof_mail.setValidator(
QRegularExpressionValidator( QRegularExpressionValidator(
@@ -215,6 +216,10 @@ class Ui(Ui_Semesterapparat):
self.tabWidget.currentChanged.connect(self.tabW1_changed) 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 # create a thread, that continually checks the validity of the inputs
self.validate_thread = QThread() self.validate_thread = QThread()
self.validate_thread.started.connect(self.thread_check) self.validate_thread.started.connect(self.thread_check)
@@ -275,6 +280,10 @@ class Ui(Ui_Semesterapparat):
self.mail_thread = None self.mail_thread = None
self.autoGrabber = None self.autoGrabber = None
def toggleButton(self, button):
if button.isChecked():
button.setChecked(False)
def open_about(self): def open_about(self):
about = About() about = About()
about.exec() about.exec()
@@ -288,6 +297,7 @@ class Ui(Ui_Semesterapparat):
self.create_frame_elsa.setEnabled(True) self.create_frame_elsa.setEnabled(True)
self.elsa_cancel_create.setEnabled(True) self.elsa_cancel_create.setEnabled(True)
self.active_semester.setEnabled(True) self.active_semester.setEnabled(True)
self.dokument_list_elsa.setRowCount(0)
profs = self.db.getProfs() profs = self.db.getProfs()
for prof in profs: for prof in profs:
self.elsa_prof.addItem(f"{prof[3]}, {prof[2]}") self.elsa_prof.addItem(f"{prof[3]}, {prof[2]}")
@@ -500,9 +510,12 @@ class Ui(Ui_Semesterapparat):
# documentation.show() # documentation.show()
def tabW1_changed(self): 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 = QtWidgets.QVBoxLayout(self.search_statistics)
layout.addWidget(self.statistics) layout.addWidget(self.statistics)
@@ -773,59 +786,16 @@ class Ui(Ui_Semesterapparat):
currentYear = self.sem_year.text() currentYear = self.sem_year.text()
currentYear = int(currentYear[-2:]) currentYear = int(currentYear[-2:])
semester = ( semester = "SoSe" if self.sem_sommer.isChecked() else "WiSe"
self.sem_sommer.text() if semester == "SoSe":
if self.sem_sommer.isChecked()
else self.sem_winter.text()
)
if semester == "Sommer":
return "SoSe " + str(currentYear) return "SoSe " + str(currentYear)
else: else:
return f"WiSe {currentYear}/{currentYear+1}" return f"WiSe {currentYear}/{currentYear+1}"
def open_apparat(self, header: str, apparat: str, parent_depth: int): def open_apparat(self, apparat):
print(header) if self.load_app_data(apparat):
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)
# change tab focus to tab 0 # change tab focus to tab 0
self.tabWidget.setCurrentIndex(0) self.tabWidget.setCurrentIndex(0)
return
def populate_dropdown(self, box, data): def populate_dropdown(self, box, data):
box.clear() box.clear()
@@ -941,11 +911,11 @@ class Ui(Ui_Semesterapparat):
def validate_prof_name(self): def validate_prof_name(self):
if self.app_group_box.isEnabled(): if self.app_group_box.isEnabled():
if "," in self.drpdwn_prof_name.currentText(): 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.profname_mand.setText("")
self.change_state(0, 1) self.change_state(0, 1)
else: else:
self.drpdwn_prof_name.setStyleSheet("border: 1px solid red;") Icon("valid_false", self.valid_check_profname)
self.profname_mand.setText("*") self.profname_mand.setText("*")
self.change_state(0, 0) self.change_state(0, 0)
else: else:
@@ -955,35 +925,33 @@ class Ui(Ui_Semesterapparat):
def validate_prof_mail(self): def validate_prof_mail(self):
if self.app_group_box.isEnabled(): if self.app_group_box.isEnabled():
if self.prof_mail.hasAcceptableInput(): 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.mail_mand.setText("")
self.change_state(1, 1) self.change_state(1, 1)
else: else:
self.prof_mail.setStyleSheet("border: 1px solid red;") Icon("valid_false", self.valid_check_mail)
self.mail_mand.setText("*") self.mail_mand.setText("*")
self.change_state(1, 0) self.change_state(1, 0)
else:
self.prof_mail.setStyleSheet("border: 1px solid black;")
def validate_prof_tel(self): def validate_prof_tel(self):
if self.app_group_box.isEnabled(): if self.app_group_box.isEnabled():
if self.prof_tel_nr.text() != "": 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.telnr_mand.setText("")
self.change_state(2, 1) self.change_state(2, 1)
else: else:
self.prof_tel_nr.setStyleSheet("border: 1px solid red;") Icon("valid_false", self.valid_check_telnr)
self.telnr_mand.setText("*") self.telnr_mand.setText("*")
self.change_state(2, 0) self.change_state(2, 0)
def validate_app_name(self): def validate_app_name(self):
if self.app_group_box.isEnabled(): if self.app_group_box.isEnabled():
if self.app_name.hasAcceptableInput(): 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.appname_mand.setText("")
self.change_state(3, 1) self.change_state(3, 1)
else: else:
self.app_name.setStyleSheet("border: 1px solid red;") Icon("valid_false", self.valid_check_appname)
self.appname_mand.setText("*") self.appname_mand.setText("*")
self.change_state(3, 0) self.change_state(3, 0)
@@ -997,7 +965,7 @@ class Ui(Ui_Semesterapparat):
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) Icon("valid_false", self.valid_check_app_fach)
self.valid_check_app_fach.setToolTip("Fach ist nicht gesetzt") 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)
@@ -1006,14 +974,17 @@ class Ui(Ui_Semesterapparat):
if self.app_group_box.isEnabled(): if self.app_group_box.isEnabled():
if ( if (
(self.sem_sommer.isChecked() or self.sem_winter.isChecked()) (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(): ) or self.check_eternal_app.isChecked():
self._mand.setText("") self._mand.setText("")
self.change_state(5, 1) self.change_state(5, 1)
self.check_eternal_app.setEnabled(True) self.check_eternal_app.setEnabled(True)
Icon("valid_true", self.valid_check_semester)
else: else:
self._mand.setText("*") self._mand.setText("*")
self.change_state(5, 0) self.change_state(5, 0)
Icon("valid_false", self.valid_check_semester)
self.check_eternal_app.setEnabled(False) self.check_eternal_app.setEnabled(False)
def change_state(self, index, state): def change_state(self, index, state):
@@ -1073,13 +1044,15 @@ class Ui(Ui_Semesterapparat):
and table_widget.item(i, j).text() == value and table_widget.item(i, j).text() == value
): ):
return i, j return i, j
return None return (None, None)
def load_app_data(self, app_id=None): def load_app_data(self, app_id=None):
self.cancel_active_selection.setEnabled(True) self.cancel_active_selection.setEnabled(True)
if isinstance(app_id, str): if isinstance(app_id, str):
# double click the tableWidget_apparate row with the given app_id # double click the tableWidget_apparate row with the given app_id
row, column = self.get_index_of_value(self.tableWidget_apparate, 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 # set the current index to the row
self.tableWidget_apparate.setCurrentCell(row, 0) self.tableWidget_apparate.setCurrentCell(row, 0)
self.check_send_mail.hide() self.check_send_mail.hide()
@@ -1102,6 +1075,7 @@ class Ui(Ui_Semesterapparat):
self.drpdwn_app_nr.setDisabled(True) self.drpdwn_app_nr.setDisabled(True)
self.update_app_media_list() self.update_app_media_list()
self.update_documemt_list() self.update_documemt_list()
return True
def update_documemt_list(self): def update_documemt_list(self):
app_id = self.active_apparat app_id = self.active_apparat
@@ -1812,7 +1786,7 @@ class Ui(Ui_Semesterapparat):
# self.update_app_media_list() # self.update_app_media_list()
def get_reminders(self): def get_reminders(self):
messages = self.db.getMessages() messages = self.db.getAllMessages()
self.logger.log_info(f"Got {len(messages)} messages from database") self.logger.log_info(f"Got {len(messages)} messages from database")
self.calendarWidget.setMessages(messages) self.calendarWidget.setMessages(messages)
self.calendarWidget.updateCells() self.calendarWidget.updateCells()
@@ -1858,9 +1832,10 @@ class Ui(Ui_Semesterapparat):
# # on valuechanged, update the message # # on valuechanged, update the message
# self.spin_select_message.valueChanged.connect(__update_message) # self.spin_select_message.valueChanged.connect(__update_message)
# self.btn_delete_message.clicked.connect(__delete_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 # append dialog to self.frame_2
self.calendarlayout.addWidget(dialog) self.calendarlayout.addWidget(dialog)
dialog.repaintSignal.connect(lambda: self.calendarWidget.reload(selected_date))
# dialog.deleteSignal.connect(__delete_message) # dialog.deleteSignal.connect(__delete_message)
# if selected_date is not None: # if selected_date is not None:
# dialog.repaintSignal.connect( # dialog.repaintSignal.connect(