mirror of
				https://github.com/qgis/QGIS.git
				synced 2025-11-04 00:04:25 -05:00 
			
		
		
		
	* revives WMS * QgsSettings::clear() added * section added to QgsSettings::contains() * type parameter added to sip binding of QgsSettings.value() * TODO: customization & evis
		
			
				
	
	
		
			208 lines
		
	
	
		
			7.4 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			208 lines
		
	
	
		
			7.4 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
# -*- 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.core import QgsSettings
 | 
						|
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 = QgsSettings()
 | 
						|
        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)
 |