From 603ccb290455dbc29ec94430a96900c1aa7cd1ef Mon Sep 17 00:00:00 2001 From: Nyall Dawson Date: Thu, 23 Feb 2023 13:26:52 +1000 Subject: [PATCH] [processing] Gracefully handle algorithms with no provider set Fixes #51971 --- python/plugins/processing/gui/AlgorithmDialog.py | 2 +- .../plugins/processing/gui/AlgorithmLocatorFilter.py | 12 ++++++++++-- .../models/qgsprocessingmodelalgorithm.cpp | 2 +- .../processing/qgsprocessingalgorithmdialogbase.cpp | 6 +++--- src/process/qgsprocess.cpp | 3 ++- 5 files changed, 17 insertions(+), 8 deletions(-) diff --git a/python/plugins/processing/gui/AlgorithmDialog.py b/python/plugins/processing/gui/AlgorithmDialog.py index e502030b2a4..15663809999 100644 --- a/python/plugins/processing/gui/AlgorithmDialog.py +++ b/python/plugins/processing/gui/AlgorithmDialog.py @@ -205,7 +205,7 @@ class AlgorithmDialog(QgsProcessingAlgorithmDialogBase): self.clearProgress() self.feedback.pushVersionInfo(self.algorithm().provider()) - if self.algorithm().provider().warningMessage(): + if self.algorithm().provider() and self.algorithm().provider().warningMessage(): self.feedback.reportError(self.algorithm().provider().warningMessage()) self.feedback.pushInfo( diff --git a/python/plugins/processing/gui/AlgorithmLocatorFilter.py b/python/plugins/processing/gui/AlgorithmLocatorFilter.py index 7a43c10e58e..6772ef388fd 100644 --- a/python/plugins/processing/gui/AlgorithmLocatorFilter.py +++ b/python/plugins/processing/gui/AlgorithmLocatorFilter.py @@ -87,7 +87,11 @@ class AlgorithmLocatorFilter(QgsLocatorFilter): string = string.lower() tagScore = 0 - tags = [*a.tags(), a.provider().name()] + if a.provider(): + tags = [*a.tags(), a.provider().name()] + else: + tags = a.tags() + if a.group(): tags.append(a.group()) @@ -178,7 +182,11 @@ class InPlaceAlgorithmLocatorFilter(QgsLocatorFilter): string = string.lower() tagScore = 0 - tags = [*a.tags(), a.provider().name()] + if a.provider(): + tags = [*a.tags(), a.provider().name()] + else: + tags = a.tags() + if a.group(): tags.append(a.group()) diff --git a/src/core/processing/models/qgsprocessingmodelalgorithm.cpp b/src/core/processing/models/qgsprocessingmodelalgorithm.cpp index 5ade912ffe7..de5b88db994 100644 --- a/src/core/processing/models/qgsprocessingmodelalgorithm.cpp +++ b/src/core/processing/models/qgsprocessingmodelalgorithm.cpp @@ -1439,7 +1439,7 @@ void QgsProcessingModelAlgorithm::updateDestinationParameters() // add some metadata so we can easily link this parameter back to the child source param->metadata().insert( QStringLiteral( "_modelChildId" ), outputIt->childId() ); param->metadata().insert( QStringLiteral( "_modelChildOutputName" ), outputIt->name() ); - param->metadata().insert( QStringLiteral( "_modelChildProvider" ), childIt->algorithm()->provider()->id() ); + param->metadata().insert( QStringLiteral( "_modelChildProvider" ), childIt->algorithm()->provider() ? childIt->algorithm()->provider()->id() : QString() ); param->setDescription( outputIt->description() ); param->setDefaultValue( outputIt->defaultValue() ); diff --git a/src/gui/processing/qgsprocessingalgorithmdialogbase.cpp b/src/gui/processing/qgsprocessingalgorithmdialogbase.cpp index e6e0b96c69d..f2a4b1a70a4 100644 --- a/src/gui/processing/qgsprocessingalgorithmdialogbase.cpp +++ b/src/gui/processing/qgsprocessingalgorithmdialogbase.cpp @@ -314,12 +314,12 @@ void QgsProcessingAlgorithmDialogBase::setAlgorithm( QgsProcessingAlgorithm *alg textShortHelp->show(); } - if ( algorithm->helpUrl().isEmpty() && algorithm->provider()->helpId().isEmpty() ) + if ( algorithm->helpUrl().isEmpty() && ( !algorithm->provider() || algorithm->provider()->helpId().isEmpty() ) ) { mButtonBox->removeButton( mButtonBox->button( QDialogButtonBox::Help ) ); } - const QString warning = algorithm->provider()->warningMessage(); + const QString warning = algorithm->provider() ? algorithm->provider()->warningMessage() : QString(); if ( !warning.isEmpty() ) { mMessageBar->pushMessage( warning, Qgis::MessageLevel::Warning ); @@ -449,7 +449,7 @@ void QgsProcessingAlgorithmDialogBase::finished( bool, const QVariantMap &, QgsP void QgsProcessingAlgorithmDialogBase::openHelp() { QUrl algHelp = mAlgorithm->helpUrl(); - if ( algHelp.isEmpty() ) + if ( algHelp.isEmpty() && mAlgorithm->provider() ) { algHelp = QgsHelp::helpUrl( QStringLiteral( "processing_algs/%1/%2.html#%3" ).arg( mAlgorithm->provider()->helpId(), mAlgorithm->groupId(), QStringLiteral( "%1%2" ).arg( mAlgorithm->provider()->helpId() ).arg( mAlgorithm->name() ) ) ); } diff --git a/src/process/qgsprocess.cpp b/src/process/qgsprocess.cpp index 59bde1449bb..f43074b566a 100644 --- a/src/process/qgsprocess.cpp +++ b/src/process/qgsprocess.cpp @@ -856,7 +856,8 @@ int QgsProcessingExec::showAlgorithmHelp( const QString &inputId, bool useJson ) addAlgorithmInformation( algorithmDetails, alg ); json.insert( QStringLiteral( "algorithm_details" ), algorithmDetails ); QVariantMap providerJson; - addProviderInformation( providerJson, alg->provider() ); + if ( alg->provider() ) + addProviderInformation( providerJson, alg->provider() ); json.insert( QStringLiteral( "provider_details" ), providerJson ); }