update logging, update docuprint add new ui for generating documents

This commit is contained in:
2025-05-09 11:57:18 +02:00
parent f7ea6f5d34
commit 468e8674ab
16 changed files with 843 additions and 187 deletions

View File

@@ -0,0 +1,233 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>Dialog</class>
<widget class="QDialog" name="Dialog">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>725</width>
<height>623</height>
</rect>
</property>
<property name="windowTitle">
<string>Dialog</string>
</property>
<layout class="QVBoxLayout" name="verticalLayout">
<item>
<widget class="QToolBox" name="toolBox">
<property name="font">
<font>
<bold>true</bold>
</font>
</property>
<property name="currentIndex">
<number>1</number>
</property>
<widget class="QWidget" name="page">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>707</width>
<height>545</height>
</rect>
</property>
<attribute name="label">
<string>Semesterapparatsübersicht</string>
</attribute>
<layout class="QHBoxLayout" name="horizontalLayout">
<item>
<widget class="QLabel" name="label">
<property name="font">
<font>
<bold>false</bold>
</font>
</property>
<property name="text">
<string>Mit dem Klick auf Okay wird eine Übersicht aller aktiven Semesterapparate erstellt und an den FollowME Drucker gesendet. Es kann bis zu 5 Minuten dauern, bis das Dokument im Drucker angezeigt wird.</string>
</property>
<property name="wordWrap">
<bool>true</bool>
</property>
<property name="margin">
<number>5</number>
</property>
</widget>
</item>
<item>
<widget class="QPushButton" name="pushButton">
<property name="text">
<string>Dokument erstellen und drucken</string>
</property>
</widget>
</item>
</layout>
</widget>
<widget class="QWidget" name="page_2">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>707</width>
<height>545</height>
</rect>
</property>
<attribute name="label">
<string>Semesterapparatsschilder</string>
</attribute>
<layout class="QVBoxLayout" name="verticalLayout_2">
<item>
<layout class="QHBoxLayout" name="horizontalLayout_2">
<item>
<widget class="QLabel" name="label_2">
<property name="font">
<font>
<bold>false</bold>
</font>
</property>
<property name="text">
<string>Hier kann das Dokument für die Semesterapparatsschilder erstellt werden. Hierfür müssen die entsprechenden Apparate ausgewählt werden. Mithilfe dieser wird das Dokument erstellt.</string>
</property>
<property name="wordWrap">
<bool>true</bool>
</property>
</widget>
</item>
<item>
<layout class="QVBoxLayout" name="verticalLayout_3">
<item>
<widget class="QPushButton" name="pushButton_2">
<property name="text">
<string>Dokument erstellen und drucken</string>
</property>
</widget>
</item>
<item>
<widget class="QPushButton" name="btn_load_current_apparats">
<property name="text">
<string>Aktuelle Apparate laden</string>
</property>
</widget>
</item>
<item>
<widget class="QCheckBox" name="expertMode">
<property name="text">
<string>Expertenmodus</string>
</property>
</widget>
</item>
</layout>
</item>
</layout>
</item>
<item>
<widget class="QFrame" name="frame">
<property name="frameShape">
<enum>QFrame::StyledPanel</enum>
</property>
<property name="frameShadow">
<enum>QFrame::Raised</enum>
</property>
<layout class="QHBoxLayout" name="horizontalLayout_3">
<property name="spacing">
<number>0</number>
</property>
<property name="leftMargin">
<number>0</number>
</property>
<property name="topMargin">
<number>0</number>
</property>
<property name="rightMargin">
<number>0</number>
</property>
<property name="bottomMargin">
<number>0</number>
</property>
<item>
<layout class="QVBoxLayout" name="verticalLayout_4">
<item>
<widget class="QTextBrowser" name="textBrowser">
<property name="sizePolicy">
<sizepolicy hsizetype="MinimumExpanding" vsizetype="MinimumExpanding">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="readOnly">
<bool>false</bool>
</property>
<property name="html">
<string>&lt;!DOCTYPE HTML PUBLIC &quot;-//W3C//DTD HTML 4.0//EN&quot; &quot;http://www.w3.org/TR/REC-html40/strict.dtd&quot;&gt;
&lt;html&gt;&lt;head&gt;&lt;meta name=&quot;qrichtext&quot; content=&quot;1&quot; /&gt;&lt;meta charset=&quot;utf-8&quot; /&gt;&lt;style type=&quot;text/css&quot;&gt;
p, li { white-space: pre-wrap; }
hr { height: 1px; border-width: 0; }
li.unchecked::marker { content: &quot;\2610&quot;; }
li.checked::marker { content: &quot;\2612&quot;; }
&lt;/style&gt;&lt;/head&gt;&lt;body style=&quot; font-family:'Segoe UI'; font-size:9pt; font-weight:700; font-style:normal;&quot;&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;SELECT&lt;/p&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt; semesterapparat.name,&lt;/p&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt; prof.lname&lt;/p&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;from&lt;/p&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt; semesterapparat&lt;/p&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt; INNER JOIN prof ON semesterapparat.prof_id = prof.id&lt;/p&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;WHERE&lt;/p&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt; (erstellsemester = 'SoSe 25'&lt;/p&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt; OR erstellsemester = 'WiSe 24/25')&lt;/p&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt; and semesterapparat.deletion_status = 0&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
</widget>
</item>
<item>
<widget class="QPushButton" name="manualCheck">
<property name="text">
<string>Anfragen und anzeigen</string>
</property>
</widget>
</item>
</layout>
</item>
</layout>
</widget>
</item>
<item>
<widget class="QTableWidget" name="tableWidget">
<property name="font">
<font>
<bold>false</bold>
</font>
</property>
<property name="editTriggers">
<set>QAbstractItemView::NoEditTriggers</set>
</property>
<attribute name="horizontalHeaderShowSortIndicator" stdset="0">
<bool>true</bool>
</attribute>
<attribute name="horizontalHeaderStretchLastSection">
<bool>true</bool>
</attribute>
<column>
<property name="text">
<string/>
</property>
<property name="textAlignment">
<set>AlignLeading|AlignVCenter</set>
</property>
</column>
<column>
<property name="text">
<string>Name</string>
</property>
</column>
</widget>
</item>
</layout>
</widget>
</widget>
</item>
</layout>
</widget>
<resources/>
<connections/>
</ui>

View File

@@ -0,0 +1,143 @@
# Form implementation generated from reading ui file 'c:\Users\aky547\GitHub\SemesterapparatsManager\src\ui\dialogs\dialog_sources\documentprint.ui'
#
# Created by: PyQt6 UI code generator 6.8.0
#
# WARNING: Any manual changes made to this file will be lost when pyuic6 is
# run again. Do not edit this file unless you know what you are doing.
from PyQt6 import QtCore, QtGui, QtWidgets
class Ui_Dialog(object):
def setupUi(self, Dialog):
Dialog.setObjectName("Dialog")
Dialog.resize(725, 623)
self.verticalLayout = QtWidgets.QVBoxLayout(Dialog)
self.verticalLayout.setObjectName("verticalLayout")
self.toolBox = QtWidgets.QToolBox(parent=Dialog)
font = QtGui.QFont()
font.setBold(True)
self.toolBox.setFont(font)
self.toolBox.setObjectName("toolBox")
self.page = QtWidgets.QWidget()
self.page.setGeometry(QtCore.QRect(0, 0, 707, 545))
self.page.setObjectName("page")
self.horizontalLayout = QtWidgets.QHBoxLayout(self.page)
self.horizontalLayout.setObjectName("horizontalLayout")
self.label = QtWidgets.QLabel(parent=self.page)
font = QtGui.QFont()
font.setBold(False)
self.label.setFont(font)
self.label.setWordWrap(True)
self.label.setObjectName("label")
self.horizontalLayout.addWidget(self.label)
self.pushButton = QtWidgets.QPushButton(parent=self.page)
self.pushButton.setObjectName("pushButton")
self.horizontalLayout.addWidget(self.pushButton)
self.toolBox.addItem(self.page, "")
self.page_2 = QtWidgets.QWidget()
self.page_2.setGeometry(QtCore.QRect(0, 0, 707, 545))
self.page_2.setObjectName("page_2")
self.verticalLayout_2 = QtWidgets.QVBoxLayout(self.page_2)
self.verticalLayout_2.setObjectName("verticalLayout_2")
self.horizontalLayout_2 = QtWidgets.QHBoxLayout()
self.horizontalLayout_2.setObjectName("horizontalLayout_2")
self.label_2 = QtWidgets.QLabel(parent=self.page_2)
font = QtGui.QFont()
font.setBold(False)
self.label_2.setFont(font)
self.label_2.setWordWrap(True)
self.label_2.setObjectName("label_2")
self.horizontalLayout_2.addWidget(self.label_2)
self.verticalLayout_3 = QtWidgets.QVBoxLayout()
self.verticalLayout_3.setObjectName("verticalLayout_3")
self.pushButton_2 = QtWidgets.QPushButton(parent=self.page_2)
self.pushButton_2.setObjectName("pushButton_2")
self.verticalLayout_3.addWidget(self.pushButton_2)
self.btn_load_current_apparats = QtWidgets.QPushButton(parent=self.page_2)
self.btn_load_current_apparats.setObjectName("btn_load_current_apparats")
self.verticalLayout_3.addWidget(self.btn_load_current_apparats)
self.expertMode = QtWidgets.QCheckBox(parent=self.page_2)
self.expertMode.setObjectName("expertMode")
self.verticalLayout_3.addWidget(self.expertMode)
self.horizontalLayout_2.addLayout(self.verticalLayout_3)
self.verticalLayout_2.addLayout(self.horizontalLayout_2)
self.frame = QtWidgets.QFrame(parent=self.page_2)
self.frame.setFrameShape(QtWidgets.QFrame.Shape.StyledPanel)
self.frame.setFrameShadow(QtWidgets.QFrame.Shadow.Raised)
self.frame.setObjectName("frame")
self.horizontalLayout_3 = QtWidgets.QHBoxLayout(self.frame)
self.horizontalLayout_3.setContentsMargins(0, 0, 0, 0)
self.horizontalLayout_3.setSpacing(0)
self.horizontalLayout_3.setObjectName("horizontalLayout_3")
self.verticalLayout_4 = QtWidgets.QVBoxLayout()
self.verticalLayout_4.setObjectName("verticalLayout_4")
self.textBrowser = QtWidgets.QTextBrowser(parent=self.frame)
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Policy.MinimumExpanding, QtWidgets.QSizePolicy.Policy.MinimumExpanding)
sizePolicy.setHorizontalStretch(0)
sizePolicy.setVerticalStretch(0)
sizePolicy.setHeightForWidth(self.textBrowser.sizePolicy().hasHeightForWidth())
self.textBrowser.setSizePolicy(sizePolicy)
self.textBrowser.setReadOnly(False)
self.textBrowser.setObjectName("textBrowser")
self.verticalLayout_4.addWidget(self.textBrowser)
self.manualCheck = QtWidgets.QPushButton(parent=self.frame)
self.manualCheck.setObjectName("manualCheck")
self.verticalLayout_4.addWidget(self.manualCheck)
self.horizontalLayout_3.addLayout(self.verticalLayout_4)
self.verticalLayout_2.addWidget(self.frame)
self.tableWidget = QtWidgets.QTableWidget(parent=self.page_2)
font = QtGui.QFont()
font.setBold(False)
self.tableWidget.setFont(font)
self.tableWidget.setEditTriggers(QtWidgets.QAbstractItemView.EditTrigger.NoEditTriggers)
self.tableWidget.setObjectName("tableWidget")
self.tableWidget.setColumnCount(2)
self.tableWidget.setRowCount(0)
item = QtWidgets.QTableWidgetItem()
item.setTextAlignment(QtCore.Qt.AlignmentFlag.AlignLeading|QtCore.Qt.AlignmentFlag.AlignVCenter)
self.tableWidget.setHorizontalHeaderItem(0, item)
item = QtWidgets.QTableWidgetItem()
self.tableWidget.setHorizontalHeaderItem(1, item)
self.tableWidget.horizontalHeader().setSortIndicatorShown(True)
self.tableWidget.horizontalHeader().setStretchLastSection(True)
self.verticalLayout_2.addWidget(self.tableWidget)
self.toolBox.addItem(self.page_2, "")
self.verticalLayout.addWidget(self.toolBox)
self.retranslateUi(Dialog)
self.toolBox.setCurrentIndex(1)
QtCore.QMetaObject.connectSlotsByName(Dialog)
def retranslateUi(self, Dialog):
_translate = QtCore.QCoreApplication.translate
Dialog.setWindowTitle(_translate("Dialog", "Dialog"))
self.label.setText(_translate("Dialog", "Mit dem Klick auf Okay wird eine Übersicht aller aktiven Semesterapparate erstellt und an den FollowME Drucker gesendet. Es kann bis zu 5 Minuten dauern, bis das Dokument im Drucker angezeigt wird."))
self.pushButton.setText(_translate("Dialog", "Dokument erstellen und drucken"))
self.toolBox.setItemText(self.toolBox.indexOf(self.page), _translate("Dialog", "Semesterapparatsübersicht"))
self.label_2.setText(_translate("Dialog", "Hier kann das Dokument für die Semesterapparatsschilder erstellt werden. Hierfür müssen die entsprechenden Apparate ausgewählt werden. Mithilfe dieser wird das Dokument erstellt."))
self.pushButton_2.setText(_translate("Dialog", "Dokument erstellen und drucken"))
self.btn_load_current_apparats.setText(_translate("Dialog", "Aktuelle Apparate laden"))
self.expertMode.setText(_translate("Dialog", "Expertenmodus"))
self.textBrowser.setHtml(_translate("Dialog", "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0//EN\" \"http://www.w3.org/TR/REC-html40/strict.dtd\">\n"
"<html><head><meta name=\"qrichtext\" content=\"1\" /><meta charset=\"utf-8\" /><style type=\"text/css\">\n"
"p, li { white-space: pre-wrap; }\n"
"hr { height: 1px; border-width: 0; }\n"
"li.unchecked::marker { content: \"\\2610\"; }\n"
"li.checked::marker { content: \"\\2612\"; }\n"
"</style></head><body style=\" font-family:\'Segoe UI\'; font-size:9pt; font-weight:700; font-style:normal;\">\n"
"<p style=\" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\">SELECT</p>\n"
"<p style=\" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\"> semesterapparat.name,</p>\n"
"<p style=\" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\"> prof.lname</p>\n"
"<p style=\" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\">from</p>\n"
"<p style=\" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\"> semesterapparat</p>\n"
"<p style=\" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\"> INNER JOIN prof ON semesterapparat.prof_id = prof.id</p>\n"
"<p style=\" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\">WHERE</p>\n"
"<p style=\" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\"> (erstellsemester = \'SoSe 25\'</p>\n"
"<p style=\" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\"> OR erstellsemester = \'WiSe 24/25\')</p>\n"
"<p style=\" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\"> and semesterapparat.deletion_status = 0</p></body></html>"))
self.manualCheck.setText(_translate("Dialog", "Anfragen und anzeigen"))
item = self.tableWidget.horizontalHeaderItem(1)
item.setText(_translate("Dialog", "Name"))
self.toolBox.setItemText(self.toolBox.indexOf(self.page_2), _translate("Dialog", "Semesterapparatsschilder"))

152
src/ui/dialogs/docuprint.py Normal file
View File

@@ -0,0 +1,152 @@
from .dialog_sources.documentprint_ui import Ui_Dialog
from PyQt6 import QtWidgets, QtCore
from src import Icon
from src.utils.richtext import SemapSchilder, SemesterDocument
from src.backend import Semester, Database
from natsort import natsorted
class DocumentPrintDialog(QtWidgets.QDialog, Ui_Dialog):
def __init__(self, parent=None):
super().__init__(parent)
self.setupUi(self)
self.setWindowIcon(Icon("print").icon)
self.frame.hide()
self.semester = Semester()
self.db = Database()
self.insert_table_data()
self.expertMode.clicked.connect(self.enable_expert_mode)
# Ensure the signal is connected only once
try:
self.pushButton_2.clicked.disconnect()
except TypeError:
pass # Signal was not connected before
self.pushButton_2.clicked.connect(self.on_pushButton_2_clicked)
try:
self.pushButton.clicked.disconnect()
except TypeError:
pass
self.pushButton.clicked.connect(self.on_pushButton_clicked)
try:
self.btn_load_current_apparats.clicked.disconnect()
except TypeError:
pass
self.btn_load_current_apparats.clicked.connect(self.load_current_clicked)
try:
self.manualCheck.clicked.disconnect()
except TypeError:
pass
self.manualCheck.clicked.connect(self.manual_request)
def manual_request(self):
self.tableWidget.setRowCount(0)
request_text = self.textBrowser.toPlainText()
data = self.db.query_db(request_text)
apparats: list[str] = []
if not data:
self.tableWidget.setRowCount(0)
return
for row in data:
apparats.append(f"{row[1]} ({row[0]})")
self.tableWidget.setHorizontalHeaderLabels(["", "Semesterapparat"])
self.tableWidget.setColumnWidth(0, 50)
for entry in apparats:
# insert the entry, column 1 should be a checkbox, column 2 the data
self.tableWidget.insertRow(0)
self.tableWidget.setItem(0, 0, QtWidgets.QTableWidgetItem(""))
checkbox = QtWidgets.QCheckBox()
self.tableWidget.setCellWidget(0, 0, checkbox)
self.tableWidget.setItem(0, 1, QtWidgets.QTableWidgetItem(entry))
# align row 0 column 0 to center
def load_current_clicked(self):
entries = self.get_valid_apparats_for_signs()
self.tableWidget.setHorizontalHeaderLabels(["", "Semesterapparat"])
self.tableWidget.setColumnWidth(0, 50)
self.tableWidget.setRowCount(0)
for entry in entries:
# insert the entry, column 1 should be a checkbox, column 2 the data
self.tableWidget.insertRow(0)
self.tableWidget.setItem(0, 0, QtWidgets.QTableWidgetItem(""))
checkbox = QtWidgets.QCheckBox()
self.tableWidget.setCellWidget(0, 0, checkbox)
self.tableWidget.setItem(0, 1, QtWidgets.QTableWidgetItem(entry))
def enable_expert_mode(self):
# if self.exportMode.
if self.expertMode.isChecked():
self.frame.show()
self.expertMode.setText("Expertenmodus deaktivieren")
else:
self.frame.hide()
self.expertMode.setText("Expertenmodus aktivieren")
def on_pushButton_2_clicked(self):
# get the checked items from the table
checked_items = []
for i in range(self.tableWidget.rowCount()):
checkbox = self.tableWidget.cellWidget(i, 0)
if isinstance(checkbox, QtWidgets.QCheckBox) and checkbox.isChecked():
item = self.tableWidget.item(i, 1)
if item is not None:
checked_items.append(item.text())
document = SemapSchilder(checked_items)
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)
for app in apps:
prof = self.db.getProfById(app[2])
data = (app[4], f"{prof.lastname} ({app[1]})")
apparats.append(data)
semapDocument = SemesterDocument(
semester=self.semester.value,
filename="Semesterapparat",
full=True,
apparats=apparats,
)
def insert_table_data(self):
entries = self.get_valid_apparats_for_signs()
self.tableWidget.setHorizontalHeaderLabels(["", "Semesterapparat"])
self.tableWidget.setColumnWidth(0, 50)
for entry in entries:
# insert the entry, column 1 should be a checkbox, column 2 the data
self.tableWidget.insertRow(0)
self.tableWidget.setItem(0, 0, QtWidgets.QTableWidgetItem(""))
checkbox = QtWidgets.QCheckBox()
self.tableWidget.setCellWidget(0, 0, checkbox)
self.tableWidget.setItem(0, 1, QtWidgets.QTableWidgetItem(entry))
# align row 0 column 0 to center
def get_valid_apparats_for_signs(self):
this_sem = self.db.query_db(
query="SELECT prof.lname, semesterapparat.name from semesterapparat INNER JOIN prof ON semesterapparat.prof_id = prof.id WHERE (erstellsemester = ? OR erstellsemester = ?) AND semesterapparat.deletion_status=0",
args=(str(self.semester.value), str(self.semester.previous)),
)
apparats: list[str] = []
for row in this_sem:
apparats.append(f"{row[0]} ({row[1]})")
return apparats
def launch():
app = QtWidgets.QApplication([])
dialog = DocumentPrintDialog()
dialog.show()
app.exec()

View File

@@ -13,7 +13,7 @@ from PyQt6 import QtCore, QtGui, QtWidgets
from PyQt6.QtCore import QThread
from PyQt6.QtGui import QRegularExpressionValidator
from src import Icon, settings
from src import Icon
from src.backend import Database, BookGrabber, AvailChecker, DocumentationThread
from src.backend.semester import Semester
from src.backend.create_file import recreateFile
@@ -41,6 +41,8 @@ from src.ui.dialogs import (
login_ui,
parsed_titles_ui,
reminder_ui,
DocumentPrintDialog,
launch,
)
from src.ui.widgets import (
ElsaDialog,
@@ -52,7 +54,7 @@ from src.ui.widgets import (
EditUser,
EditProf,
)
from src.utils import SemesterDocument
from datetime import datetime
from loguru import logger as log
@@ -259,35 +261,10 @@ class Ui(Ui_Semesterapparat):
self.valid_check_semester.clicked.connect(self.display_valid_semester) # type:ignore
def create_doc(self):
result = self.confirm_popup(
"Mit dem Klick auf Okay wird eine Übersicht aller aktiven Semesterapparate erstellt und an den FollowME Drucker gesendet. Es kann bis zu 10 Minuten dauern, bis das document im Drucker angezeigt wird",
"document erstellen?",
)
logger.debug(f"Result: {result}")
if result == 1:
# logger.debug("Creating document")
apparats = self.apparats
apps = []
for apparat in apparats:
prof = self.db.getProf(apparat[2])
data = (apparat[4], f"{prof.lastname} ({apparat[1]})")
apps.append(data)
# logger.debug(apps)
logger.info("Using apparats: {}", apps)
doc = SemesterDocument(
semester=Semester().value,
filename="Semesterapparate",
apparats=apps,
full=True,
config=settings,
)
# doc.make_document()
# doc.create_pdf()
# doc.print_document()
# doc.cleanup()
# logger.info("Document created and sent to printer")
# kill thread after execution done
logger.debug("Creating document")
# open DocumentPrintDialog
dialog = DocumentPrintDialog(self.MainWindow)
dialog.show()
def checkValidInput(self):
if valid_input == (1, 1, 1, 1, 1, 1):
@@ -812,7 +789,8 @@ class Ui(Ui_Semesterapparat):
self.tableWidget_apparat_media.currentRow(), 1
).text()
]
items = len(links)
# get the number of selected rows from the table
items = self.tableWidget_apparat_media.rowCount()
self.label_20.setText("Verfügbarkeit wird geprüft, bitte warten...")
self.label_20.show()
self.avail_status.setText(f"0/{items}")
@@ -1109,7 +1087,7 @@ class Ui(Ui_Semesterapparat):
self.update_app_media_list()
# #logger.debug(len(signatures))
def extract_document_data(self) -> Union[None, list[str], SemapDocument]:
def extract_document_data(self) -> Union[list[str], SemapDocument]:
file_type = self.document_list.item(self.document_list.currentRow(), 1).text()
file_location = self.document_list.item(
self.document_list.currentRow(), 3
@@ -1119,15 +1097,11 @@ class Ui(Ui_Semesterapparat):
logger.info("File selected: {}, {}", file_name, file_location)
if file_location == "Database":
# create warning, then return
self.confirm_popup(
"Dateien aus der Datenbank werden nicht unterstützt!",
title="Fehler",
)
return None
self.db.recreateFile(file_name, self.active_apparat, filetype=file_type)
if file_type == "pdf":
# Todo: implement parser here
self.confirm_popup("PDF Dateien werden nicht unterstützt!", title="Fehler")
return
return [""]
if file_type == "csv":
signatures = csv_to_list(file)
# add the data to the database
@@ -1151,8 +1125,14 @@ class Ui(Ui_Semesterapparat):
self.prof_tel_nr.setText(str(data.phoneNumber))
self.app_name.setText(data.title)
self.app_fach.setCurrentText(data.subject)
self.prof_title.setText(data.personTitle)
self.drpdwn_prof_name.setCurrentText(data.personName)
self.sem_year.setText("20" + data.semester.year)
def btn_check_file_threaded(self):
for runner in self.bookGrabber:
if not runner.isRunning():
runner.deleteLater()
# #logger.debug("Checking file")
# get active app_id and prof_id
self.tableWidget_apparate.setEnabled(False)
@@ -1224,7 +1204,6 @@ class Ui(Ui_Semesterapparat):
autoGrabber.start()
self.bookGrabber.append(autoGrabber)
# refresh book table
logger.debug("Finished adding media")
# end of thread
# self.autoGrabber.exit()
# self.__clear_fields()
@@ -1434,7 +1413,7 @@ class Ui(Ui_Semesterapparat):
reminder.exec()
tableposition = self.tableWidget_apparate.currentRow()
appnr = self.tableWidget_apparate.item(tableposition, 0).text()
if reminder.result() == QtWidgets.QDialogger.DialogCode.Accepted:
if reminder.result() == QtWidgets.QDialog.DialogCode.Accepted:
data = reminder.return_message()
# #logger.debug(data)
self.db.addMessage(
@@ -1473,7 +1452,7 @@ class Ui(Ui_Semesterapparat):
settingsUI = Settings(self.active_user)
settingsUI.exec()
if settingsUI.result() == QtWidgets.QDialogger.DialogCode.Accepted:
if settingsUI.result() == QtWidgets.QDialog.DialogCode.Accepted:
settingsUI.save()
# logger.debug(settings.dict())
@@ -1563,7 +1542,7 @@ class Ui(Ui_Semesterapparat):
self.confirm_popup("Keine weiteren Apparate vorhanden", title="Fehler")
return (None, None)
dialog = QtWidgets.QDialog()
dialogger.setWindowTitle(title)
dialog.setWindowTitle(title)
# add a label to the dialog
label = QtWidgets.QLabel()
label.setText(message)
@@ -1626,7 +1605,7 @@ class Ui(Ui_Semesterapparat):
widget.setWindowTitle("Metadaten")
bookedit.populate_fields(data)
widget.exec()
if widget.result() == QtWidgets.QDialogger.DialogCode.Accepted:
if widget.result() == QtWidgets.QDialog.DialogCode.Accepted:
data = bookedit.get_data()
# #logger.debug(data)
self.db.updateBookdata(bookdata=data, book_id=book_id)
@@ -1685,7 +1664,7 @@ class Ui(Ui_Semesterapparat):
framework = ApparatExtendDialog()
framework.exec()
# return data from dialog if ok is pressed
if framework.result() == QtWidgets.QDialogger.DialogCode.Accepted:
if framework.result() == QtWidgets.QDialog.DialogCode.Accepted:
data = framework.get_data()
# #logger.debug(data)
# return data

View File

@@ -1,5 +1,4 @@
import os
from natsort import natsorted
from .widget_sources.Ui_elsa_maindialog import Ui_Dialog
from PyQt6 import QtCore, QtWidgets, QtGui
from PyQt6.QtGui import QRegularExpressionValidator
@@ -9,9 +8,11 @@ from src.backend import Semester, Database
from src.logic import elsa_word_to_csv, Prof
from src.ui.dialogs import ElsaAddEntry, popus_confirm
from src.ui.widgets import FilePicker, DataGraph
from src.backend import recreateElsaFile
import sys
from loguru import logger as log
logger = log
logger.remove()
logger.add("logs/application.log", rotation="1 week", enqueue=True)
@@ -232,11 +233,11 @@ class ElsaDialog(QtWidgets.QDialog, Ui_Dialog):
lastname=prof.split(", ")[0],
mail=self.newProf_mail.text(),
telnr=self.newProf_telnr.text(),
title=self.newProf_title.text(),
_title=self.newProf_title.text(),
fullname=f"{prof.split(', ')[0]} {prof.split(', ')[1]}",
)
prof_id = self.db.getProfId(profdata)
logger.debug(profdata, prof_id)
logger.debug(f"ProfData: {profdata}, id:{prof_id}")
if prof_id is None:
self.db.createProf(profdata)
@@ -411,10 +412,7 @@ class ElsaDialog(QtWidgets.QDialog, Ui_Dialog):
self.elsa_date.text(),
)
logger.debug(
elsa_id,
self.elsa_prof.currentText(),
self.elsa_semester.text(),
self.elsa_date.text(),
f"elsa_id: {elsa_id}, prof: {self.elsa_prof.currentText()}, semester: {self.elsa_semester.text()}, date: {self.elsa_date.text()}"
)
for row in data:
if self.seperateEntries.isChecked():
@@ -450,7 +448,7 @@ class ElsaDialog(QtWidgets.QDialog, Ui_Dialog):
logger.debug("No tab to remove")
self.elsa_table.setRowCount(0)
elsa_apparats = self.db.getElsaApparats()
elsa_apparats = natsorted(elsa_apparats, key=lambda x: x[2], reverse=True)
# elsa_apparats = natsorted(elsa_apparats, key=lambda x: x[2], reverse=True)
# x = semester, y = number of apparats
for apparat in elsa_apparats:
@@ -463,13 +461,13 @@ class ElsaDialog(QtWidgets.QDialog, Ui_Dialog):
else:
index = self.graph_data["x"].index(semester)
self.graph_data["y"][index] += number
generateMissing = True if len(self.graph_data["x"]) > 1 else False
self.graph_data["x"].pop(0)
self.graph_data["y"].pop(0)
# generateMissing = True if len(self.graph_data["x"]) > 2 else False
graph = DataGraph(
"ELSA Apparate pro Semester",
self.graph_data,
generateMissing,
"Anzahl der Apparate",
title="ELSA Apparate pro Semester",
data=self.graph_data,
label="Anzahl der Apparate",
)
logger.debug(self.graph_data)
self.elsa_statistics_table.setRowCount(0)

View File

@@ -3,6 +3,18 @@ from typing import Union
import pyqtgraph as pg
from PyQt6 import QtWidgets
import sys
from loguru import logger as log
logger = log
logger.remove()
logger.add("logs/application.log", rotation="1 week", enqueue=True)
log.add(
"logs/graph.log",
)
# logger.add(sys.stderr, format="{time} {level} {message}", level="INFO")
logger.add(sys.stdout)
def mergedicts(d1, d2):
@@ -31,7 +43,11 @@ class DataGraph(QtWidgets.QWidget):
label=None,
):
super().__init__()
logger.debug(
"Initialized with options: {}, {}, {}, {}".format(
title, data, generateMissing, label
)
)
lst = []
if generateMissing:
x_data = data["x"]
@@ -142,20 +158,10 @@ if __name__ == "__main__":
import sys
app = QtWidgets.QApplication(sys.argv)
data_1 = {
"x": ["SoSe 10", "WiSe 10/11", "SoSe 11", "SoSe 14"],
"y": {
"Added": [1, 2, 3, 4],
"Deleted": [4, 3, 2, 1],
},
}
data_2 = {
"x": ["SoSe 10"],
"y": [2],
}
graph_data = {"x": ["SoSe 24"], "y": [1]}
graph_data = {"x": ["WiSe 25/26", "WiSe 24/25", "SoSe 25"], "y": [1, 2, 1]}
widget = DataGraph(
"ELSA Apparate pro Semester", data_2, True, "Anzahl der Apparate"
"ELSA Apparate pro Semester", graph_data, True, "Anzahl der Apparate"
)
widget.show()
sys.exit(app.exec())

View File

@@ -493,7 +493,7 @@ class SearchStatisticPage(QtWidgets.QDialog, Ui_Dialog):
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:
if int(app.deleted) == 1:
for j in range(5):
self.tableWidget.item(0, j).setBackground(
QtGui.QColor(235, 74, 71)