Dialoge für PostgreSQL erstellt

This commit is contained in:
2025-06-22 18:12:27 +02:00
parent b8441d1ab4
commit b226be4e4e
8 changed files with 550 additions and 5 deletions
+4 -1
View File
@@ -1,2 +1,5 @@
# PySide6-GUI # 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. - 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.
+12 -3
View File
@@ -57,6 +57,17 @@ class XslDir(BaseModel):
path_to_root_dir: Path 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): class PdfProject(BaseModel):
id: int id: int
name: str name: str
@@ -106,6 +117,7 @@ class AppSettings(BaseSettings):
apache_fops: list[ApacheFop] = [] apache_fops: list[ApacheFop] = []
xsl_dirs: list[XslDir] = [] xsl_dirs: list[XslDir] = []
pdf_projects: list[PdfProject] = [] pdf_projects: list[PdfProject] = []
postgresql_dbs: list[PostgreSqlDb] = []
theme: str | None = None theme: str | None = None
model_config = SettingsConfigDict(json_file=config_path) model_config = SettingsConfigDict(json_file=config_path)
@@ -166,6 +178,3 @@ class PdfProjectSettings(BaseModel):
def writeSettings(self, project_dir: Path): def writeSettings(self, project_dir: Path):
with open(project_dir / "project.yaml", "w", encoding="utf8") as f: with open(project_dir / "project.yaml", "w", encoding="utf8") as f:
f.write(to_yaml_str(self)) f.write(to_yaml_str(self))
+2 -1
View File
@@ -8,8 +8,9 @@ from ui.DiffPdfConfigDialog import DiffPdfConfigDialog
from ui.SaxonJarConfigDialog import SaxonJarConfigDialog from ui.SaxonJarConfigDialog import SaxonJarConfigDialog
from ui.ApacheFopConfigDialog import ApacheFopConfigDialog from ui.ApacheFopConfigDialog import ApacheFopConfigDialog
from ui.XslDirConfigDialog import XslDirConfigDialog from ui.XslDirConfigDialog import XslDirConfigDialog
from ui.PostgreSqlConfigDialog import PostgreSqlConfigDialog
from ui.PdfProject import PdfProjectDlg 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): class AppSettingsDlg(QDialog):
+72
View File
@@ -448,6 +448,78 @@
</item> </item>
</layout> </layout>
</widget> </widget>
<widget class="QWidget" name="tabPostgreSql">
<attribute name="title">
<string>PostgreSQL</string>
</attribute>
<layout class="QVBoxLayout" name="verticalLayout_8">
<item>
<widget class="QTableWidget" name="tablePostgreSqlDbs">
<property name="columnCount">
<number>5</number>
</property>
<column/>
<column/>
<column/>
<column/>
<column/>
</widget>
</item>
<item>
<widget class="QFrame" name="frame_7">
<property name="sizePolicy">
<sizepolicy hsizetype="Maximum" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="frameShape">
<enum>QFrame::Shape::NoFrame</enum>
</property>
<property name="frameShadow">
<enum>QFrame::Shadow::Raised</enum>
</property>
<layout class="QHBoxLayout" name="horizontalLayout_7">
<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>
<widget class="QPushButton" name="addPostgreSql">
<property name="text">
<string>Hinzufügen</string>
</property>
<property name="icon">
<iconset theme="QIcon::ThemeIcon::ListAdd"/>
</property>
</widget>
</item>
<item>
<widget class="QPushButton" name="removePostgreSql">
<property name="enabled">
<bool>false</bool>
</property>
<property name="text">
<string>Entfernen</string>
</property>
<property name="icon">
<iconset theme="QIcon::ThemeIcon::ListRemove"/>
</property>
</widget>
</item>
</layout>
</widget>
</item>
</layout>
</widget>
</widget> </widget>
</item> </item>
<item> <item>
+41
View File
@@ -264,6 +264,44 @@ class Ui_Dialog(object):
self.verticalLayout_7.addWidget(self.frame_6) self.verticalLayout_7.addWidget(self.frame_6)
self.tabSettings.addTab(self.tabPdfProject, "") 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) self.verticalLayout.addWidget(self.tabSettings)
@@ -306,5 +344,8 @@ class Ui_Dialog(object):
self.addProject.setText(QCoreApplication.translate("Dialog", u"Hinzuf\u00fcgen", None)) self.addProject.setText(QCoreApplication.translate("Dialog", u"Hinzuf\u00fcgen", None))
self.removeProject.setText(QCoreApplication.translate("Dialog", u"Entfernen", 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.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 # retranslateUi
+63
View File
@@ -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(),
}
+200
View File
@@ -0,0 +1,200 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>PostgreSqlConfigDialog</class>
<widget class="QDialog" name="PostgreSqlConfigDialog">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>397</width>
<height>268</height>
</rect>
</property>
<property name="windowTitle">
<string>PostgreSQL Datenbank Konfiguration</string>
</property>
<property name="modal">
<bool>true</bool>
</property>
<layout class="QVBoxLayout" name="verticalLayout">
<item>
<layout class="QFormLayout" name="formLayout">
<item row="0" column="0">
<widget class="QLabel" name="nameLabel">
<property name="text">
<string>Name:</string>
</property>
</widget>
</item>
<item row="0" column="1">
<widget class="QLineEdit" name="nameEdit"/>
</item>
<item row="1" column="0">
<widget class="QLabel" name="hostLabel">
<property name="text">
<string>Host:</string>
</property>
</widget>
</item>
<item row="1" column="1">
<widget class="QLineEdit" name="hostEdit">
<property name="text">
<string>localhost</string>
</property>
</widget>
</item>
<item row="2" column="0">
<widget class="QLabel" name="portLabel">
<property name="text">
<string>Port:</string>
</property>
</widget>
</item>
<item row="2" column="1">
<widget class="QSpinBox" name="portSpinBox">
<property name="minimum">
<number>1</number>
</property>
<property name="maximum">
<number>65535</number>
</property>
<property name="value">
<number>5432</number>
</property>
</widget>
</item>
<item row="3" column="0">
<widget class="QLabel" name="databaseLabel">
<property name="text">
<string>Datenbank:</string>
</property>
</widget>
</item>
<item row="3" column="1">
<widget class="QLineEdit" name="databaseEdit"/>
</item>
<item row="4" column="0">
<widget class="QLabel" name="usernameLabel">
<property name="text">
<string>Benutzername:</string>
</property>
</widget>
</item>
<item row="4" column="1">
<widget class="QLineEdit" name="usernameEdit"/>
</item>
<item row="5" column="0">
<widget class="QLabel" name="passwordLabel">
<property name="text">
<string>Passwort:</string>
</property>
</widget>
</item>
<item row="5" column="1">
<widget class="QLineEdit" name="passwordEdit">
<property name="echoMode">
<enum>QLineEdit::EchoMode::Password</enum>
</property>
</widget>
</item>
<item row="6" column="0">
<widget class="QLabel" name="sslModeLabel">
<property name="text">
<string>SSL-Modus:</string>
</property>
</widget>
</item>
<item row="6" column="1">
<widget class="QComboBox" name="sslModeComboBox">
<item>
<property name="text">
<string>disable</string>
</property>
</item>
<item>
<property name="text">
<string>allow</string>
</property>
</item>
<item>
<property name="text">
<string>prefer</string>
</property>
</item>
<item>
<property name="text">
<string>require</string>
</property>
</item>
<item>
<property name="text">
<string>verify-ca</string>
</property>
</item>
<item>
<property name="text">
<string>verify-full</string>
</property>
</item>
</widget>
</item>
<item row="7" column="1">
<widget class="QPushButton" name="testConnectionButton">
<property name="text">
<string>Verbindung testen</string>
</property>
</widget>
</item>
</layout>
</item>
<item>
<widget class="QDialogButtonBox" name="buttonBox">
<property name="orientation">
<enum>Qt::Orientation::Horizontal</enum>
</property>
<property name="standardButtons">
<set>QDialogButtonBox::StandardButton::Cancel|QDialogButtonBox::StandardButton::Ok</set>
</property>
<property name="centerButtons">
<bool>true</bool>
</property>
</widget>
</item>
</layout>
</widget>
<resources/>
<connections>
<connection>
<sender>buttonBox</sender>
<signal>accepted()</signal>
<receiver>PostgreSqlConfigDialog</receiver>
<slot>accept()</slot>
<hints>
<hint type="sourcelabel">
<x>248</x>
<y>254</y>
</hint>
<hint type="destinationlabel">
<x>157</x>
<y>274</y>
</hint>
</hints>
</connection>
<connection>
<sender>buttonBox</sender>
<signal>rejected()</signal>
<receiver>PostgreSqlConfigDialog</receiver>
<slot>reject()</slot>
<hints>
<hint type="sourcelabel">
<x>316</x>
<y>260</y>
</hint>
<hint type="destinationlabel">
<x>286</x>
<y>274</y>
</hint>
</hints>
</connection>
</connections>
</ui>
+156
View File
@@ -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