From f4599f13f179ac2d36bcc44468d3d0b918c2bb77 Mon Sep 17 00:00:00 2001 From: Nyall Dawson Date: Sun, 6 May 2018 10:29:01 +1000 Subject: [PATCH] [processing][gdal] Better error messages when invalid parameters are passed --- .../processing/algs/gdal/AssignProjection.py | 6 +++- .../algs/gdal/ClipRasterByExtent.py | 4 +++ .../processing/algs/gdal/ClipRasterByMask.py | 3 ++ .../processing/algs/gdal/ColorRelief.py | 4 +++ .../processing/algs/gdal/OgrToPostGis.py | 6 +++- python/plugins/processing/algs/gdal/aspect.py | 5 +++- .../plugins/processing/algs/gdal/contour.py | 4 +++ .../processing/algs/gdal/fillnodata.py | 7 ++++- .../processing/algs/gdal/gdal2tiles.py | 6 +++- .../plugins/processing/algs/gdal/gdal2xyz.py | 7 ++++- .../plugins/processing/algs/gdal/gdaladdo.py | 6 +++- .../plugins/processing/algs/gdal/gdalinfo.py | 9 ++++-- .../plugins/processing/algs/gdal/hillshade.py | 4 +++ .../plugins/processing/algs/gdal/nearblack.py | 3 ++ .../plugins/processing/algs/gdal/ogrinfo.py | 6 +++- .../plugins/processing/algs/gdal/pct2rgb.py | 4 +++ .../processing/algs/gdal/polygonize.py | 4 +++ .../plugins/processing/algs/gdal/proximity.py | 4 +++ .../plugins/processing/algs/gdal/rgb2pct.py | 7 ++++- .../plugins/processing/algs/gdal/roughness.py | 4 +++ python/plugins/processing/algs/gdal/sieve.py | 7 ++++- python/plugins/processing/algs/gdal/slope.py | 4 +++ python/plugins/processing/algs/gdal/tpi.py | 6 +++- .../plugins/processing/algs/gdal/translate.py | 4 +++ python/plugins/processing/algs/gdal/tri.py | 6 +++- python/plugins/processing/algs/gdal/warp.py | 4 +++ .../processing/tests/GdalAlgorithmsTest.py | 14 +++++++++- python/plugins/processing/tools/postgis.py | 28 ++++++------------- 28 files changed, 142 insertions(+), 34 deletions(-) diff --git a/python/plugins/processing/algs/gdal/AssignProjection.py b/python/plugins/processing/algs/gdal/AssignProjection.py index 96c2909a3fe..4174aef7a03 100644 --- a/python/plugins/processing/algs/gdal/AssignProjection.py +++ b/python/plugins/processing/algs/gdal/AssignProjection.py @@ -29,7 +29,8 @@ import os from qgis.PyQt.QtGui import QIcon -from qgis.core import (QgsProcessingParameterRasterLayer, +from qgis.core import (QgsProcessingException, + QgsProcessingParameterRasterLayer, QgsProcessingParameterCrs, QgsProcessingOutputRasterLayer) from processing.algs.gdal.GdalAlgorithm import GdalAlgorithm @@ -78,6 +79,9 @@ class AssignProjection(GdalAlgorithm): def getConsoleCommands(self, parameters, context, feedback, executing=True): inLayer = self.parameterAsRasterLayer(parameters, self.INPUT, context) + if inLayer is None: + raise QgsProcessingException(self.invalidRasterError(parameters, self.INPUT)) + fileName = inLayer.source() crs = self.parameterAsCrs(parameters, self.CRS, context).authid() diff --git a/python/plugins/processing/algs/gdal/ClipRasterByExtent.py b/python/plugins/processing/algs/gdal/ClipRasterByExtent.py index 73748add576..1406a0aea2c 100644 --- a/python/plugins/processing/algs/gdal/ClipRasterByExtent.py +++ b/python/plugins/processing/algs/gdal/ClipRasterByExtent.py @@ -30,6 +30,7 @@ import os from qgis.PyQt.QtGui import QIcon from qgis.core import (QgsRasterFileWriter, + QgsProcessingException, QgsProcessingParameterDefinition, QgsProcessingParameterRasterLayer, QgsProcessingParameterEnum, @@ -110,6 +111,9 @@ class ClipRasterByExtent(GdalAlgorithm): def getConsoleCommands(self, parameters, context, feedback, executing=True): inLayer = self.parameterAsRasterLayer(parameters, self.INPUT, context) + if inLayer is None: + raise QgsProcessingException('Invalid input layer {}'.format(parameters[self.INPUT] if self.INPUT in parameters else 'INPUT')) + bbox = self.parameterAsExtent(parameters, self.EXTENT, context, inLayer.crs()) if self.NODATA in parameters and parameters[self.NODATA] is not None: nodata = self.parameterAsDouble(parameters, self.NODATA, context) diff --git a/python/plugins/processing/algs/gdal/ClipRasterByMask.py b/python/plugins/processing/algs/gdal/ClipRasterByMask.py index 6b295a48436..df028c1e0d2 100644 --- a/python/plugins/processing/algs/gdal/ClipRasterByMask.py +++ b/python/plugins/processing/algs/gdal/ClipRasterByMask.py @@ -31,6 +31,7 @@ from qgis.PyQt.QtGui import QIcon from qgis.core import (QgsRasterFileWriter, QgsProcessing, + QgsProcessingException, QgsProcessingParameterDefinition, QgsProcessingParameterFeatureSource, QgsProcessingParameterRasterLayer, @@ -124,6 +125,8 @@ class ClipRasterByMask(GdalAlgorithm): def getConsoleCommands(self, parameters, context, feedback, executing=True): inLayer = self.parameterAsRasterLayer(parameters, self.INPUT, context) + if inLayer is None: + raise QgsProcessingException(self.invalidRasterError(parameters, self.INPUT)) maskLayer, maskLayerName = self.getOgrCompatibleSource(self.MASK, parameters, context, feedback, executing) diff --git a/python/plugins/processing/algs/gdal/ColorRelief.py b/python/plugins/processing/algs/gdal/ColorRelief.py index ffda25769f9..745aa31ca7a 100644 --- a/python/plugins/processing/algs/gdal/ColorRelief.py +++ b/python/plugins/processing/algs/gdal/ColorRelief.py @@ -27,6 +27,7 @@ __revision__ = '$Format:%H$' import os from qgis.core import (QgsRasterFileWriter, + QgsProcessingException, QgsProcessingParameterDefinition, QgsProcessingParameterRasterLayer, QgsProcessingParameterBand, @@ -102,6 +103,9 @@ class ColorRelief(GdalAlgorithm): def getConsoleCommands(self, parameters, context, feedback, executing=True): arguments = ['color-relief'] inLayer = self.parameterAsRasterLayer(parameters, self.INPUT, context) + if inLayer is None: + raise QgsProcessingException(self.invalidRasterError(parameters, self.INPUT)) + arguments.append(inLayer.source()) arguments.append(self.parameterAsFile(parameters, self.COLOR_TABLE, context)) diff --git a/python/plugins/processing/algs/gdal/OgrToPostGis.py b/python/plugins/processing/algs/gdal/OgrToPostGis.py index a65a29223ab..9d4b87a654a 100644 --- a/python/plugins/processing/algs/gdal/OgrToPostGis.py +++ b/python/plugins/processing/algs/gdal/OgrToPostGis.py @@ -25,7 +25,8 @@ __copyright__ = '(C) 2012, Victor Olaya' __revision__ = '$Format:%H$' -from qgis.core import (QgsProcessingParameterFeatureSource, +from qgis.core import (QgsProcessingException, + QgsProcessingParameterFeatureSource, QgsProcessingParameterString, QgsProcessingParameterEnum, QgsProcessingParameterCrs, @@ -189,6 +190,9 @@ class OgrToPostGis(GdalAlgorithm): def getConsoleCommands(self, parameters, context, feedback, executing=True): ogrLayer, layername = self.getOgrCompatibleSource(self.INPUT, parameters, context, feedback, executing) + if not layername: + raise QgsProcessingException(self.invalidSourceError(parameters, self.INPUT)) + shapeEncoding = self.parameterAsString(parameters, self.SHAPE_ENCODING, context) ssrs = self.parameterAsCrs(parameters, self.S_SRS, context).authid() tsrs = self.parameterAsCrs(parameters, self.T_SRS, context).authid() diff --git a/python/plugins/processing/algs/gdal/aspect.py b/python/plugins/processing/algs/gdal/aspect.py index f2f854a0ced..eade19a2fd7 100644 --- a/python/plugins/processing/algs/gdal/aspect.py +++ b/python/plugins/processing/algs/gdal/aspect.py @@ -27,7 +27,8 @@ __revision__ = '$Format:%H$' import os -from qgis.core import (QgsRasterFileWriter, +from qgis.core import (QgsProcessingException, + QgsRasterFileWriter, QgsProcessingParameterDefinition, QgsProcessingParameterRasterLayer, QgsProcessingParameterBand, @@ -102,6 +103,8 @@ class aspect(GdalAlgorithm): def getConsoleCommands(self, parameters, context, feedback, executing=True): arguments = ['aspect'] inLayer = self.parameterAsRasterLayer(parameters, self.INPUT, context) + if inLayer is None: + raise QgsProcessingException(self.invalidRasterError(parameters, self.INPUT)) arguments.append(inLayer.source()) out = self.parameterAsOutputLayer(parameters, self.OUTPUT, context) diff --git a/python/plugins/processing/algs/gdal/contour.py b/python/plugins/processing/algs/gdal/contour.py index d83359ab4ad..16be3ec5abb 100644 --- a/python/plugins/processing/algs/gdal/contour.py +++ b/python/plugins/processing/algs/gdal/contour.py @@ -30,6 +30,7 @@ import os from qgis.PyQt.QtGui import QIcon from qgis.core import (QgsProcessing, + QgsProcessingException, QgsProcessingParameterDefinition, QgsProcessingParameterRasterLayer, QgsProcessingParameterBand, @@ -126,6 +127,9 @@ class contour(GdalAlgorithm): def getConsoleCommands(self, parameters, context, feedback, executing=True): inLayer = self.parameterAsRasterLayer(parameters, self.INPUT, context) + if inLayer is None: + raise QgsProcessingException(self.invalidRasterError(parameters, self.INPUT)) + fieldName = self.parameterAsString(parameters, self.FIELD_NAME, context) if self.NODATA in parameters and parameters[self.NODATA] is not None: nodata = self.parameterAsDouble(parameters, self.NODATA, context) diff --git a/python/plugins/processing/algs/gdal/fillnodata.py b/python/plugins/processing/algs/gdal/fillnodata.py index 43078ced598..f12c7aa0ed2 100644 --- a/python/plugins/processing/algs/gdal/fillnodata.py +++ b/python/plugins/processing/algs/gdal/fillnodata.py @@ -28,6 +28,7 @@ __revision__ = '$Format:%H$' import os from qgis.core import (QgsRasterFileWriter, + QgsProcessingException, QgsProcessingParameterRasterLayer, QgsProcessingParameterBand, QgsProcessingParameterNumber, @@ -116,7 +117,11 @@ class fillnodata(GdalAlgorithm): arguments.append('-of') arguments.append(QgsRasterFileWriter.driverForExtension(os.path.splitext(out)[1])) - arguments.append(self.parameterAsRasterLayer(parameters, self.INPUT, context).source()) + raster = self.parameterAsRasterLayer(parameters, self.INPUT, context) + if raster is None: + raise QgsProcessingException(self.invalidRasterError(parameters, self.INPUT)) + + arguments.append(raster.source()) arguments.append(out) commands = [] diff --git a/python/plugins/processing/algs/gdal/gdal2tiles.py b/python/plugins/processing/algs/gdal/gdal2tiles.py index 8a71213e581..1c505c42aaa 100644 --- a/python/plugins/processing/algs/gdal/gdal2tiles.py +++ b/python/plugins/processing/algs/gdal/gdal2tiles.py @@ -26,7 +26,8 @@ __copyright__ = '(C) 2016, Médéric Ribreux' __revision__ = '$Format:%H$' -from qgis.core import (QgsProcessingParameterDefinition, +from qgis.core import (QgsProcessingException, + QgsProcessingParameterDefinition, QgsProcessingParameterRasterLayer, QgsProcessingParameterCrs, QgsProcessingParameterEnum, @@ -219,6 +220,9 @@ class gdal2tiles(GdalAlgorithm): arguments.append('-n') inLayer = self.parameterAsRasterLayer(parameters, self.INPUT, context) + if inLayer is None: + raise QgsProcessingException(self.invalidRasterError(parameters, self.INPUT)) + arguments.append(inLayer.source()) arguments.append(self.parameterAsString(parameters, self.OUTPUT, context)) diff --git a/python/plugins/processing/algs/gdal/gdal2xyz.py b/python/plugins/processing/algs/gdal/gdal2xyz.py index 98f83f72c31..7906ba73e28 100644 --- a/python/plugins/processing/algs/gdal/gdal2xyz.py +++ b/python/plugins/processing/algs/gdal/gdal2xyz.py @@ -26,6 +26,7 @@ __copyright__ = '(C) 2013, Alexander Bruy' __revision__ = '$Format:%H$' from qgis.core import (QgsProcessing, + QgsProcessingException, QgsProcessingParameterRasterLayer, QgsProcessingParameterBand, QgsProcessingParameterBoolean, @@ -82,7 +83,11 @@ class gdal2xyz(GdalAlgorithm): if self.parameterAsBool(parameters, self.CSV, context): arguments.append('-csv') - arguments.append(self.parameterAsRasterLayer(parameters, self.INPUT, context).source()) + raster = self.parameterAsRasterLayer(parameters, self.INPUT, context) + if raster is None: + raise QgsProcessingException(self.invalidRasterError(parameters, self.INPUT)) + + arguments.append(raster.source()) arguments.append(self.parameterAsFileOutput(parameters, self.OUTPUT, context)) commands = [] diff --git a/python/plugins/processing/algs/gdal/gdaladdo.py b/python/plugins/processing/algs/gdal/gdaladdo.py index 37b65ae2b70..121548118b6 100644 --- a/python/plugins/processing/algs/gdal/gdaladdo.py +++ b/python/plugins/processing/algs/gdal/gdaladdo.py @@ -29,7 +29,8 @@ import os from qgis.PyQt.QtGui import QIcon -from qgis.core import (QgsProcessingParameterRasterLayer, +from qgis.core import (QgsProcessingException, + QgsProcessingParameterRasterLayer, QgsProcessingParameterEnum, QgsProcessingParameterString, QgsProcessingParameterBoolean, @@ -110,6 +111,9 @@ class gdaladdo(GdalAlgorithm): def getConsoleCommands(self, parameters, context, feedback, executing=True): inLayer = self.parameterAsRasterLayer(parameters, self.INPUT, context) + if inLayer is None: + raise QgsProcessingException(self.invalidRasterError(parameters, self.INPUT)) + fileName = inLayer.source() arguments = [] diff --git a/python/plugins/processing/algs/gdal/gdalinfo.py b/python/plugins/processing/algs/gdal/gdalinfo.py index fe48d023308..23ee4b59012 100644 --- a/python/plugins/processing/algs/gdal/gdalinfo.py +++ b/python/plugins/processing/algs/gdal/gdalinfo.py @@ -28,7 +28,8 @@ __revision__ = '$Format:%H$' import os from qgis.PyQt.QtGui import QIcon -from qgis.core import (QgsProcessingParameterRasterLayer, +from qgis.core import (QgsProcessingException, + QgsProcessingParameterRasterLayer, QgsProcessingParameterBoolean, QgsProcessingParameterFileDestination) from processing.algs.gdal.GdalAlgorithm import GdalAlgorithm @@ -97,7 +98,11 @@ class gdalinfo(GdalAlgorithm): arguments.append('-nogcp') if self.parameterAsBool(parameters, self.NO_METADATA, context): arguments.append('-nomd') - arguments.append(self.parameterAsRasterLayer(parameters, self.INPUT, context).source()) + raster = self.parameterAsRasterLayer(parameters, self.INPUT, context) + if raster is None: + raise QgsProcessingException(self.invalidRasterError(parameters, self.INPUT)) + + arguments.append(raster.source()) return [self.commandName(), GdalUtils.escapeAndJoin(arguments)] def processAlgorithm(self, parameters, context, feedback): diff --git a/python/plugins/processing/algs/gdal/hillshade.py b/python/plugins/processing/algs/gdal/hillshade.py index bb8b3c1a1a4..85e0c0ff7ff 100644 --- a/python/plugins/processing/algs/gdal/hillshade.py +++ b/python/plugins/processing/algs/gdal/hillshade.py @@ -29,6 +29,7 @@ __revision__ = '$Format:%H$' import os from qgis.core import (QgsRasterFileWriter, + QgsProcessingException, QgsProcessingParameterDefinition, QgsProcessingParameterRasterLayer, QgsProcessingParameterBand, @@ -129,6 +130,9 @@ class hillshade(GdalAlgorithm): def getConsoleCommands(self, parameters, context, feedback, executing=True): arguments = ['hillshade'] inLayer = self.parameterAsRasterLayer(parameters, self.INPUT, context) + if inLayer is None: + raise QgsProcessingException(self.invalidRasterError(parameters, self.INPUT)) + arguments.append(inLayer.source()) out = self.parameterAsOutputLayer(parameters, self.OUTPUT, context) diff --git a/python/plugins/processing/algs/gdal/nearblack.py b/python/plugins/processing/algs/gdal/nearblack.py index 457a632bfeb..89b2e96e2f6 100644 --- a/python/plugins/processing/algs/gdal/nearblack.py +++ b/python/plugins/processing/algs/gdal/nearblack.py @@ -30,6 +30,7 @@ import os from qgis.PyQt.QtGui import QIcon from qgis.core import (QgsRasterFileWriter, + QgsProcessingException, QgsProcessingParameterDefinition, QgsProcessingParameterRasterLayer, QgsProcessingParameterBoolean, @@ -97,6 +98,8 @@ class nearblack(GdalAlgorithm): def getConsoleCommands(self, parameters, context, feedback, executing=True): inLayer = self.parameterAsRasterLayer(parameters, self.INPUT, context) + if inLayer is None: + raise QgsProcessingException(self.invalidRasterError(parameters, self.INPUT)) arguments = [] arguments.append(inLayer.source()) diff --git a/python/plugins/processing/algs/gdal/ogrinfo.py b/python/plugins/processing/algs/gdal/ogrinfo.py index 367411e6aba..5970f034806 100644 --- a/python/plugins/processing/algs/gdal/ogrinfo.py +++ b/python/plugins/processing/algs/gdal/ogrinfo.py @@ -26,7 +26,8 @@ __copyright__ = '(C) 2012, Victor Olaya' __revision__ = '$Format:%H$' -from qgis.core import (QgsProcessingParameterVectorLayer, +from qgis.core import (QgsProcessingException, + QgsProcessingParameterVectorLayer, QgsProcessingParameterBoolean, QgsProcessingParameterFileDestination) from processing.algs.gdal.GdalAlgorithm import GdalAlgorithm @@ -81,6 +82,9 @@ class ogrinfo(GdalAlgorithm): arguments.append('-nomd') inLayer = self.parameterAsVectorLayer(parameters, self.INPUT, context) + if inLayer is None: + raise QgsProcessingException(self.invalidSourceError(parameters, self.INPUT)) + connectionString = GdalUtils.ogrConnectionString(inLayer.source(), context) arguments.append(connectionString) return arguments diff --git a/python/plugins/processing/algs/gdal/pct2rgb.py b/python/plugins/processing/algs/gdal/pct2rgb.py index 9b260003597..e00d815edff 100644 --- a/python/plugins/processing/algs/gdal/pct2rgb.py +++ b/python/plugins/processing/algs/gdal/pct2rgb.py @@ -30,6 +30,7 @@ import os from qgis.PyQt.QtGui import QIcon from qgis.core import (QgsRasterFileWriter, + QgsProcessingException, QgsProcessingParameterRasterLayer, QgsProcessingParameterBand, QgsProcessingParameterBoolean, @@ -83,6 +84,9 @@ class pct2rgb(GdalAlgorithm): def getConsoleCommands(self, parameters, context, feedback, executing=True): arguments = [] inLayer = self.parameterAsRasterLayer(parameters, self.INPUT, context) + if inLayer is None: + raise QgsProcessingException(self.invalidRasterError(parameters, self.INPUT)) + arguments.append(inLayer.source()) out = self.parameterAsOutputLayer(parameters, self.OUTPUT, context) diff --git a/python/plugins/processing/algs/gdal/polygonize.py b/python/plugins/processing/algs/gdal/polygonize.py index c8f37a1b3d3..cb6f4aba07b 100644 --- a/python/plugins/processing/algs/gdal/polygonize.py +++ b/python/plugins/processing/algs/gdal/polygonize.py @@ -31,6 +31,7 @@ from qgis.PyQt.QtGui import QIcon from qgis.PyQt.QtCore import QFileInfo from qgis.core import (QgsProcessing, + QgsProcessingException, QgsProcessingParameterRasterLayer, QgsProcessingParameterBand, QgsProcessingParameterString, @@ -91,6 +92,9 @@ class polygonize(GdalAlgorithm): def getConsoleCommands(self, parameters, context, feedback, executing=True): arguments = [] inLayer = self.parameterAsRasterLayer(parameters, self.INPUT, context) + if inLayer is None: + raise QgsProcessingException(self.invalidRasterError(parameters, self.INPUT)) + arguments.append(inLayer.source()) outFile = self.parameterAsOutputLayer(parameters, self.OUTPUT, context) diff --git a/python/plugins/processing/algs/gdal/proximity.py b/python/plugins/processing/algs/gdal/proximity.py index f9364fe9924..d65cc27a2ec 100644 --- a/python/plugins/processing/algs/gdal/proximity.py +++ b/python/plugins/processing/algs/gdal/proximity.py @@ -30,6 +30,7 @@ import os from qgis.PyQt.QtGui import QIcon from qgis.core import (QgsRasterFileWriter, + QgsProcessingException, QgsProcessingParameterDefinition, QgsProcessingParameterRasterLayer, QgsProcessingParameterBand, @@ -136,6 +137,9 @@ class proximity(GdalAlgorithm): def getConsoleCommands(self, parameters, context, feedback, executing=True): inLayer = self.parameterAsRasterLayer(parameters, self.INPUT, context) + if inLayer is None: + raise QgsProcessingException(self.invalidRasterError(parameters, self.INPUT)) + distance = self.parameterAsDouble(parameters, self.MAX_DISTANCE, context) replaceValue = self.parameterAsDouble(parameters, self.REPLACE, context) if self.NODATA in parameters and parameters[self.NODATA] is not None: diff --git a/python/plugins/processing/algs/gdal/rgb2pct.py b/python/plugins/processing/algs/gdal/rgb2pct.py index 4198038cdf9..122edebdfb6 100644 --- a/python/plugins/processing/algs/gdal/rgb2pct.py +++ b/python/plugins/processing/algs/gdal/rgb2pct.py @@ -31,6 +31,7 @@ import os from qgis.PyQt.QtGui import QIcon from qgis.core import (QgsRasterFileWriter, + QgsProcessingException, QgsProcessingParameterRasterLayer, QgsProcessingParameterNumber, QgsProcessingParameterRasterDestination) @@ -87,7 +88,11 @@ class rgb2pct(GdalAlgorithm): out = self.parameterAsOutputLayer(parameters, self.OUTPUT, context) arguments.append('-of') arguments.append(QgsRasterFileWriter.driverForExtension(os.path.splitext(out)[1])) - arguments.append(self.parameterAsRasterLayer(parameters, self.INPUT, context).source()) + raster = self.parameterAsRasterLayer(parameters, self.INPUT, context) + if raster is None: + raise QgsProcessingException(self.invalidRasterError(parameters, self.INPUT)) + + arguments.append(raster.source()) arguments.append(out) if isWindows(): diff --git a/python/plugins/processing/algs/gdal/roughness.py b/python/plugins/processing/algs/gdal/roughness.py index 860da47e54e..94a5eef9dbb 100644 --- a/python/plugins/processing/algs/gdal/roughness.py +++ b/python/plugins/processing/algs/gdal/roughness.py @@ -28,6 +28,7 @@ __revision__ = '$Format:%H$' import os from qgis.core import (QgsRasterFileWriter, + QgsProcessingException, QgsProcessingParameterDefinition, QgsProcessingParameterRasterLayer, QgsProcessingParameterBand, @@ -91,6 +92,9 @@ class roughness(GdalAlgorithm): def getConsoleCommands(self, parameters, context, feedback, executing=True): arguments = ['roughness'] inLayer = self.parameterAsRasterLayer(parameters, self.INPUT, context) + if inLayer is None: + raise QgsProcessingException(self.invalidRasterError(parameters, self.INPUT)) + arguments.append(inLayer.source()) out = self.parameterAsOutputLayer(parameters, self.OUTPUT, context) diff --git a/python/plugins/processing/algs/gdal/sieve.py b/python/plugins/processing/algs/gdal/sieve.py index cc1e44574be..334c656fde6 100644 --- a/python/plugins/processing/algs/gdal/sieve.py +++ b/python/plugins/processing/algs/gdal/sieve.py @@ -30,6 +30,7 @@ import os from qgis.PyQt.QtGui import QIcon from qgis.core import (QgsRasterFileWriter, + QgsProcessingException, QgsProcessingParameterRasterLayer, QgsProcessingParameterNumber, QgsProcessingParameterBoolean, @@ -111,7 +112,11 @@ class sieve(GdalAlgorithm): arguments.append('-of') arguments.append(QgsRasterFileWriter.driverForExtension(os.path.splitext(out)[1])) - arguments.append(self.parameterAsRasterLayer(parameters, self.INPUT, context).source()) + raster = self.parameterAsRasterLayer(parameters, self.INPUT, context) + if raster is None: + raise QgsProcessingException(self.invalidRasterError(parameters, self.INPUT)) + + arguments.append(raster.source()) arguments.append(out) commands = [] diff --git a/python/plugins/processing/algs/gdal/slope.py b/python/plugins/processing/algs/gdal/slope.py index 7eee798566b..4c2ee59354c 100644 --- a/python/plugins/processing/algs/gdal/slope.py +++ b/python/plugins/processing/algs/gdal/slope.py @@ -29,6 +29,7 @@ __revision__ = '$Format:%H$' import os from qgis.core import (QgsRasterFileWriter, + QgsProcessingException, QgsProcessingParameterDefinition, QgsProcessingParameterRasterLayer, QgsProcessingParameterBand, @@ -106,6 +107,9 @@ class slope(GdalAlgorithm): def getConsoleCommands(self, parameters, context, feedback, executing=True): arguments = ['slope'] inLayer = self.parameterAsRasterLayer(parameters, self.INPUT, context) + if inLayer is None: + raise QgsProcessingException(self.invalidRasterError(parameters, self.INPUT)) + arguments.append(inLayer.source()) out = self.parameterAsOutputLayer(parameters, self.OUTPUT, context) diff --git a/python/plugins/processing/algs/gdal/tpi.py b/python/plugins/processing/algs/gdal/tpi.py index 41b3c617508..3a67fa953bb 100644 --- a/python/plugins/processing/algs/gdal/tpi.py +++ b/python/plugins/processing/algs/gdal/tpi.py @@ -28,7 +28,8 @@ __revision__ = '$Format:%H$' import os -from qgis.core import (QgsProcessingParameterDefinition, +from qgis.core import (QgsProcessingException, + QgsProcessingParameterDefinition, QgsProcessingParameterRasterLayer, QgsProcessingParameterBand, QgsProcessingParameterString, @@ -90,6 +91,9 @@ class tpi(GdalAlgorithm): def getConsoleCommands(self, parameters, context, feedback, executing=True): arguments = ['TPI'] inLayer = self.parameterAsRasterLayer(parameters, self.INPUT, context) + if inLayer is None: + raise QgsProcessingException(self.invalidRasterError(parameters, self.INPUT)) + arguments.append(inLayer.source()) out = self.parameterAsOutputLayer(parameters, self.OUTPUT, context) arguments.append(out) diff --git a/python/plugins/processing/algs/gdal/translate.py b/python/plugins/processing/algs/gdal/translate.py index a4d66ee281d..89e155482fa 100644 --- a/python/plugins/processing/algs/gdal/translate.py +++ b/python/plugins/processing/algs/gdal/translate.py @@ -30,6 +30,7 @@ import os from qgis.PyQt.QtGui import QIcon from qgis.core import (QgsRasterFileWriter, + QgsProcessingException, QgsProcessingParameterDefinition, QgsProcessingParameterRasterLayer, QgsProcessingParameterNumber, @@ -115,6 +116,9 @@ class translate(GdalAlgorithm): def getConsoleCommands(self, parameters, context, feedback, executing=True): inLayer = self.parameterAsRasterLayer(parameters, self.INPUT, context) + if inLayer is None: + raise QgsProcessingException(self.invalidRasterError(parameters, self.INPUT)) + out = self.parameterAsOutputLayer(parameters, self.OUTPUT, context) if self.NODATA in parameters and parameters[self.NODATA] is not None: nodata = self.parameterAsDouble(parameters, self.NODATA, context) diff --git a/python/plugins/processing/algs/gdal/tri.py b/python/plugins/processing/algs/gdal/tri.py index 7b88d685090..09609f10f4b 100644 --- a/python/plugins/processing/algs/gdal/tri.py +++ b/python/plugins/processing/algs/gdal/tri.py @@ -27,7 +27,8 @@ __revision__ = '$Format:%H$' import os -from qgis.core import (QgsProcessingParameterDefinition, +from qgis.core import (QgsProcessingException, + QgsProcessingParameterDefinition, QgsProcessingParameterRasterLayer, QgsProcessingParameterBand, QgsProcessingParameterString, @@ -89,6 +90,9 @@ class tri(GdalAlgorithm): def getConsoleCommands(self, parameters, context, feedback, executing=True): arguments = ['TRI'] inLayer = self.parameterAsRasterLayer(parameters, self.INPUT, context) + if inLayer is None: + raise QgsProcessingException(self.invalidRasterError(parameters, self.INPUT)) + arguments.append(inLayer.source()) out = self.parameterAsOutputLayer(parameters, self.OUTPUT, context) arguments.append(out) diff --git a/python/plugins/processing/algs/gdal/warp.py b/python/plugins/processing/algs/gdal/warp.py index c4d77b78692..efbf4015dd0 100644 --- a/python/plugins/processing/algs/gdal/warp.py +++ b/python/plugins/processing/algs/gdal/warp.py @@ -29,6 +29,7 @@ import os from qgis.PyQt.QtGui import QIcon from qgis.core import (QgsRasterFileWriter, + QgsProcessingException, QgsProcessingParameterDefinition, QgsProcessingParameterRasterLayer, QgsProcessingParameterCrs, @@ -163,6 +164,9 @@ class warp(GdalAlgorithm): def getConsoleCommands(self, parameters, context, feedback, executing=True): inLayer = self.parameterAsRasterLayer(parameters, self.INPUT, context) + if inLayer is None: + raise QgsProcessingException(self.invalidRasterError(parameters, self.INPUT)) + out = self.parameterAsOutputLayer(parameters, self.OUTPUT, context) sourceCrs = self.parameterAsCrs(parameters, self.SOURCE_CRS, context) targetCrs = self.parameterAsCrs(parameters, self.TARGET_CRS, context) diff --git a/python/plugins/processing/tests/GdalAlgorithmsTest.py b/python/plugins/processing/tests/GdalAlgorithmsTest.py index 7fc7c15a41d..9b97ec67595 100644 --- a/python/plugins/processing/tests/GdalAlgorithmsTest.py +++ b/python/plugins/processing/tests/GdalAlgorithmsTest.py @@ -52,7 +52,7 @@ from qgis.core import (QgsProcessingContext, QgsPointXY, QgsProject, QgsRectangle, - QgsProcessingUtils, + QgsProcessingException, QgsProcessingFeatureSourceDefinition) import nose2 import os @@ -90,6 +90,18 @@ class TestGdalAlgorithms(unittest.TestCase, AlgorithmsTestBase.AlgorithmsTest): for a in p.algorithms(): self.assertTrue(a.commandName(), 'Algorithm {} has no commandName!'.format(a.id())) + def testNoParameters(self): + # Test that algorithms throw QgsProcessingExceptions and not base Python + # exceptions when no parameters specified + p = QgsApplication.processingRegistry().providerById('gdal') + context = QgsProcessingContext() + feedback = QgsProcessingFeedback() + for a in p.algorithms(): + try: + a.getConsoleCommands({}, context, feedback) + except QgsProcessingException: + pass + def testGetOgrCompatibleSourceFromMemoryLayer(self): # create a memory layer and add to project and context layer = QgsVectorLayer("Point?field=fldtxt:string&field=fldint:integer", diff --git a/python/plugins/processing/tools/postgis.py b/python/plugins/processing/tools/postgis.py index 9ddb1a87d61..3d327589b8e 100644 --- a/python/plugins/processing/tools/postgis.py +++ b/python/plugins/processing/tools/postgis.py @@ -30,7 +30,10 @@ import psycopg2.extensions # For isolation levels import re import os -from qgis.core import QgsDataSourceUri, QgsCredentials, QgsSettings +from qgis.core import (QgsProcessingException, + QgsDataSourceUri, + QgsCredentials, + QgsSettings) from qgis.PyQt.QtCore import QCoreApplication @@ -44,7 +47,7 @@ def uri_from_name(conn_name): settings.beginGroup(u"/PostgreSQL/connections/%s" % conn_name) if not settings.contains("database"): # non-existent entry? - raise DbError(QCoreApplication.translate("PostGIS", 'There is no defined database connection "{0}".').format(conn_name)) + raise QgsProcessingException(QCoreApplication.translate("PostGIS", 'There is no defined database connection "{0}".').format(conn_name)) uri = QgsDataSourceUri() @@ -126,19 +129,6 @@ class TableIndex(object): self.columns = list(map(int, columns.split(' '))) -class DbError(Exception): - - def __init__(self, message, query=None): - self.message = message - self.query = query - - def __str__(self): - text = "MESSAGE: {}".format(self.message) - if self.query: - text = "{}\nQUERY: {}".format(text, self.query) - return text - - class TableField(object): def __init__(self, name, data_type, is_null=None, default=None, @@ -207,7 +197,7 @@ class GeoDB(object): break except psycopg2.OperationalError as e: if i == 3: - raise DbError(str(e)) + raise QgsProcessingException(str(e)) err = str(e) user = self.uri.username() @@ -217,7 +207,7 @@ class GeoDB(object): password, err) if not ok: - raise DbError(QCoreApplication.translate("PostGIS", 'Action canceled by user')) + raise QgsProcessingException(QCoreApplication.translate("PostGIS", 'Action canceled by user')) if user: self.uri.setUsername(user) if password: @@ -823,8 +813,8 @@ class GeoDB(object): try: cursor.execute(sql) except psycopg2.Error as e: - raise DbError(str(e), - e.cursor.query.decode(e.cursor.connection.encoding)) + raise QgsProcessingException(str(e) + ' QUERY: ' + + e.cursor.query.decode(e.cursor.connection.encoding)) def _exec_sql_and_commit(self, sql): """Tries to execute and commit some action, on error it rolls