Skip to content

Commit d549451

Browse files
committed
Change to use ProviderRegistry
1 parent f2d0846 commit d549451

File tree

7 files changed

+122
-328
lines changed

7 files changed

+122
-328
lines changed
+2-5
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,2 @@
1-
from arho_feature_template.qgis_plugin_tools.tools.exceptions import QgsPluginException
2-
3-
4-
class AuthConfigException(QgsPluginException):
5-
pass
1+
class UnexpectedNoneError(Exception):
2+
"""Internal QGIS errors that should not be happened"""

arho_feature_template/gui/ask_credentials.py

-36
This file was deleted.

arho_feature_template/gui/ask_credentials.ui

-66
This file was deleted.
+53-86
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,12 @@
11
from importlib import resources
22

3-
import psycopg2
3+
from qgis.core import QgsProviderRegistry
44
from qgis.PyQt import uic
55
from qgis.PyQt.QtCore import QRegularExpression, QSortFilterProxyModel, Qt
66
from qgis.PyQt.QtGui import QStandardItem, QStandardItemModel
7-
from qgis.PyQt.QtWidgets import QComboBox, QDialog, QLineEdit, QMessageBox, QPushButton, QTableView
7+
from qgis.PyQt.QtWidgets import QComboBox, QDialog, QDialogButtonBox, QLineEdit, QMessageBox, QPushButton, QTableView
88

9-
from arho_feature_template.gui.ask_credentials import DbAskCredentialsDialog
10-
from arho_feature_template.utils.db_utils import get_db_connection_params
9+
from arho_feature_template.core.exceptions import UnexpectedNoneError
1110

1211
ui_path = resources.files(__package__) / "load_plan_dialog.ui"
1312

@@ -34,66 +33,67 @@ def filterAcceptsRow(self, source_row, source_parent): # noqa: N802
3433

3534

3635
class LoadPlanDialog(QDialog, LoadPlanDialogBase): # type: ignore
36+
connectionComboBox: QComboBox # noqa: N815
37+
push_button_load: QPushButton
38+
planTableView: QTableView # noqa: N815
39+
searchLineEdit: QLineEdit # noqa: N815
40+
buttonBox: QDialogButtonBox # noqa: N815
41+
3742
def __init__(self, parent, connections):
3843
super().__init__(parent)
44+
self.setupUi(self)
3945

40-
uic.loadUi(ui_path, self)
46+
self._selected_plan_id = None
4147

42-
self.connectionComboBox: QComboBox = self.findChild(QComboBox, "connectionComboBox")
43-
self.planTableView: QTableView = self.findChild(QTableView, "planTableView")
44-
self.okButton: QPushButton = self.findChild(QPushButton, "okButton")
48+
self.buttonBox.rejected.connect(self.reject)
49+
self.buttonBox.accepted.connect(self.accept)
50+
self.buttonBox.button(QDialogButtonBox.Ok).setEnabled(False)
4551

46-
self.searchLineEdit: QLineEdit = self.findChild(QLineEdit, "searchLineEdit")
47-
self.searchLineEdit.setPlaceholderText("Etsi kaavoja...")
52+
self.push_button_load.clicked.connect(self.load_plans)
53+
self.searchLineEdit.textChanged.connect(self.filter_plans)
4854

4955
self.connectionComboBox.addItems(connections)
5056

51-
self.connectionComboBox.currentIndexChanged.connect(self.load_plans)
52-
self.okButton.clicked.connect(self.accept)
53-
54-
self.okButton.setEnabled(False)
55-
56-
self.filterProxyModel = PlanFilterProxyModel(self)
57+
self.planTableView.setSelectionMode(QTableView.SingleSelection)
58+
self.planTableView.setSelectionBehavior(QTableView.SelectRows)
59+
self.planTableView.selectionModel().selectionChanged.connect(self.on_selection_changed)
60+
61+
self.model = QStandardItemModel()
62+
self.model.setColumnCount(5)
63+
self.model.setHorizontalHeaderLabels(
64+
[
65+
"ID",
66+
"Tuottajan kaavatunnus",
67+
"Nimi",
68+
"Kaavan elinkaaren tila",
69+
"Kaavalaji",
70+
]
71+
)
72+
73+
self.filterProxyModel = PlanFilterProxyModel()
74+
self.filterProxyModel.setSourceModel(self.model)
5775
self.filterProxyModel.setFilterCaseSensitivity(Qt.CaseInsensitive)
5876

5977
self.planTableView.setModel(self.filterProxyModel)
60-
self.searchLineEdit.textChanged.connect(self.filter_plans)
61-
62-
self.selected_plan_id = None
6378

6479
def load_plans(self):
80+
self.model.removeRows(0, self.model.rowCount())
81+
6582
selected_connection = self.connectionComboBox.currentText()
6683
if not selected_connection:
6784
self.planTableView.setModel(QStandardItemModel())
6885
return
6986

70-
cursor = None
71-
conn = None
87+
provider_registry = QgsProviderRegistry.instance()
88+
if provider_registry is None:
89+
raise UnexpectedNoneError
90+
postgres_provider_metadata = provider_registry.providerMetadata("postgres")
91+
if postgres_provider_metadata is None:
92+
raise UnexpectedNoneError
7293

7394
try:
74-
conn_params = get_db_connection_params(selected_connection)
75-
76-
if not conn_params.get("user") or not conn_params.get("password"):
77-
# Trigger dialog to ask for missing credentials
78-
dialog = DbAskCredentialsDialog(self)
79-
dialog.rejected.connect(self.reject)
80-
if dialog.exec() == QDialog.Accepted:
81-
user, password = dialog.get_credentials()
82-
conn_params["user"] = user
83-
conn_params["password"] = password
84-
85-
conn = psycopg2.connect(
86-
host=conn_params["host"],
87-
port=conn_params["port"],
88-
dbname=conn_params["dbname"],
89-
user=conn_params["user"],
90-
password=conn_params["password"],
91-
sslmode=conn_params["sslmode"],
92-
)
93-
94-
cursor = conn.cursor()
95-
96-
cursor.execute("""
95+
connection = postgres_provider_metadata.createConnection(selected_connection)
96+
plans = connection.executeSql("""
9797
SELECT
9898
p.id,
9999
p.producers_plan_identifier,
@@ -111,46 +111,12 @@ def load_plans(self):
111111
ON
112112
p.plan_type_id = pt.id;
113113
""")
114-
plans = cursor.fetchall()
115-
116-
model = QStandardItemModel(len(plans), 5)
117-
model.setHorizontalHeaderLabels(
118-
[
119-
"ID",
120-
"Tuottajan kaavatunnus",
121-
"Nimi",
122-
"Kaavan elinkaaren tila",
123-
"Kaavalaji",
124-
]
125-
)
126-
127-
for row_idx, plan in enumerate(plans):
128-
model.setItem(row_idx, 0, QStandardItem(str(plan[0]))) # id
129-
model.setItem(row_idx, 1, QStandardItem(str(plan[1]))) # producer_plan_identifier
130-
model.setItem(row_idx, 2, QStandardItem(str(plan[2]))) # name_fin
131-
model.setItem(row_idx, 3, QStandardItem(str(plan[3]))) # lifecycle_status_fin
132-
model.setItem(row_idx, 4, QStandardItem(str(plan[4]))) # plan_type_fin
133-
134-
self.filterProxyModel.setSourceModel(model)
135-
136-
self.planTableView.setSelectionMode(QTableView.SingleSelection)
137-
self.planTableView.setSelectionBehavior(QTableView.SelectRows)
138-
139-
self.planTableView.selectionModel().selectionChanged.connect(self.on_selection_changed)
140-
141-
except ValueError as ve:
142-
QMessageBox.critical(self, "Connection Error", str(ve))
143-
self.planTableView.setModel(QStandardItemModel())
114+
for plan in plans:
115+
self.model.appendRow([QStandardItem(column) for column in plan])
144116

145117
except Exception as e: # noqa: BLE001
146118
QMessageBox.critical(self, "Error", f"Failed to load plans: {e}")
147-
self.planTableView.setModel(QStandardItemModel())
148-
149-
finally:
150-
if cursor:
151-
cursor.close()
152-
if conn:
153-
conn.close()
119+
self.model.removeRows(0, self.model.rowCount())
154120

155121
def filter_plans(self):
156122
search_text = self.searchLineEdit.text()
@@ -163,16 +129,17 @@ def filter_plans(self):
163129
def on_selection_changed(self):
164130
# Enable the OK button only if a row is selected
165131
selection = self.planTableView.selectionModel().selectedRows()
132+
ok_button = self.buttonBox.button(QDialogButtonBox.Ok)
166133
if selection:
167134
selected_row = selection[0].row()
168-
self.selected_plan_id = self.planTableView.model().index(selected_row, 0).data()
169-
self.okButton.setEnabled(True)
135+
self._selected_plan_id = self.planTableView.model().index(selected_row, 0).data()
136+
ok_button.setEnabled(True)
170137
else:
171-
self.selected_plan_id = None
172-
self.okButton.setEnabled(False)
138+
self._selected_plan_id = None
139+
ok_button.setEnabled(False)
173140

174141
def get_selected_connection(self):
175142
return self.connectionComboBox.currentText()
176143

177144
def get_selected_plan_id(self):
178-
return self.selected_plan_id
145+
return self._selected_plan_id

0 commit comments

Comments
 (0)