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 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(
|
||||
|
||||
Reference in New Issue
Block a user