Skip to content

Commit a1d46de

Browse files
committed
[processing] Fix evaluation of vector layer references to compatible feature sources
Refs #18545
1 parent 4335130 commit a1d46de

File tree

2 files changed

+51
-13
lines changed

2 files changed

+51
-13
lines changed

src/core/processing/qgsprocessingparameters.cpp

Lines changed: 33 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -321,25 +321,45 @@ QString QgsProcessingParameters::parameterAsCompatibleSourceLayerPath( const Qgs
321321
val = fromVar.source;
322322
}
323323

324-
QString layerRef;
325324
if ( val.canConvert<QgsProperty>() )
326325
{
327-
layerRef = val.value< QgsProperty >().valueAsString( context.expressionContext(), definition->defaultValue().toString() );
328-
}
329-
else if ( !val.isValid() || val.toString().isEmpty() )
330-
{
331-
// fall back to default
332-
layerRef = definition->defaultValue().toString();
326+
val = val.value< QgsProperty >().valueAsString( context.expressionContext(), definition->defaultValue().toString() );
333327
}
334-
else
328+
329+
QgsVectorLayer *vl = nullptr;
330+
vl = qobject_cast< QgsVectorLayer * >( qvariant_cast<QObject *>( val ) );
331+
332+
if ( !vl )
335333
{
336-
layerRef = val.toString();
337-
}
334+
QString layerRef;
335+
if ( val.canConvert<QgsProperty>() )
336+
{
337+
layerRef = val.value< QgsProperty >().valueAsString( context.expressionContext(), definition->defaultValue().toString() );
338+
}
339+
else if ( !val.isValid() || val.toString().isEmpty() )
340+
{
341+
// fall back to default
342+
val = definition->defaultValue();
338343

339-
if ( layerRef.isEmpty() )
340-
return QString();
344+
// default value may be a vector layer
345+
vl = qobject_cast< QgsVectorLayer * >( qvariant_cast<QObject *>( val ) );
346+
if ( !vl )
347+
layerRef = definition->defaultValue().toString();
348+
}
349+
else
350+
{
351+
layerRef = val.toString();
352+
}
353+
354+
if ( !vl )
355+
{
356+
if ( layerRef.isEmpty() )
357+
return QString();
358+
359+
vl = qobject_cast< QgsVectorLayer *>( QgsProcessingUtils::mapLayerFromString( layerRef, context ) );
360+
}
361+
}
341362

342-
QgsVectorLayer *vl = qobject_cast< QgsVectorLayer *>( QgsProcessingUtils::mapLayerFromString( layerRef, context ) );
343363
if ( !vl )
344364
return QString();
345365

tests/src/analysis/testqgsprocessing.cpp

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6391,6 +6391,18 @@ void TestQgsProcessing::convertCompatible()
63916391
out = QgsProcessingParameters::parameterAsCompatibleSourceLayerPath( def.get(), params, context, QStringList() << "shp", QString( "shp" ), &feedback );
63926392
QCOMPARE( out, layer->source() );
63936393

6394+
// incompatible format, will be converted
6395+
out = QgsProcessingParameters::parameterAsCompatibleSourceLayerPath( def.get(), params, context, QStringList() << "tab", QString( "tab" ), &feedback );
6396+
QVERIFY( out != layer->source() );
6397+
QVERIFY( out.endsWith( ".tab" ) );
6398+
QVERIFY( out.startsWith( QgsProcessingUtils::tempFolder() ) );
6399+
6400+
// layer as input
6401+
params.insert( QStringLiteral( "source" ), QVariant::fromValue( layer ) );
6402+
out = QgsProcessingParameters::parameterAsCompatibleSourceLayerPath( def.get(), params, context, QStringList() << "shp", QString( "shp" ), &feedback );
6403+
QCOMPARE( out, layer->source() );
6404+
6405+
// incompatible format, will be converted
63946406
out = QgsProcessingParameters::parameterAsCompatibleSourceLayerPath( def.get(), params, context, QStringList() << "tab", QString( "tab" ), &feedback );
63956407
QVERIFY( out != layer->source() );
63966408
QVERIFY( out.endsWith( ".tab" ) );
@@ -6402,6 +6414,12 @@ void TestQgsProcessing::convertCompatible()
64026414
QVERIFY( out != layer->source() );
64036415
QVERIFY( out.endsWith( ".shp" ) );
64046416
QVERIFY( out.startsWith( QgsProcessingUtils::tempFolder() ) );
6417+
6418+
// vector layer as default
6419+
def.reset( new QgsProcessingParameterFeatureSource( QStringLiteral( "source" ), QString(), QList<int>(), QVariant::fromValue( layer ) ) );
6420+
params.remove( QStringLiteral( "source" ) );
6421+
out = QgsProcessingParameters::parameterAsCompatibleSourceLayerPath( def.get(), params, context, QStringList() << "shp", QString( "shp" ), &feedback );
6422+
QCOMPARE( out, layer->source() );
64056423
}
64066424

64076425
void TestQgsProcessing::create()

0 commit comments

Comments
 (0)