Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Browse files
Browse the repository at this point in the history
[processing] Add postgis widget wrappers
- Loading branch information
1 parent
dda6670
commit c768edf
Showing
5 changed files
with
265 additions
and
31 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,207 @@ | ||
# -*- coding: utf-8 -*- | ||
|
||
""" | ||
*************************************************************************** | ||
postgis.py - Postgis widget wrappers | ||
--------------------- | ||
Date : December 2016 | ||
Copyright : (C) 2016 by Arnaud Morvan | ||
Email : arnaud dot morvan at camptocamp dot com | ||
*************************************************************************** | ||
* * | ||
* This program is free software; you can redistribute it and/or modify * | ||
* it under the terms of the GNU General Public License as published by * | ||
* the Free Software Foundation; either version 2 of the License, or * | ||
* (at your option) any later version. * | ||
* * | ||
*************************************************************************** | ||
""" | ||
|
||
|
||
from qgis.PyQt.QtCore import QSettings | ||
from qgis.PyQt.QtWidgets import QComboBox | ||
|
||
from processing.core.parameters import ( | ||
ParameterString, | ||
ParameterNumber, | ||
ParameterFile, | ||
ParameterTableField, | ||
ParameterExpression | ||
) | ||
from processing.core.outputs import OutputString | ||
from processing.gui.wrappers import ( | ||
WidgetWrapper, | ||
ExpressionWidgetWrapperMixin, | ||
DIALOG_MODELER, | ||
) | ||
from processing.tools.postgis import GeoDB | ||
|
||
|
||
class ConnectionWidgetWrapper(WidgetWrapper, ExpressionWidgetWrapperMixin): | ||
""" | ||
WidgetWrapper for ParameterString that create and manage a combobox widget | ||
with existing postgis connections. | ||
""" | ||
|
||
def createWidget(self): | ||
self._combo = QComboBox() | ||
for group in self.items(): | ||
self._combo.addItem(*group) | ||
self._combo.currentIndexChanged.connect(lambda: self.widgetValueHasChanged.emit(self)) | ||
return self.wrapWithExpressionButton(self._combo) | ||
|
||
def items(self): | ||
settings = QSettings() | ||
settings.beginGroup('/PostgreSQL/connections/') | ||
items = [(group, group) for group in settings.childGroups()] | ||
|
||
if self.dialogType == DIALOG_MODELER: | ||
strings = self.dialog.getAvailableValuesOfType( | ||
[ParameterString, ParameterNumber, ParameterFile, | ||
ParameterTableField, ParameterExpression], OutputString) | ||
items = items + [(self.dialog.resolveValueDescription(s), s) for s in strings] | ||
|
||
return items | ||
|
||
def setValue(self, value): | ||
self.setComboValue(value, self._combo) | ||
|
||
def value(self): | ||
return self.comboValue(combobox=self._combo) | ||
|
||
|
||
class SchemaWidgetWrapper(WidgetWrapper, ExpressionWidgetWrapperMixin): | ||
""" | ||
WidgetWrapper for ParameterString that create and manage a combobox widget | ||
with existing schemas from a parent connection parameter. | ||
""" | ||
|
||
def createWidget(self, connection_param=None): | ||
self._connection_param = connection_param | ||
self._connection = None | ||
self._database = None | ||
|
||
self._combo = QComboBox() | ||
self._combo.setEditable(True) | ||
self.refreshItems() | ||
self._combo.currentIndexChanged.connect(lambda: self.widgetValueHasChanged.emit(self)) | ||
self._combo.lineEdit().editingFinished.connect(lambda: self.widgetValueHasChanged.emit(self)) | ||
|
||
return self.wrapWithExpressionButton(self._combo) | ||
|
||
def postInitialize(self, wrappers): | ||
for wrapper in wrappers: | ||
if wrapper.param.name == self._connection_param: | ||
self.connection_wrapper = wrapper | ||
self.setConnection(wrapper.value()) | ||
wrapper.widgetValueHasChanged.connect(self.connectionChanged) | ||
break | ||
|
||
def connectionChanged(self, wrapper): | ||
connection = wrapper.value() | ||
if connection == self._connection: | ||
return | ||
self.setConnection(connection) | ||
|
||
def setConnection(self, connection): | ||
self._connection = connection | ||
if isinstance(connection, str): | ||
self._database = GeoDB.from_name(connection) | ||
else: | ||
self._database = None | ||
self.refreshItems() | ||
self.widgetValueHasChanged.emit(self) | ||
|
||
def refreshItems(self): | ||
value = self.comboValue(combobox=self._combo) | ||
|
||
self._combo.clear() | ||
|
||
if self._database is not None: | ||
for schema in self._database.list_schemas(): | ||
self._combo.addItem(schema[1], schema[1]) | ||
|
||
if self.dialogType == DIALOG_MODELER: | ||
strings = self.dialog.getAvailableValuesOfType( | ||
[ParameterString, ParameterNumber, ParameterFile, | ||
ParameterTableField, ParameterExpression], OutputString) | ||
for text, data in [(self.dialog.resolveValueDescription(s), s) for s in strings]: | ||
self._combo.addItem(text, data) | ||
|
||
self.setComboValue(value, self._combo) | ||
|
||
def setValue(self, value): | ||
self.setComboValue(value, self._combo) | ||
self.widgetValueHasChanged.emit(self) | ||
|
||
def value(self): | ||
return self.comboValue(combobox=self._combo) | ||
|
||
def database(self): | ||
return self._database | ||
|
||
|
||
class TableWidgetWrapper(WidgetWrapper, ExpressionWidgetWrapperMixin): | ||
""" | ||
WidgetWrapper for ParameterString that create and manage a combobox widget | ||
with existing tables from a parent schema parameter. | ||
""" | ||
|
||
def createWidget(self, schema_param=None): | ||
self._schema_param = schema_param | ||
self._database = None | ||
self._schema = None | ||
|
||
self._combo = QComboBox() | ||
self._combo.setEditable(True) | ||
self.refreshItems() | ||
self._combo.currentIndexChanged.connect(lambda: self.widgetValueHasChanged.emit(self)) | ||
self._combo.lineEdit().editingFinished.connect(lambda: self.widgetValueHasChanged.emit(self)) | ||
|
||
return self.wrapWithExpressionButton(self._combo) | ||
|
||
def postInitialize(self, wrappers): | ||
for wrapper in wrappers: | ||
if wrapper.param.name == self._schema_param: | ||
self.schema_wrapper = wrapper | ||
self.setSchema(wrapper.database(), wrapper.value()) | ||
wrapper.widgetValueHasChanged.connect(self.schemaChanged) | ||
break | ||
|
||
def schemaChanged(self, wrapper): | ||
database = wrapper.database() | ||
schema = wrapper.value() | ||
if database == self._database and schema == self._schema: | ||
return | ||
self.setSchema(database, schema) | ||
|
||
def setSchema(self, database, schema): | ||
self._database = database | ||
self._schema = schema | ||
self.refreshItems() | ||
self.widgetValueHasChanged.emit(self) | ||
|
||
def refreshItems(self): | ||
value = self.comboValue(combobox=self._combo) | ||
|
||
self._combo.clear() | ||
|
||
if (self._database is not None and isinstance(self._schema, str)): | ||
for table in self._database.list_geotables(self._schema): | ||
self._combo.addItem(table[0], table[0]) | ||
|
||
if self.dialogType == DIALOG_MODELER: | ||
strings = self.dialog.getAvailableValuesOfType( | ||
[ParameterString, ParameterNumber, ParameterFile, | ||
ParameterTableField, ParameterExpression], OutputString) | ||
for text, data in [(self.dialog.resolveValueDescription(s), s) for s in strings]: | ||
self._combo.addItem(text, data) | ||
|
||
self.setComboValue(value, self._combo) | ||
|
||
def setValue(self, value): | ||
self.setComboValue(value, self._combo) | ||
self.widgetValueHasChanged.emit(self) | ||
|
||
def value(self): | ||
return self.comboValue(combobox=self._combo) |