Skip to content

Commit 8950c79

Browse files
Gustrynyalldawson
authored andcommitted
Fix export legend as JSON when a rule based does not have a symbol
1 parent 282d7e1 commit 8950c79

File tree

2 files changed

+69
-12
lines changed

2 files changed

+69
-12
lines changed

src/core/layertree/qgslayertreemodellegendnode.cpp

Lines changed: 12 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -781,10 +781,21 @@ QSizeF QgsSymbolLegendNode::drawSymbol( const QgsLegendSettings &settings, ItemC
781781

782782
QJsonObject QgsSymbolLegendNode::exportSymbolToJson( const QgsLegendSettings &settings, const QgsRenderContext &context ) const
783783
{
784+
QJsonObject json;
785+
if ( mItem.scaleMaxDenom() > 0 )
786+
{
787+
json[ QStringLiteral( "scaleMaxDenom" ) ] = mItem.scaleMaxDenom();
788+
}
789+
if ( mItem.scaleMinDenom() > 0 )
790+
{
791+
json[ QStringLiteral( "scaleMinDenom" ) ] = mItem.scaleMinDenom();
792+
}
793+
mItem.scaleMaxDenom();
794+
784795
const QgsSymbol *s = mCustomSymbol ? mCustomSymbol.get() : mItem.symbol();
785796
if ( !s )
786797
{
787-
return QJsonObject();
798+
return json;
788799
}
789800

790801

@@ -826,17 +837,7 @@ QJsonObject QgsSymbolLegendNode::exportSymbolToJson( const QgsLegendSettings &se
826837
img.save( &buffer, "PNG" );
827838
const QString base64 = QString::fromLatin1( byteArray.toBase64().data() );
828839

829-
QJsonObject json;
830840
json[ QStringLiteral( "icon" ) ] = base64;
831-
if ( mItem.scaleMaxDenom() > 0 )
832-
{
833-
json[ QStringLiteral( "scaleMaxDenom" ) ] = mItem.scaleMaxDenom();
834-
}
835-
if ( mItem.scaleMinDenom() > 0 )
836-
{
837-
json[ QStringLiteral( "scaleMinDenom" ) ] = mItem.scaleMinDenom();
838-
}
839-
mItem.scaleMaxDenom();
840841
return json;
841842
}
842843

tests/src/python/test_qgsserver_wms_getlegendgraphic.py

Lines changed: 57 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,8 @@
3333
from test_qgsserver_wms import TestQgsServerWMSTestBase
3434
from qgis.core import (
3535
QgsProject,
36+
QgsSymbol,
37+
QgsWkbTypes,
3638
QgsMarkerSymbol,
3739
QgsRuleBasedRenderer,
3840
QgsVectorLayer,
@@ -42,7 +44,6 @@
4244
QgsBufferServerRequest,
4345
QgsBufferServerResponse,
4446
QgsServer,
45-
QgsServerRequest,
4647
)
4748

4849
# Strip path and content length because path may vary
@@ -1286,6 +1287,61 @@ def testJsonSymbolMaxMinScale(self):
12861287
self.assertEqual(node['scaleMaxDenom'], 1000)
12871288
self.assertEqual(node['scaleMinDenom'], 10000)
12881289

1290+
def test_json_rule_based_max_min_scale_without_symbol(self):
1291+
""" Test min/max scale in rule based json export when a rule doesn't have a symbol. """
1292+
root_rule = QgsRuleBasedRenderer.Rule(None)
1293+
1294+
# Rule with symbol
1295+
high_scale_rule = QgsRuleBasedRenderer.Rule(
1296+
QgsSymbol.defaultSymbol(QgsWkbTypes.PointGeometry),
1297+
minimumScale=25000, maximumScale=1000, label='high-scale')
1298+
root_rule.appendChild(high_scale_rule)
1299+
1300+
# Rule without symbol
1301+
low_scale_rule = QgsRuleBasedRenderer.Rule(None, minimumScale=100000, maximumScale=25000, label='low-scale')
1302+
1303+
# Sub-rule with a symbol
1304+
sub_rule = QgsRuleBasedRenderer.Rule(
1305+
QgsSymbol.defaultSymbol(QgsWkbTypes.PointGeometry), label='low-scale-sub')
1306+
1307+
low_scale_rule.appendChild(sub_rule)
1308+
root_rule.appendChild(low_scale_rule)
1309+
1310+
layer = QgsVectorLayer("Point?field=fldtxt:string", "layer1", "memory")
1311+
layer.setRenderer(QgsRuleBasedRenderer(root_rule))
1312+
1313+
project = QgsProject()
1314+
project.addMapLayer(layer)
1315+
1316+
server = QgsServer()
1317+
request = QgsBufferServerRequest(
1318+
"/?"
1319+
"SERVICE=WMS&"
1320+
"VERSION=1.3.0&"
1321+
"REQUEST=GetLegendGraphic&"
1322+
"LAYERS=layer1&"
1323+
"FORMAT=application/json"
1324+
)
1325+
response = QgsBufferServerResponse()
1326+
server.handleRequest(request, response, project)
1327+
result = json.loads(bytes(response.body()))
1328+
1329+
node = result['nodes'][0]['symbols']
1330+
1331+
# With icon
1332+
first_rule = node[0]
1333+
self.assertEqual(first_rule['scaleMaxDenom'], 25000)
1334+
self.assertEqual(first_rule['scaleMinDenom'], 1000)
1335+
self.assertEqual(first_rule['title'], 'high-scale')
1336+
self.assertIn('icon', first_rule)
1337+
1338+
# Without icon
1339+
second_rule = node[1]
1340+
self.assertEqual(second_rule['scaleMaxDenom'], 100000)
1341+
self.assertEqual(second_rule['scaleMinDenom'], 25000)
1342+
self.assertEqual(second_rule['title'], 'low-scale')
1343+
self.assertNotIn('icon', second_rule)
1344+
12891345
def testLegendPlaceholderIcon(self):
12901346
qs = "?" + "&".join(["%s=%s" % i for i in list({
12911347
"MAP": self.testdata_path + 'test_project_legend_placeholder_image.qgs',

0 commit comments

Comments
 (0)