mirror of
				https://github.com/qgis/QGIS.git
				synced 2025-10-30 00:07:09 -04:00 
			
		
		
		
	
		
			
				
	
	
		
			228 lines
		
	
	
		
			9.8 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			228 lines
		
	
	
		
			9.8 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
| # -*- coding: utf-8 -*-
 | |
| 
 | |
| """
 | |
| ***************************************************************************
 | |
|     OutputSelectionPanel.py
 | |
|     ---------------------
 | |
|     Date                 : August 2012
 | |
|     Copyright            : (C) 2012 by Victor Olaya
 | |
|     Email                : volayaf at gmail 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 builtins import str
 | |
| 
 | |
| __author__ = 'Victor Olaya'
 | |
| __date__ = 'August 2012'
 | |
| __copyright__ = '(C) 2012, Victor Olaya'
 | |
| 
 | |
| # This will get replaced with a git SHA1 when you do a git archive
 | |
| 
 | |
| __revision__ = '$Format:%H$'
 | |
| 
 | |
| import re
 | |
| import os
 | |
| 
 | |
| from qgis.PyQt import uic
 | |
| from qgis.PyQt.QtCore import QCoreApplication
 | |
| from qgis.PyQt.QtWidgets import QDialog, QMenu, QAction, QFileDialog
 | |
| from qgis.PyQt.QtGui import QCursor
 | |
| from qgis.gui import QgsEncodingFileDialog, QgsExpressionBuilderDialog
 | |
| from qgis.core import (QgsDataSourceUri,
 | |
|                        QgsCredentials,
 | |
|                        QgsSettings)
 | |
| from processing.core.ProcessingConfig import ProcessingConfig
 | |
| from processing.core.outputs import OutputVector
 | |
| from processing.core.outputs import OutputDirectory
 | |
| from processing.gui.PostgisTableSelector import PostgisTableSelector
 | |
| 
 | |
| pluginPath = os.path.split(os.path.dirname(__file__))[0]
 | |
| WIDGET, BASE = uic.loadUiType(
 | |
|     os.path.join(pluginPath, 'ui', 'widgetBaseSelector.ui'))
 | |
| 
 | |
| 
 | |
| class OutputSelectionPanel(BASE, WIDGET):
 | |
| 
 | |
|     SAVE_TO_TEMP_FILE = QCoreApplication.translate(
 | |
|         'OutputSelectionPanel', '[Save to temporary file]')
 | |
|     SAVE_TO_TEMP_LAYER = QCoreApplication.translate(
 | |
|         'OutputSelectionPanel', '[Create temporary layer]')
 | |
| 
 | |
|     def __init__(self, output, alg):
 | |
|         super(OutputSelectionPanel, self).__init__(None)
 | |
|         self.setupUi(self)
 | |
| 
 | |
|         self.output = output
 | |
|         self.alg = alg
 | |
| 
 | |
|         if hasattr(self.leText, 'setPlaceholderText'):
 | |
|             if isinstance(output, OutputVector) \
 | |
|                     and alg.provider.supportsNonFileBasedOutput():
 | |
|                 # use memory layers for temporary files if supported
 | |
|                 self.leText.setPlaceholderText(self.SAVE_TO_TEMP_LAYER)
 | |
|             else:
 | |
|                 self.leText.setPlaceholderText(self.SAVE_TO_TEMP_FILE)
 | |
| 
 | |
|         self.btnSelect.clicked.connect(self.selectOutput)
 | |
| 
 | |
|     def selectOutput(self):
 | |
|         if isinstance(self.output, OutputDirectory):
 | |
|             self.selectDirectory()
 | |
|         else:
 | |
|             popupMenu = QMenu()
 | |
| 
 | |
|             if isinstance(self.output, OutputVector) \
 | |
|                     and self.alg.provider.supportsNonFileBasedOutput():
 | |
|                 # use memory layers for temporary layers if supported
 | |
|                 actionSaveToTemp = QAction(
 | |
|                     self.tr('Create temporary layer'), self.btnSelect)
 | |
|             else:
 | |
|                 actionSaveToTemp = QAction(
 | |
|                     self.tr('Save to a temporary file'), self.btnSelect)
 | |
|             actionSaveToTemp.triggered.connect(self.saveToTemporary)
 | |
|             popupMenu.addAction(actionSaveToTemp)
 | |
| 
 | |
|             actionSaveToFile = QAction(
 | |
|                 self.tr('Save to file...'), self.btnSelect)
 | |
|             actionSaveToFile.triggered.connect(self.selectFile)
 | |
|             popupMenu.addAction(actionSaveToFile)
 | |
| 
 | |
|             actionShowExpressionsBuilder = QAction(
 | |
|                 self.tr('Use expression...'), self.btnSelect)
 | |
|             actionShowExpressionsBuilder.triggered.connect(self.showExpressionsBuilder)
 | |
|             popupMenu.addAction(actionShowExpressionsBuilder)
 | |
| 
 | |
|             if isinstance(self.output, OutputVector) \
 | |
|                     and self.alg.provider.supportsNonFileBasedOutput():
 | |
|                 actionSaveToSpatialite = QAction(
 | |
|                     self.tr('Save to Spatialite table...'), self.btnSelect)
 | |
|                 actionSaveToSpatialite.triggered.connect(self.saveToSpatialite)
 | |
|                 popupMenu.addAction(actionSaveToSpatialite)
 | |
|                 actionSaveToPostGIS = QAction(
 | |
|                     self.tr('Save to PostGIS table...'), self.btnSelect)
 | |
|                 actionSaveToPostGIS.triggered.connect(self.saveToPostGIS)
 | |
|                 settings = QgsSettings()
 | |
|                 settings.beginGroup('/PostgreSQL/connections/')
 | |
|                 names = settings.childGroups()
 | |
|                 settings.endGroup()
 | |
|                 actionSaveToPostGIS.setEnabled(bool(names))
 | |
|                 popupMenu.addAction(actionSaveToPostGIS)
 | |
| 
 | |
|             popupMenu.exec_(QCursor.pos())
 | |
| 
 | |
|     def showExpressionsBuilder(self):
 | |
|         dlg = QgsExpressionBuilderDialog(None, self.leText.text(), self, 'generic',
 | |
|                                          self.output.expressionContext(self.alg))
 | |
|         dlg.setWindowTitle(self.tr('Expression based output'))
 | |
|         if dlg.exec_() == QDialog.Accepted:
 | |
|             self.leText.setText(dlg.expressionText())
 | |
| 
 | |
|     def saveToTemporary(self):
 | |
|         self.leText.setText('')
 | |
| 
 | |
|     def saveToPostGIS(self):
 | |
|         dlg = PostgisTableSelector(self, self.output.name.lower())
 | |
|         dlg.exec_()
 | |
|         if dlg.connection:
 | |
|             settings = QgsSettings()
 | |
|             mySettings = '/PostgreSQL/connections/' + dlg.connection
 | |
|             dbname = settings.value(mySettings + '/database')
 | |
|             user = settings.value(mySettings + '/username')
 | |
|             host = settings.value(mySettings + '/host')
 | |
|             port = settings.value(mySettings + '/port')
 | |
|             password = settings.value(mySettings + '/password')
 | |
|             uri = QgsDataSourceUri()
 | |
|             uri.setConnection(host, str(port), dbname, user, password)
 | |
|             uri.setDataSource(dlg.schema, dlg.table,
 | |
|                               "the_geom" if self.output.hasGeometry() else None)
 | |
| 
 | |
|             connInfo = uri.connectionInfo()
 | |
|             (success, user, passwd) = QgsCredentials.instance().get(connInfo, None, None)
 | |
|             if success:
 | |
|                 QgsCredentials.instance().put(connInfo, user, passwd)
 | |
|             self.leText.setText("postgis:" + uri.uri())
 | |
| 
 | |
|     def saveToSpatialite(self):
 | |
|         fileFilter = self.output.tr('SpatiaLite files (*.sqlite)', 'OutputFile')
 | |
| 
 | |
|         settings = QgsSettings()
 | |
|         if settings.contains('/Processing/LastOutputPath'):
 | |
|             path = settings.value('/Processing/LastOutputPath')
 | |
|         else:
 | |
|             path = ProcessingConfig.getSetting(ProcessingConfig.OUTPUT_FOLDER)
 | |
| 
 | |
|         encoding = settings.value('/Processing/encoding', 'System')
 | |
|         fileDialog = QgsEncodingFileDialog(
 | |
|             self, self.tr('Save Spatialite'), path, fileFilter, encoding)
 | |
|         fileDialog.setFileMode(QFileDialog.AnyFile)
 | |
|         fileDialog.setAcceptMode(QFileDialog.AcceptSave)
 | |
|         fileDialog.setOption(QFileDialog.DontConfirmOverwrite, True)
 | |
| 
 | |
|         if fileDialog.exec_() == QDialog.Accepted:
 | |
|             files = fileDialog.selectedFiles()
 | |
|             encoding = str(fileDialog.encoding())
 | |
|             self.output.encoding = encoding
 | |
|             fileName = str(files[0])
 | |
|             selectedFileFilter = str(fileDialog.selectedNameFilter())
 | |
|             if not fileName.lower().endswith(
 | |
|                     tuple(re.findall("\\*(\\.[a-z]{1,10})", fileFilter))):
 | |
|                 ext = re.search("\\*(\\.[a-z]{1,10})", selectedFileFilter)
 | |
|                 if ext:
 | |
|                     fileName += ext.group(1)
 | |
|             settings.setValue('/Processing/LastOutputPath',
 | |
|                               os.path.dirname(fileName))
 | |
|             settings.setValue('/Processing/encoding', encoding)
 | |
| 
 | |
|             uri = QgsDataSourceUri()
 | |
|             uri.setDatabase(fileName)
 | |
|             uri.setDataSource('', self.output.name.lower(),
 | |
|                               'the_geom' if self.output.hasGeometry() else None)
 | |
|             self.leText.setText("spatialite:" + uri.uri())
 | |
| 
 | |
|     def selectFile(self):
 | |
|         fileFilter = self.output.getFileFilter(self.alg)
 | |
| 
 | |
|         settings = QgsSettings()
 | |
|         if settings.contains('/Processing/LastOutputPath'):
 | |
|             path = settings.value('/Processing/LastOutputPath')
 | |
|         else:
 | |
|             path = ProcessingConfig.getSetting(ProcessingConfig.OUTPUT_FOLDER)
 | |
| 
 | |
|         encoding = settings.value('/Processing/encoding', 'System')
 | |
|         fileDialog = QgsEncodingFileDialog(
 | |
|             self, self.tr('Save file'), path, fileFilter, encoding)
 | |
|         fileDialog.setFileMode(QFileDialog.AnyFile)
 | |
|         fileDialog.setAcceptMode(QFileDialog.AcceptSave)
 | |
|         fileDialog.setOption(QFileDialog.DontConfirmOverwrite, False)
 | |
| 
 | |
|         if fileDialog.exec_() == QDialog.Accepted:
 | |
|             files = fileDialog.selectedFiles()
 | |
|             encoding = str(fileDialog.encoding())
 | |
|             self.output.encoding = encoding
 | |
|             fileName = str(files[0])
 | |
|             selectedFileFilter = str(fileDialog.selectedNameFilter())
 | |
|             if not fileName.lower().endswith(
 | |
|                     tuple(re.findall("\\*(\\.[a-z]{1,10})", fileFilter))):
 | |
|                 ext = re.search("\\*(\\.[a-z]{1,10})", selectedFileFilter)
 | |
|                 if ext:
 | |
|                     fileName += ext.group(1)
 | |
|             self.leText.setText(fileName)
 | |
|             settings.setValue('/Processing/LastOutputPath',
 | |
|                               os.path.dirname(fileName))
 | |
|             settings.setValue('/Processing/encoding', encoding)
 | |
| 
 | |
|     def selectDirectory(self):
 | |
|         lastDir = ''
 | |
|         dirName = QFileDialog.getExistingDirectory(self, self.tr('Select directory'),
 | |
|                                                    lastDir, QFileDialog.ShowDirsOnly)
 | |
|         self.leText.setText(dirName)
 | |
| 
 | |
|     def getValue(self):
 | |
|         return self.leText.text()
 |