diff --git a/agents.md b/agents.md index bee14c3..d55c8a1 100644 --- a/agents.md +++ b/agents.md @@ -1,2 +1,5 @@ # PySide6-GUI - - Beim Erstellen neuer Dialoge sollte immer eine passende UI-Datei erstellt und die daraus generierte .py-Datei in den Code eingebunden und genutzt werden. Dadurch soll der Entwickler den neuen Dialog gestalten können. \ No newline at end of file + - Beim Erstellen neuer Dialoge sollte stets eine passende UI-Datei erstellt werden. + - Der Entwickler soll den neuen Dialog später über die UI-Datei gestalten können. + - Die UI-Datei wird in Visual Studio Code durch eine Erweiterung automatisch als .py-Datei generiert. + - Die automatisch generierte .py-Datei muss in den Code eingebunden und genutzt werden. \ No newline at end of file diff --git a/src/conf.py b/src/conf.py index b484908..da0d8b9 100644 --- a/src/conf.py +++ b/src/conf.py @@ -57,6 +57,17 @@ class XslDir(BaseModel): path_to_root_dir: Path +class PostgreSqlDb(BaseModel): + id: int + name: str + host: str + port: int = 5432 + database: str + username: str + password: str + ssl_mode: str = "prefer" # disable, allow, prefer, require, verify-ca, verify-full + + class PdfProject(BaseModel): id: int name: str @@ -106,6 +117,7 @@ class AppSettings(BaseSettings): apache_fops: list[ApacheFop] = [] xsl_dirs: list[XslDir] = [] pdf_projects: list[PdfProject] = [] + postgresql_dbs: list[PostgreSqlDb] = [] theme: str | None = None model_config = SettingsConfigDict(json_file=config_path) @@ -166,6 +178,3 @@ class PdfProjectSettings(BaseModel): def writeSettings(self, project_dir: Path): with open(project_dir / "project.yaml", "w", encoding="utf8") as f: f.write(to_yaml_str(self)) - - - diff --git a/src/ui/AppSettings.py b/src/ui/AppSettings.py index e25da29..e4cc8bc 100644 --- a/src/ui/AppSettings.py +++ b/src/ui/AppSettings.py @@ -8,8 +8,9 @@ from ui.DiffPdfConfigDialog import DiffPdfConfigDialog from ui.SaxonJarConfigDialog import SaxonJarConfigDialog from ui.ApacheFopConfigDialog import ApacheFopConfigDialog from ui.XslDirConfigDialog import XslDirConfigDialog +from ui.PostgreSqlConfigDialog import PostgreSqlConfigDialog from ui.PdfProject import PdfProjectDlg -from conf import AppSettings, JavaVm, DiffPdf, SaxonJar, ApacheFop, XslDir, PdfProject +from conf import AppSettings, JavaVm, DiffPdf, SaxonJar, ApacheFop, XslDir, PdfProject, PostgreSqlDb class AppSettingsDlg(QDialog): diff --git a/src/ui/AppSettings.ui b/src/ui/AppSettings.ui index 287c40a..ad57802 100644 --- a/src/ui/AppSettings.ui +++ b/src/ui/AppSettings.ui @@ -448,6 +448,78 @@ + + + PostgreSQL + + + + + + 5 + + + + + + + + + + + + + 0 + 0 + + + + QFrame::Shape::NoFrame + + + QFrame::Shadow::Raised + + + + 0 + + + 0 + + + 0 + + + 0 + + + + + Hinzufügen + + + + + + + + + + false + + + Entfernen + + + + + + + + + + + diff --git a/src/ui/AppSettings_ui.py b/src/ui/AppSettings_ui.py index ea0c5e5..025f68c 100644 --- a/src/ui/AppSettings_ui.py +++ b/src/ui/AppSettings_ui.py @@ -264,6 +264,44 @@ class Ui_Dialog(object): self.verticalLayout_7.addWidget(self.frame_6) self.tabSettings.addTab(self.tabPdfProject, "") + self.tabPostgreSql = QWidget() + self.tabPostgreSql.setObjectName(u"tabPostgreSql") + self.verticalLayout_8 = QVBoxLayout(self.tabPostgreSql) + self.verticalLayout_8.setObjectName(u"verticalLayout_8") + self.tablePostgreSqlDbs = QTableWidget(self.tabPostgreSql) + if (self.tablePostgreSqlDbs.columnCount() < 5): + self.tablePostgreSqlDbs.setColumnCount(5) + self.tablePostgreSqlDbs.setObjectName(u"tablePostgreSqlDbs") + self.tablePostgreSqlDbs.setColumnCount(5) + + self.verticalLayout_8.addWidget(self.tablePostgreSqlDbs) + + self.frame_7 = QFrame(self.tabPostgreSql) + self.frame_7.setObjectName(u"frame_7") + sizePolicy.setHeightForWidth(self.frame_7.sizePolicy().hasHeightForWidth()) + self.frame_7.setSizePolicy(sizePolicy) + self.frame_7.setFrameShape(QFrame.Shape.NoFrame) + self.frame_7.setFrameShadow(QFrame.Shadow.Raised) + self.horizontalLayout_7 = QHBoxLayout(self.frame_7) + self.horizontalLayout_7.setObjectName(u"horizontalLayout_7") + self.horizontalLayout_7.setContentsMargins(0, 0, 0, 0) + self.addPostgreSql = QPushButton(self.frame_7) + self.addPostgreSql.setObjectName(u"addPostgreSql") + self.addPostgreSql.setIcon(icon) + + self.horizontalLayout_7.addWidget(self.addPostgreSql) + + self.removePostgreSql = QPushButton(self.frame_7) + self.removePostgreSql.setObjectName(u"removePostgreSql") + self.removePostgreSql.setEnabled(False) + self.removePostgreSql.setIcon(icon1) + + self.horizontalLayout_7.addWidget(self.removePostgreSql) + + + self.verticalLayout_8.addWidget(self.frame_7) + + self.tabSettings.addTab(self.tabPostgreSql, "") self.verticalLayout.addWidget(self.tabSettings) @@ -306,5 +344,8 @@ class Ui_Dialog(object): self.addProject.setText(QCoreApplication.translate("Dialog", u"Hinzuf\u00fcgen", None)) self.removeProject.setText(QCoreApplication.translate("Dialog", u"Entfernen", None)) self.tabSettings.setTabText(self.tabSettings.indexOf(self.tabPdfProject), QCoreApplication.translate("Dialog", u"PDF-Projekte", None)) + self.addPostgreSql.setText(QCoreApplication.translate("Dialog", u"Hinzuf\u00fcgen", None)) + self.removePostgreSql.setText(QCoreApplication.translate("Dialog", u"Entfernen", None)) + self.tabSettings.setTabText(self.tabSettings.indexOf(self.tabPostgreSql), QCoreApplication.translate("Dialog", u"PostgreSQL", None)) # retranslateUi diff --git a/src/ui/PostgreSqlConfigDialog.py b/src/ui/PostgreSqlConfigDialog.py new file mode 100644 index 0000000..66ade69 --- /dev/null +++ b/src/ui/PostgreSqlConfigDialog.py @@ -0,0 +1,63 @@ +from PySide6.QtWidgets import QDialog, QMessageBox + +from ui.PostgreSqlConfigDialog_ui import Ui_PostgreSqlConfigDialog + + +class PostgreSqlConfigDialog(QDialog): + """Dialog zur Konfiguration einer PostgreSQL-Datenbank ohne ID.""" + + def __init__(self, parent=None): + super().__init__(parent) + + # UI einrichten + self.ui = Ui_PostgreSqlConfigDialog() + self.ui.setupUi(self) + + # SSL-Modus auf "prefer" setzen (Standard) + self.ui.sslModeComboBox.setCurrentText("prefer") + + # Signale verbinden + self.ui.testConnectionButton.clicked.connect(self.test_connection) + + def test_connection(self): + """Testet die Datenbankverbindung.""" + # Hier könnte eine echte Verbindung getestet werden + # Für jetzt zeigen wir nur eine Info-Nachricht + QMessageBox.information( + self, + "Verbindungstest", + "Verbindungstest-Funktionalität noch nicht implementiert.\n" + "Die Eingaben werden gespeichert, wenn Sie auf OK klicken." + ) + + def set_data(self, data): + """Setzt die Daten in den Dialog.""" + if data: + self.ui.nameEdit.setText(data.get("name", "")) + self.ui.hostEdit.setText(data.get("host", "localhost")) + self.ui.portSpinBox.setValue(data.get("port", 5432)) + self.ui.databaseEdit.setText(data.get("database", "")) + self.ui.usernameEdit.setText(data.get("username", "")) + self.ui.passwordEdit.setText(data.get("password", "")) + self.ui.sslModeComboBox.setCurrentText(data.get("ssl_mode", "prefer")) + + def get_data(self): + """Gibt die eingegebenen Daten zurück.""" + if not self.ui.nameEdit.text().strip(): + return None + if not self.ui.hostEdit.text().strip(): + return None + if not self.ui.databaseEdit.text().strip(): + return None + if not self.ui.usernameEdit.text().strip(): + return None + + return { + "name": self.ui.nameEdit.text().strip(), + "host": self.ui.hostEdit.text().strip(), + "port": self.ui.portSpinBox.value(), + "database": self.ui.databaseEdit.text().strip(), + "username": self.ui.usernameEdit.text().strip(), + "password": self.ui.passwordEdit.text(), # Passwort kann leer sein + "ssl_mode": self.ui.sslModeComboBox.currentText(), + } diff --git a/src/ui/PostgreSqlConfigDialog.ui b/src/ui/PostgreSqlConfigDialog.ui new file mode 100644 index 0000000..20fdafe --- /dev/null +++ b/src/ui/PostgreSqlConfigDialog.ui @@ -0,0 +1,200 @@ + + + PostgreSqlConfigDialog + + + + 0 + 0 + 397 + 268 + + + + PostgreSQL Datenbank Konfiguration + + + true + + + + + + + + Name: + + + + + + + + + + Host: + + + + + + + localhost + + + + + + + Port: + + + + + + + 1 + + + 65535 + + + 5432 + + + + + + + Datenbank: + + + + + + + + + + Benutzername: + + + + + + + + + + Passwort: + + + + + + + QLineEdit::EchoMode::Password + + + + + + + SSL-Modus: + + + + + + + + disable + + + + + allow + + + + + prefer + + + + + require + + + + + verify-ca + + + + + verify-full + + + + + + + + Verbindung testen + + + + + + + + + Qt::Orientation::Horizontal + + + QDialogButtonBox::StandardButton::Cancel|QDialogButtonBox::StandardButton::Ok + + + true + + + + + + + + + buttonBox + accepted() + PostgreSqlConfigDialog + accept() + + + 248 + 254 + + + 157 + 274 + + + + + buttonBox + rejected() + PostgreSqlConfigDialog + reject() + + + 316 + 260 + + + 286 + 274 + + + + + diff --git a/src/ui/PostgreSqlConfigDialog_ui.py b/src/ui/PostgreSqlConfigDialog_ui.py new file mode 100644 index 0000000..0443022 --- /dev/null +++ b/src/ui/PostgreSqlConfigDialog_ui.py @@ -0,0 +1,156 @@ +# -*- coding: utf-8 -*- + +################################################################################ +## Form generated from reading UI file 'PostgreSqlConfigDialog.ui' +## +## Created by: Qt User Interface Compiler version 6.9.1 +## +## WARNING! All changes made in this file will be lost when recompiling UI file! +################################################################################ + +from PySide6.QtCore import (QCoreApplication, QDate, QDateTime, QLocale, + QMetaObject, QObject, QPoint, QRect, + QSize, QTime, QUrl, Qt) +from PySide6.QtGui import (QBrush, QColor, QConicalGradient, QCursor, + QFont, QFontDatabase, QGradient, QIcon, + QImage, QKeySequence, QLinearGradient, QPainter, + QPalette, QPixmap, QRadialGradient, QTransform) +from PySide6.QtWidgets import (QAbstractButton, QApplication, QComboBox, QDialog, + QDialogButtonBox, QFormLayout, QLabel, QLineEdit, + QPushButton, QSizePolicy, QSpinBox, QVBoxLayout, + QWidget) + +class Ui_PostgreSqlConfigDialog(object): + def setupUi(self, PostgreSqlConfigDialog): + if not PostgreSqlConfigDialog.objectName(): + PostgreSqlConfigDialog.setObjectName(u"PostgreSqlConfigDialog") + PostgreSqlConfigDialog.resize(397, 268) + PostgreSqlConfigDialog.setModal(True) + self.verticalLayout = QVBoxLayout(PostgreSqlConfigDialog) + self.verticalLayout.setObjectName(u"verticalLayout") + self.formLayout = QFormLayout() + self.formLayout.setObjectName(u"formLayout") + self.nameLabel = QLabel(PostgreSqlConfigDialog) + self.nameLabel.setObjectName(u"nameLabel") + + self.formLayout.setWidget(0, QFormLayout.ItemRole.LabelRole, self.nameLabel) + + self.nameEdit = QLineEdit(PostgreSqlConfigDialog) + self.nameEdit.setObjectName(u"nameEdit") + + self.formLayout.setWidget(0, QFormLayout.ItemRole.FieldRole, self.nameEdit) + + self.hostLabel = QLabel(PostgreSqlConfigDialog) + self.hostLabel.setObjectName(u"hostLabel") + + self.formLayout.setWidget(1, QFormLayout.ItemRole.LabelRole, self.hostLabel) + + self.hostEdit = QLineEdit(PostgreSqlConfigDialog) + self.hostEdit.setObjectName(u"hostEdit") + + self.formLayout.setWidget(1, QFormLayout.ItemRole.FieldRole, self.hostEdit) + + self.portLabel = QLabel(PostgreSqlConfigDialog) + self.portLabel.setObjectName(u"portLabel") + + self.formLayout.setWidget(2, QFormLayout.ItemRole.LabelRole, self.portLabel) + + self.portSpinBox = QSpinBox(PostgreSqlConfigDialog) + self.portSpinBox.setObjectName(u"portSpinBox") + self.portSpinBox.setMinimum(1) + self.portSpinBox.setMaximum(65535) + self.portSpinBox.setValue(5432) + + self.formLayout.setWidget(2, QFormLayout.ItemRole.FieldRole, self.portSpinBox) + + self.databaseLabel = QLabel(PostgreSqlConfigDialog) + self.databaseLabel.setObjectName(u"databaseLabel") + + self.formLayout.setWidget(3, QFormLayout.ItemRole.LabelRole, self.databaseLabel) + + self.databaseEdit = QLineEdit(PostgreSqlConfigDialog) + self.databaseEdit.setObjectName(u"databaseEdit") + + self.formLayout.setWidget(3, QFormLayout.ItemRole.FieldRole, self.databaseEdit) + + self.usernameLabel = QLabel(PostgreSqlConfigDialog) + self.usernameLabel.setObjectName(u"usernameLabel") + + self.formLayout.setWidget(4, QFormLayout.ItemRole.LabelRole, self.usernameLabel) + + self.usernameEdit = QLineEdit(PostgreSqlConfigDialog) + self.usernameEdit.setObjectName(u"usernameEdit") + + self.formLayout.setWidget(4, QFormLayout.ItemRole.FieldRole, self.usernameEdit) + + self.passwordLabel = QLabel(PostgreSqlConfigDialog) + self.passwordLabel.setObjectName(u"passwordLabel") + + self.formLayout.setWidget(5, QFormLayout.ItemRole.LabelRole, self.passwordLabel) + + self.passwordEdit = QLineEdit(PostgreSqlConfigDialog) + self.passwordEdit.setObjectName(u"passwordEdit") + self.passwordEdit.setEchoMode(QLineEdit.EchoMode.Password) + + self.formLayout.setWidget(5, QFormLayout.ItemRole.FieldRole, self.passwordEdit) + + self.sslModeLabel = QLabel(PostgreSqlConfigDialog) + self.sslModeLabel.setObjectName(u"sslModeLabel") + + self.formLayout.setWidget(6, QFormLayout.ItemRole.LabelRole, self.sslModeLabel) + + self.sslModeComboBox = QComboBox(PostgreSqlConfigDialog) + self.sslModeComboBox.addItem("") + self.sslModeComboBox.addItem("") + self.sslModeComboBox.addItem("") + self.sslModeComboBox.addItem("") + self.sslModeComboBox.addItem("") + self.sslModeComboBox.addItem("") + self.sslModeComboBox.setObjectName(u"sslModeComboBox") + + self.formLayout.setWidget(6, QFormLayout.ItemRole.FieldRole, self.sslModeComboBox) + + self.testConnectionButton = QPushButton(PostgreSqlConfigDialog) + self.testConnectionButton.setObjectName(u"testConnectionButton") + + self.formLayout.setWidget(7, QFormLayout.ItemRole.FieldRole, self.testConnectionButton) + + + self.verticalLayout.addLayout(self.formLayout) + + self.buttonBox = QDialogButtonBox(PostgreSqlConfigDialog) + self.buttonBox.setObjectName(u"buttonBox") + self.buttonBox.setOrientation(Qt.Orientation.Horizontal) + self.buttonBox.setStandardButtons(QDialogButtonBox.StandardButton.Cancel|QDialogButtonBox.StandardButton.Ok) + self.buttonBox.setCenterButtons(True) + + self.verticalLayout.addWidget(self.buttonBox) + + + self.retranslateUi(PostgreSqlConfigDialog) + self.buttonBox.accepted.connect(PostgreSqlConfigDialog.accept) + self.buttonBox.rejected.connect(PostgreSqlConfigDialog.reject) + + QMetaObject.connectSlotsByName(PostgreSqlConfigDialog) + # setupUi + + def retranslateUi(self, PostgreSqlConfigDialog): + PostgreSqlConfigDialog.setWindowTitle(QCoreApplication.translate("PostgreSqlConfigDialog", u"PostgreSQL Datenbank Konfiguration", None)) + self.nameLabel.setText(QCoreApplication.translate("PostgreSqlConfigDialog", u"Name:", None)) + self.hostLabel.setText(QCoreApplication.translate("PostgreSqlConfigDialog", u"Host:", None)) + self.hostEdit.setText(QCoreApplication.translate("PostgreSqlConfigDialog", u"localhost", None)) + self.portLabel.setText(QCoreApplication.translate("PostgreSqlConfigDialog", u"Port:", None)) + self.databaseLabel.setText(QCoreApplication.translate("PostgreSqlConfigDialog", u"Datenbank:", None)) + self.usernameLabel.setText(QCoreApplication.translate("PostgreSqlConfigDialog", u"Benutzername:", None)) + self.passwordLabel.setText(QCoreApplication.translate("PostgreSqlConfigDialog", u"Passwort:", None)) + self.sslModeLabel.setText(QCoreApplication.translate("PostgreSqlConfigDialog", u"SSL-Modus:", None)) + self.sslModeComboBox.setItemText(0, QCoreApplication.translate("PostgreSqlConfigDialog", u"disable", None)) + self.sslModeComboBox.setItemText(1, QCoreApplication.translate("PostgreSqlConfigDialog", u"allow", None)) + self.sslModeComboBox.setItemText(2, QCoreApplication.translate("PostgreSqlConfigDialog", u"prefer", None)) + self.sslModeComboBox.setItemText(3, QCoreApplication.translate("PostgreSqlConfigDialog", u"require", None)) + self.sslModeComboBox.setItemText(4, QCoreApplication.translate("PostgreSqlConfigDialog", u"verify-ca", None)) + self.sslModeComboBox.setItemText(5, QCoreApplication.translate("PostgreSqlConfigDialog", u"verify-full", None)) + + self.testConnectionButton.setText(QCoreApplication.translate("PostgreSqlConfigDialog", u"Verbindung testen", None)) + # retranslateUi +