Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Processing metadata tools #59913

Merged
merged 8 commits into from
Dec 17, 2024
Merged
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Next Next commit
add native add history metadata algorithm
alexbruy committed Dec 13, 2024
commit 0c9709c30f778bbdcf8bd7c3263b2d86f3a34a21
71 changes: 71 additions & 0 deletions src/analysis/processing/qgsmetadataalgorithms.cpp
Original file line number Diff line number Diff line change
@@ -248,4 +248,75 @@ QVariantMap QgsExportLayerMetadataAlgorithm::processAlgorithm( const QVariantMap
return results;
}

///

QString QgsAddHistoryMetadataAlgorithm::name() const
{
return QStringLiteral( "addhistorymetadata" );
}

QString QgsAddHistoryMetadataAlgorithm::displayName() const
{
return QObject::tr( "Add history metadata" );
}

QStringList QgsAddHistoryMetadataAlgorithm::tags() const
{
return QObject::tr( "add,history,metadata" ).split( ',' );
}

QString QgsAddHistoryMetadataAlgorithm::group() const
{
return QObject::tr( "Metadata tools" );
}

QString QgsAddHistoryMetadataAlgorithm::groupId() const
{
return QStringLiteral( "metadatatools" );
}

QString QgsAddHistoryMetadataAlgorithm::shortHelpString() const
{
return QObject::tr( "Adds a new history entry to the layer's metadata." );
}

QgsAddHistoryMetadataAlgorithm *QgsAddHistoryMetadataAlgorithm::createInstance() const
{
return new QgsAddHistoryMetadataAlgorithm();
}

void QgsAddHistoryMetadataAlgorithm::initAlgorithm( const QVariantMap & )
{
addParameter( new QgsProcessingParameterMapLayer( QStringLiteral( "INPUT" ), QObject::tr( "Layer" ) ) );
addParameter( new QgsProcessingParameterString( QStringLiteral( "HISTORY" ), QObject::tr( "History entry" ) ) );
addOutput( new QgsProcessingOutputMapLayer( QStringLiteral( "OUTPUT" ), QObject::tr( "Updated" ) ) );
}

bool QgsAddHistoryMetadataAlgorithm::prepareAlgorithm( const QVariantMap &parameters, QgsProcessingContext &context, QgsProcessingFeedback * )
{
QgsMapLayer *layer = parameterAsLayer( parameters, QStringLiteral( "INPUT" ), context );
const QString history = parameterAsString( parameters, QStringLiteral( "HISTORY" ), context );

if ( !layer )
throw QgsProcessingException( QObject::tr( "Invalid input layer" ) );

mLayerId = layer->id();

std::unique_ptr<QgsLayerMetadata> md( layer->metadata().clone() );
md->addHistoryItem( history );
layer->setMetadata( *md.get() );

return true;
}

QVariantMap QgsAddHistoryMetadataAlgorithm::processAlgorithm( const QVariantMap &parameters, QgsProcessingContext &context, QgsProcessingFeedback * )
{
Q_UNUSED( parameters );
Q_UNUSED( context );

QVariantMap results;
results.insert( QStringLiteral( "OUTPUT" ), mLayerId );
return results;
}

///@endcond
24 changes: 24 additions & 0 deletions src/analysis/processing/qgsmetadataalgorithms.h
Original file line number Diff line number Diff line change
@@ -97,6 +97,30 @@ class QgsExportLayerMetadataAlgorithm : public QgsProcessingAlgorithm
QString mLayerId;
};

/**
* Native add history metadata algorithm.
*/
class QgsAddHistoryMetadataAlgorithm : public QgsProcessingAlgorithm
{
public:
QgsAddHistoryMetadataAlgorithm() = default;
QString name() const override;
QString displayName() const override;
QStringList tags() const override;
QString group() const override;
QString groupId() const override;
QString shortHelpString() const override;
void initAlgorithm( const QVariantMap &configuration = QVariantMap() ) override;
QgsAddHistoryMetadataAlgorithm *createInstance() const override SIP_FACTORY;

protected:
bool prepareAlgorithm( const QVariantMap &parameters, QgsProcessingContext &context, QgsProcessingFeedback *feedback ) override;
QVariantMap processAlgorithm( const QVariantMap &parameters, QgsProcessingContext &context, QgsProcessingFeedback * ) override;

private:
QString mLayerId;
};

///@endcond PRIVATE

#endif // QGSMETADATAALGORITHMS_H
1 change: 1 addition & 0 deletions src/analysis/processing/qgsnativealgorithms.cpp
Original file line number Diff line number Diff line change
@@ -292,6 +292,7 @@ Qgis::ProcessingProviderFlags QgsNativeAlgorithms::flags() const
void QgsNativeAlgorithms::loadAlgorithms()
{
const QgsScopedRuntimeProfile profile( QObject::tr( "QGIS native provider" ) );
addAlgorithm( new QgsAddHistoryMetadataAlgorithm() );
addAlgorithm( new QgsAddIncrementalFieldAlgorithm() );
addAlgorithm( new QgsAddTableFieldAlgorithm() );
addAlgorithm( new QgsAddXYFieldsAlgorithm() );
44 changes: 44 additions & 0 deletions tests/src/analysis/testqgsprocessingalgspt2.cpp
Original file line number Diff line number Diff line change
@@ -107,6 +107,7 @@ class TestQgsProcessingAlgsPt2 : public QgsTest
void copyMetadata();
void applyMetadata();
void exportMetadata();
void addHistoryMetadata();

private:
QString mPointLayerPath;
@@ -1988,6 +1989,49 @@ void TestQgsProcessingAlgsPt2::exportMetadata()
QCOMPARE( md.abstract(), exportedMetadata.abstract() );
}

void TestQgsProcessingAlgsPt2::addHistoryMetadata()
{
std::unique_ptr<QgsVectorLayer> layer = std::make_unique<QgsVectorLayer>( QStringLiteral( "Point?crs=epsg:4326&field=pk:int&field=col1:string" ), QStringLiteral( "input" ), QStringLiteral( "memory" ) );
QVERIFY( layer->isValid() );

QgsLayerMetadata md;
md.setTitle( QStringLiteral( "Title" ) );
md.setAbstract( QStringLiteral( "Abstract" ) );
layer->setMetadata( md );

std::unique_ptr<QgsProcessingAlgorithm> alg( QgsApplication::processingRegistry()->createAlgorithmById( QStringLiteral( "native:addhistorymetadata" ) ) );
QVERIFY( alg != nullptr );

QVariantMap parameters;
parameters.insert( QStringLiteral( "INPUT" ), QVariant::fromValue( layer.get() ) );
parameters.insert( QStringLiteral( "HISTORY" ), QStringLiteral( "do something" ) );

bool ok = false;
std::unique_ptr<QgsProcessingContext> context = std::make_unique<QgsProcessingContext>();
QgsProcessingFeedback feedback;
QVariantMap results;
results = alg->run( parameters, *context, &feedback, &ok );
QVERIFY( ok );

QCOMPARE( results.value( QStringLiteral( "OUTPUT" ) ), layer->id() );

QStringList history = layer->metadata().history();
QCOMPARE( history.count(), 1 );
QCOMPARE( history.at( 0 ), QStringLiteral( "do something" ) );

parameters[QStringLiteral( "HISTORY" )] = QStringLiteral( "do something else" );

ok = false;
results = alg->run( parameters, *context, &feedback, &ok );
QVERIFY( ok );

QCOMPARE( results.value( QStringLiteral( "OUTPUT" ) ), layer->id() );

history = layer->metadata().history();
QCOMPARE( history.count(), 2 );
QCOMPARE( history.at( 0 ), QStringLiteral( "do something" ) );
QCOMPARE( history.at( 1 ), QStringLiteral( "do something else" ) );
}

QGSTEST_MAIN( TestQgsProcessingAlgsPt2 )
#include "testqgsprocessingalgspt2.moc"