Fix server getPrint accesscontrol for map items

Fixes #41800
This commit is contained in:
Alessandro Pasotti 2021-02-24 19:30:13 +01:00
parent d9a47a1e46
commit 6d02a2abb0
9 changed files with 75 additions and 8 deletions

View File

@ -311,6 +311,20 @@ Returns the current list of predefined scales for use with the layout.
.. seealso:: :py:func:`setPredefinedScales`
.. versionadded:: 3.10
%End
QgsFeatureFilterProvider *featureFilterProvider() const;
%Docstring
Returns the possibly NULL featureFilterProvider
.. versionadded:: 3.18
%End
void setFeatureFilterProvider( QgsFeatureFilterProvider *featureFilterProvider );
%Docstring
Sets ``featureFilterProvider``
.. versionadded:: 3.18
%End
signals:

View File

@ -1346,6 +1346,10 @@ void QgsLayoutItemMap::drawMap( QPainter *painter, const QgsRectangle &extent, Q
}
QgsMapRendererCustomPainterJob job( ms, painter );
#ifdef HAVE_SERVER_PYTHON_PLUGINS
job.setFeatureFilterProvider( mLayout->renderContext().featureFilterProvider() );
#endif
// Render the map in this thread. This is done because of problems
// with printing to printer on Windows (printing to PDF is fine though).
// Raster images were not displayed - see #10599

View File

@ -133,3 +133,13 @@ void QgsLayoutRenderContext::setPredefinedScales( const QVector<qreal> &scales )
std::sort( mPredefinedScales.begin(), mPredefinedScales.end() ); // clazy:exclude=detaching-member
emit predefinedScalesChanged();
}
QgsFeatureFilterProvider *QgsLayoutRenderContext::featureFilterProvider() const
{
return mFeatureFilterProvider;
}
void QgsLayoutRenderContext::setFeatureFilterProvider( QgsFeatureFilterProvider *featureFilterProvider )
{
mFeatureFilterProvider = featureFilterProvider;
}

View File

@ -297,6 +297,18 @@ class CORE_EXPORT QgsLayoutRenderContext : public QObject
*/
QVector<qreal> predefinedScales() const { return mPredefinedScales; }
/**
* Returns the possibly NULL featureFilterProvider
* \since QGIS 3.18
*/
QgsFeatureFilterProvider *featureFilterProvider() const;
/**
* Sets \a featureFilterProvider
* \since QGIS 3.18
*/
void setFeatureFilterProvider( QgsFeatureFilterProvider *featureFilterProvider );
signals:
/**
@ -342,6 +354,8 @@ class CORE_EXPORT QgsLayoutRenderContext : public QObject
QVector<qreal> mPredefinedScales;
QgsFeatureFilterProvider *mFeatureFilterProvider = nullptr;
friend class QgsLayoutExporter;
friend class TestQgsLayout;
friend class LayoutContextPreviewSettingRestorer;

View File

@ -64,7 +64,7 @@ void QgsAccessControl::filterFeatures( const QgsVectorLayer *layer, QgsFeatureRe
QString expression;
if ( mResolved && mFilterFeaturesExpressions.keys().contains( layer->id() ) )
if ( mResolved && mFilterFeaturesExpressions.contains( layer->id() ) )
{
expression = mFilterFeaturesExpressions[layer->id()];
}

View File

@ -64,6 +64,7 @@ namespace QgsWms
context.setFlag( QgsWmsRenderContext::SetAccessControl );
context.setFlag( QgsWmsRenderContext::AddHighlightLayers );
context.setFlag( QgsWmsRenderContext::AddExternalLayers );
context.setFlag( QgsWmsRenderContext::AddAllLayers );
context.setParameters( parameters );
// rendering

View File

@ -182,7 +182,7 @@ qreal QgsWmsRenderContext::dotsPerMm() const
return dpm / 1000.0;
}
QStringList QgsWmsRenderContext::flattenedQueryLayers() const
QStringList QgsWmsRenderContext::flattenedQueryLayers( const QStringList &layerNames ) const
{
QStringList result;
std::function <QStringList( const QString &name )> findLeaves = [ & ]( const QString & name ) -> QStringList
@ -211,8 +211,8 @@ QStringList QgsWmsRenderContext::flattenedQueryLayers() const
}
return _result;
};
const auto constNicks { mParameters.queryLayersNickname() };
for ( const auto &name : constNicks )
for ( const auto &name : qgis::as_const( layerNames ) )
{
result.append( findLeaves( name ) );
}
@ -429,7 +429,21 @@ void QgsWmsRenderContext::searchLayersToRender()
if ( mFlags & AddQueryLayers )
{
const QStringList queryLayerNames { flattenedQueryLayers() };
const QStringList queryLayerNames = flattenedQueryLayers( mParameters.queryLayersNickname() );
for ( const QString &layerName : queryLayerNames )
{
const QList<QgsMapLayer *> layers = mNicknameLayers.values( layerName );
for ( QgsMapLayer *lyr : layers )
if ( !mLayersToRender.contains( lyr ) )
{
mLayersToRender.append( lyr );
}
}
}
if ( mFlags & AddAllLayers )
{
const QStringList queryLayerNames = flattenedQueryLayers( mParameters.allLayersNickname() );
for ( const QString &layerName : queryLayerNames )
{
const QList<QgsMapLayer *> layers = mNicknameLayers.values( layerName );

View File

@ -48,7 +48,8 @@ namespace QgsWms
UseWfsLayersOnly = 0x100,
AddExternalLayers = 0x200,
UseSrcWidthHeight = 0x400,
UseTileBuffer = 0x800
UseTileBuffer = 0x800,
AddAllLayers = 0x1000 //!< For GetPrint: add layers from LAYER(S) parameter
};
Q_DECLARE_FLAGS( Flags, Flag )
@ -209,7 +210,7 @@ namespace QgsWms
* Returns a list of query layer names where group names are replaced by the names of their layer components.
* \since QGIS 3.8
*/
QStringList flattenedQueryLayers() const;
QStringList flattenedQueryLayers( const QStringList &layerNames ) const;
#ifdef HAVE_SERVER_PYTHON_PLUGINS

View File

@ -427,6 +427,14 @@ namespace QgsWms
// configure layout
configurePrintLayout( layout.get(), mapSettings, atlas );
#ifdef HAVE_SERVER_PYTHON_PLUGINS
QgsFeatureFilterProviderGroup filters;
mContext.accessControl()->resolveFilterFeatures( mapSettings.layers() );
filters.addProvider( mContext.accessControl() );
QgsLayoutRenderContext &layoutRendererContext = layout->renderContext();
layoutRendererContext.setFeatureFilterProvider( &filters );
#endif
// Get the temporary output file
const QgsWmsParameters::Format format = mWmsParameters.format();
const QString extension = QgsWmsParameters::formatAsString( format ).toLower();
@ -556,6 +564,7 @@ namespace QgsWms
bool QgsRenderer::configurePrintLayout( QgsPrintLayout *c, const QgsMapSettings &mapSettings, bool atlasPrint )
{
c->renderContext().setSelectionColor( mapSettings.selectionColor() );
// Maps are configured first
QList<QgsLayoutItemMap *> maps;
@ -1174,7 +1183,7 @@ namespace QgsWms
QDomDocument QgsRenderer::featureInfoDocument( QList<QgsMapLayer *> &layers, const QgsMapSettings &mapSettings,
const QImage *outputImage, const QString &version ) const
{
const QStringList queryLayers = mContext.flattenedQueryLayers( );
const QStringList queryLayers = mContext.flattenedQueryLayers( mContext.parameters().queryLayersNickname() );
bool ijDefined = ( !mWmsParameters.i().isEmpty() && !mWmsParameters.j().isEmpty() );