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
+