formatting, change validation display, change calendar interaction, update code
This commit is contained in:
@@ -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(
|
||||||
|
|||||||
Reference in New Issue
Block a user