Refactor and enhance type hints across multiple modules

- Updated the `from_tuple` method in `Prof` class to specify return type.
- Added type hints for various methods in `LehmannsClient`, `OpenAI`, `WebRequest`, and `ZoteroController` classes to improve code clarity and type safety.
- Modified `pdf_to_csv` function to return a string instead of a DataFrame.
- Enhanced error handling and type hints in `wordparser` and `xmlparser` modules.
- Removed unused UI file `Ui_medianadder.ts`.
- Improved the layout and structure of the `semesterapparat_ui` to enhance user experience.
- Updated file picker to support `.doc` files in addition to `.docx`.
- Added unique item handling in `Ui` class to prevent duplicates in apparat list.
- General code cleanup and consistency improvements across various files.
This commit is contained in:
2025-10-21 09:09:54 +02:00
parent 560d8285b5
commit 0406fe4f6f
26 changed files with 437 additions and 396 deletions

View File

@@ -1,4 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE TS>
<TS version="2.1">
</TS>

View File

@@ -110,10 +110,10 @@ class DocumentPrintDialog(QtWidgets.QDialog, Ui_Dialog):
def on_pushButton_clicked(self):
apparats: list[tuple[int, str]] = []
apps = self.db.getAllAparats(0)
apps = natsorted(apps, key=lambda x: x[4], reverse=True)
apps = natsorted(apps, key=lambda x: x.appnr, reverse=True)
for app in apps:
prof = self.db.getProfById(app[2])
data = (app[4], f"{prof.lastname} ({app[1]})")
prof = self.db.getProfById(app.prof_id)
data = (app.appnr, f"{prof.lastname} ({app.name})")
apparats.append(data)
SemesterDocument(
semester=self.semester.value,

View File

@@ -1349,7 +1349,7 @@
</property>
<property name="toolTip">
<string>Die Apparatsdetails werden aus dem Dokument gelesen und eingetragen
Einige Angaben müssen ggf angepasst werden</string>
Die gewünschten Medien werden automatisch in die Medienliste eingetragen, evtl. unvollständig, da eBooks nicht erfasst werden könnenEinige Angaben müssen ggf angepasst werden</string>
</property>
<property name="text">
<string>Daten aus Dokument
@@ -1618,72 +1618,72 @@ Einige Angaben müssen ggf angepasst werden</string>
<attribute name="title">
<string>Admin</string>
</attribute>
<widget class="QLabel" name="label_21">
<widget class="QFrame" name="frame">
<property name="geometry">
<rect>
<x>10</x>
<y>30</y>
<width>47</width>
<height>22</height>
<x>0</x>
<y>0</y>
<width>1251</width>
<height>711</height>
</rect>
</property>
<property name="text">
<string>Aktion:</string>
<property name="frameShape">
<enum>QFrame::StyledPanel</enum>
</property>
</widget>
<widget class="QComboBox" name="select_action_box">
<property name="geometry">
<rect>
<x>60</x>
<y>30</y>
<width>181</width>
<height>22</height>
</rect>
</property>
<item>
<property name="text">
<string>Nutzer anlegen</string>
</property>
</item>
<item>
<property name="text">
<string>Nutzer bearbeiten</string>
</property>
</item>
<item>
<property name="text">
<string>Lehrperson bearbeiten</string>
</property>
</item>
<item>
<property name="text">
<string>Medien bearbeiten</string>
</property>
</item>
</widget>
<widget class="QGroupBox" name="admin_action">
<property name="geometry">
<rect>
<x>10</x>
<y>70</y>
<width>570</width>
<height>291</height>
</rect>
</property>
<property name="font">
<font>
<bold>false</bold>
</font>
</property>
<property name="title">
<string>GroupBox</string>
</property>
<property name="flat">
<bool>true</bool>
</property>
<property name="checkable">
<bool>false</bool>
<property name="frameShadow">
<enum>QFrame::Raised</enum>
</property>
<layout class="QFormLayout" name="formLayout_2">
<item row="0" column="0">
<widget class="QLabel" name="label_21">
<property name="text">
<string>Aktion:</string>
</property>
</widget>
</item>
<item row="0" column="1">
<widget class="QComboBox" name="select_action_box">
<item>
<property name="text">
<string>Nutzer anlegen</string>
</property>
</item>
<item>
<property name="text">
<string>Nutzer bearbeiten</string>
</property>
</item>
<item>
<property name="text">
<string>Lehrperson bearbeiten</string>
</property>
</item>
<item>
<property name="text">
<string>Medien bearbeiten</string>
</property>
</item>
</widget>
</item>
<item row="1" column="1">
<widget class="QGroupBox" name="admin_action">
<property name="font">
<font>
<bold>false</bold>
</font>
</property>
<property name="title">
<string>GroupBox</string>
</property>
<property name="flat">
<bool>true</bool>
</property>
<property name="checkable">
<bool>false</bool>
</property>
</widget>
</item>
</layout>
</widget>
</widget>
</widget>

View File

@@ -638,24 +638,37 @@ class Ui_MainWindow(object):
self.tabWidget.addTab(self.elsatab, "")
self.admin = QWidget()
self.admin.setObjectName(u"admin")
self.label_21 = QLabel(self.admin)
self.frame = QFrame(self.admin)
self.frame.setObjectName(u"frame")
self.frame.setGeometry(QRect(0, 0, 1251, 711))
self.frame.setFrameShape(QFrame.StyledPanel)
self.frame.setFrameShadow(QFrame.Raised)
self.formLayout_2 = QFormLayout(self.frame)
self.formLayout_2.setObjectName(u"formLayout_2")
self.label_21 = QLabel(self.frame)
self.label_21.setObjectName(u"label_21")
self.label_21.setGeometry(QRect(10, 30, 47, 22))
self.select_action_box = QComboBox(self.admin)
self.formLayout_2.setWidget(0, QFormLayout.ItemRole.LabelRole, self.label_21)
self.select_action_box = QComboBox(self.frame)
self.select_action_box.addItem("")
self.select_action_box.addItem("")
self.select_action_box.addItem("")
self.select_action_box.addItem("")
self.select_action_box.setObjectName(u"select_action_box")
self.select_action_box.setGeometry(QRect(60, 30, 181, 22))
self.admin_action = QGroupBox(self.admin)
self.formLayout_2.setWidget(0, QFormLayout.ItemRole.FieldRole, self.select_action_box)
self.admin_action = QGroupBox(self.frame)
self.admin_action.setObjectName(u"admin_action")
self.admin_action.setGeometry(QRect(10, 70, 570, 291))
font5 = QFont()
font5.setBold(False)
self.admin_action.setFont(font5)
self.admin_action.setFlat(True)
self.admin_action.setCheckable(False)
self.formLayout_2.setWidget(1, QFormLayout.ItemRole.FieldRole, self.admin_action)
self.tabWidget.addTab(self.admin, "")
self.gridLayout.addWidget(self.tabWidget, 0, 0, 1, 1)
@@ -963,7 +976,7 @@ class Ui_MainWindow(object):
" hinzuf\u00fcgen", None))
#if QT_CONFIG(tooltip)
self.btn_extract_data_from_document.setToolTip(QCoreApplication.translate("MainWindow", u"Die Apparatsdetails werden aus dem Dokument gelesen und eingetragen\n"
"Einige Angaben m\u00fcssen ggf angepasst werden", None))
"Die gew\u00fcnschten Medien werden automatisch in die Medienliste eingetragen, evtl. unvollst\u00e4ndig, da eBooks nicht erfasst werden k\u00f6nnenEinige Angaben m\u00fcssen ggf angepasst werden", None))
#endif // QT_CONFIG(tooltip)
self.btn_extract_data_from_document.setText(QCoreApplication.translate("MainWindow", u"Daten aus Dokument\n"
"\u00fcbernehmen", None))

View File

@@ -373,7 +373,7 @@ class Ui(QtWidgets.QMainWindow, Ui_Semesterapparat):
self.setWidget(UpdateSignatures())
self.admin_action.setTitle("Medien bearbeiten")
else:
self.hideWidget()
# self.hideWidget()
self.admin_action.setTitle("")
def toggleButton(self, button: QtWidgets.QCheckBox):
@@ -1224,12 +1224,14 @@ class Ui(QtWidgets.QMainWindow, Ui_Semesterapparat):
signatures = csv_to_list(file)
# add the data to the database
return signatures
if file_type == "docx":
if file_type in ("docx", "doc"):
data = word_to_semap(file)
log.info("Converted data from semap file")
log.debug("Got the data: {}", data)
return data
else:
raise ValueError("Dateityp wird nicht unterstützt")
def import_data_from_document(self):
global valid_input
@@ -1241,6 +1243,7 @@ class Ui(QtWidgets.QMainWindow, Ui_Semesterapparat):
self.prof_mail.setText(data.mail)
self.prof_tel_nr.setText(str(data.phoneNumber).replace("-", ""))
self.app_name.setText(data.title)
if len(data.title_suggestions) > 0:
# create a dialog that has a dropdown with the suggestions, and oc and cancel button. on ok return the selected text and set it as title
dialog = QtWidgets.QDialog()
@@ -1271,6 +1274,7 @@ class Ui(QtWidgets.QMainWindow, Ui_Semesterapparat):
self.app_name.setText(dropdown.currentText().split(" [")[0].strip())
else:
self.app_name.setText("CHANGEME")
# self.app_name.setText(data.title)
subjects = self.db.getSubjects()
subjects = [subject[1] for subject in subjects]
@@ -1287,8 +1291,10 @@ class Ui(QtWidgets.QMainWindow, Ui_Semesterapparat):
if data.eternal:
self.check_eternal_app.setChecked(True)
self.validate_semester()
if data.books != []:
self.btn_check_file_threaded(data)
def btn_check_file_threaded(self):
def btn_check_file_threaded(self, c_document: Optional[SemapDocument] = None):
for runner in self.bookGrabber:
if not runner.isRunning():
runner.deleteLater()
@@ -1335,7 +1341,10 @@ class Ui(QtWidgets.QMainWindow, Ui_Semesterapparat):
prof_id = self.db.getProfId(self.profdata)
# log.debug("Prof ID is None", prof_id)
document = self.extract_document_data()
document = None
if c_document is None or not isinstance(c_document, SemapDocument):
document = self.extract_document_data()
if document is None:
log.error("Document is None")
elif isinstance(document, SemapDocument):
@@ -1410,7 +1419,7 @@ class Ui(QtWidgets.QMainWindow, Ui_Semesterapparat):
)
prof.title = self.prof_title.text()
apparat = Apparat(
appnr=self.active_apparat,
appnr=int(self.drpdwn_app_nr.currentText()),
name=self.app_name.text(),
created_semester=self.generateSemester(),
eternal=1 if self.check_eternal_app.isChecked() else 0,
@@ -1433,7 +1442,8 @@ class Ui(QtWidgets.QMainWindow, Ui_Semesterapparat):
return
appdata = self.db.getAllAparats()
# merge self.appdata and appdata, remove duplicates
self.apparats = list(set(self.apparats + appdata))
self.apparats = self.__uniques(self.apparats, appdata)
self.apparats = natsorted(self.apparats, key=lambda x: x[4], reverse=True)
self.update_apparat_list()
@@ -1452,6 +1462,16 @@ class Ui(QtWidgets.QMainWindow, Ui_Semesterapparat):
self.__clear_fields()
return True
def __uniques(self, list1, list2):
seen = set()
unique_list = []
for item in list1 + list2:
identifier = (item.appnr, item.name)
if identifier not in seen:
seen.add(identifier)
unique_list.append(item)
return unique_list
def send_mail_preview(self):
pass

View File

@@ -21,7 +21,7 @@ class FilePicker:
files, _ = filepicker.getOpenFileNames(
caption="Open file",
dir=self.last_path,
filter="Unterstützte Dateien (*.docx *.csv *.eml );;Word (*.docx);;CSV Files (*.csv);;Mail (*.eml)",
filter="Unterstützte Dateien (*.docx *.doc *.csv *.eml );;Word (*.docx *.doc);;CSV Files (*.csv);;Mail (*.eml)",
)
if files:
self.last_path = files[0]