From 904a1202826781168b4ccc843ad2608db1e4b950 Mon Sep 17 00:00:00 2001 From: Alessandro Pasotti Date: Thu, 15 Sep 2022 09:58:08 +0200 Subject: [PATCH] Hide real name string args from schema and messages --- .../qgsserverquerystringparameter.sip.in | 17 ++++++++++++++ src/server/qgsserverquerystringparameter.cpp | 10 +++++++++ src/server/qgsserverquerystringparameter.h | 18 +++++++++++++++ src/server/services/wfs3/qgswfs3handlers.cpp | 22 +++++++++++++------ .../api/test_wfs3_api_project.json | 2 +- 5 files changed, 61 insertions(+), 8 deletions(-) diff --git a/python/server/auto_generated/qgsserverquerystringparameter.sip.in b/python/server/auto_generated/qgsserverquerystringparameter.sip.in index f7fca0dde14..efb99ae9111 100644 --- a/python/server/auto_generated/qgsserverquerystringparameter.sip.in +++ b/python/server/auto_generated/qgsserverquerystringparameter.sip.in @@ -98,6 +98,23 @@ Returns the name of the parameter void setDescription( const QString &description ); %Docstring Sets validator ``description`` +%End + + bool hidden() const; +%Docstring +Returns ``True`` if the parameter is hidden from the schema. + +Hidden params can be useful to implement legacy parameters or +parameters that can be accepted without being advertised. + +.. versionadded:: 3.28 +%End + + void setHidden( bool hidden ); +%Docstring +Set the parameter's ``hidden`` status, parametes are not hidden by default. + +.. versionadded:: 3.28 %End }; diff --git a/src/server/qgsserverquerystringparameter.cpp b/src/server/qgsserverquerystringparameter.cpp index 03df6ad4472..21c3ff993b0 100644 --- a/src/server/qgsserverquerystringparameter.cpp +++ b/src/server/qgsserverquerystringparameter.cpp @@ -159,3 +159,13 @@ void QgsServerQueryStringParameter::setDescription( const QString &description ) { mDescription = description; } + +bool QgsServerQueryStringParameter::hidden() const +{ + return mHidden; +} + +void QgsServerQueryStringParameter::setHidden( bool hidden ) +{ + mHidden = hidden; +} diff --git a/src/server/qgsserverquerystringparameter.h b/src/server/qgsserverquerystringparameter.h index da174a7c9bb..fcce7454c21 100644 --- a/src/server/qgsserverquerystringparameter.h +++ b/src/server/qgsserverquerystringparameter.h @@ -140,6 +140,23 @@ class SERVER_EXPORT QgsServerQueryStringParameter */ void setDescription( const QString &description ); + /** + * Returns TRUE if the parameter is hidden from the schema. + * + * Hidden params can be useful to implement legacy parameters or + * parameters that can be accepted without being advertised. + * + * \since QGIS 3.28 + */ + bool hidden() const; + + /** + * Set the parameter's \a hidden status, parametes are not hidden by default. + * + * \since QGIS 3.28 + */ + void setHidden( bool hidden ); + private: QString mName; @@ -148,6 +165,7 @@ class SERVER_EXPORT QgsServerQueryStringParameter customValidator mCustomValidator = nullptr; QString mDescription; QVariant mDefaultValue; + bool mHidden = false; friend class TestQgsServerQueryStringParameter; diff --git a/src/server/services/wfs3/qgswfs3handlers.cpp b/src/server/services/wfs3/qgswfs3handlers.cpp index 72620c89f1e..f7e1e0532e0 100644 --- a/src/server/services/wfs3/qgswfs3handlers.cpp +++ b/src/server/services/wfs3/qgswfs3handlers.cpp @@ -813,19 +813,24 @@ QList QgsWfs3CollectionsItemsHandler::parameters( params.push_back( p ); } + // We want to accept both displayName and name. const QgsFields published { publishedFields( mapLayer, context ) }; - QSet publishedFieldNames; + QStringList publishedFieldNames; + QStringList publishedFieldDisplayNames; for ( const auto &f : published ) { - publishedFieldNames.insert( f.name() ); - publishedFieldNames.insert( f.displayName() ); + publishedFieldDisplayNames.push_back( f.displayName() ); + if ( f.name() != f.displayName() ) + { + publishedFieldNames.push_back( f.name() ); + } } // Properties (CSV list of properties to return) QgsServerQueryStringParameter properties { QStringLiteral( "properties" ), false, QgsServerQueryStringParameter::Type::List, QStringLiteral( "Comma separated list of feature property names to be added to the result. Valid values: %1" ) - .arg( publishedFieldNames.values().join( QLatin1String( "', '" ) ) + .arg( publishedFieldDisplayNames.join( QLatin1String( "', '" ) ) .append( '\'' ) .prepend( '\'' ) ) }; @@ -834,7 +839,7 @@ QList QgsWfs3CollectionsItemsHandler::parameters( const QStringList properties { value.toStringList() }; for ( const auto &p : properties ) { - if ( ! publishedFieldNames.contains( p ) ) + if ( ! publishedFieldNames.contains( p ) && ! publishedFieldDisplayNames.contains( p ) ) { return false; } @@ -992,7 +997,7 @@ json QgsWfs3CollectionsItemsHandler::schema( const QgsServerApiContext &context const QList requestParameters { parameters( layerContext ) }; for ( const auto &p : requestParameters ) { - if ( ! componentNames.contains( p.name() ) ) + if ( ! p.hidden() && ! componentNames.contains( p.name() ) ) componentParameters.push_back( p.data() ); } @@ -1099,10 +1104,13 @@ const QList QgsWfs3CollectionsItemsHandler::field const QgsServerQueryStringParameter fieldParam { fName, false, t, QStringLiteral( "Retrieve features filtered by: %1 (%2)" ).arg( fName, QgsServerQueryStringParameter::typeName( t ) ) }; params.push_back( fieldParam ); + + // Add real field name if alias was used but set it as hidden if ( fName != f.name() ) { - const QgsServerQueryStringParameter fieldParam { f.name(), false, + QgsServerQueryStringParameter fieldParam { f.name(), false, t, QStringLiteral( "Retrieve features filtered by field: %1 (%2), aliased by %3" ).arg( f.name(), QgsServerQueryStringParameter::typeName( t ), f.alias() ) }; + fieldParam.setHidden( true ); params.push_back( fieldParam ); } } diff --git a/tests/testdata/qgis_server/api/test_wfs3_api_project.json b/tests/testdata/qgis_server/api/test_wfs3_api_project.json index d6d346fd4a5..6cd8873e8d0 100644 --- a/tests/testdata/qgis_server/api/test_wfs3_api_project.json +++ b/tests/testdata/qgis_server/api/test_wfs3_api_project.json @@ -1098,7 +1098,7 @@ Content-Type: application/vnd.oai.openapi+json;version=3.0 "style": "form" }, { - "description": "Comma separated list of feature property names to be added to the result. Valid values: 'id', 'name', 'utf8nameè'", + "description": "Comma separated list of feature property names to be added to the result. Valid values: 'alias_id', 'alias_name', 'utf8nameè'", "explode": false, "in": "query", "name": "properties",