Skip to content

Commit 838bf79

Browse files
committed
[BUGFIX][QGIS Server] GetLegendGraphic: if LAYERTITLE is false disable layer name in legend
If the layer has only one legend node, it is embedded in parent. In QGIS Server the user can specify no layer title, so the layer title has not be displayed.
1 parent acf74a6 commit 838bf79

File tree

6 files changed

+87
-1
lines changed

6 files changed

+87
-1
lines changed

src/server/qgswmsserver.cpp

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -939,6 +939,14 @@ QImage* QgsWMSServer::getLegendGraphics()
939939
legendNode->setUserLabel( " " ); // empty string = no override, so let's use one space
940940
}
941941
}
942+
else if ( !mDrawLegendLayerLabel )
943+
{
944+
Q_FOREACH ( QgsLayerTreeModelLegendNode* legendNode, legendModel.layerLegendNodes( nodeLayer ) )
945+
{
946+
if ( legendNode->isEmbeddedInParent() )
947+
legendNode->setEmbeddedInParent( false );
948+
}
949+
}
942950
}
943951
}
944952

tests/src/python/test_qgsserver.py

Lines changed: 79 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,10 +19,13 @@
1919
from mimetools import Message
2020
from StringIO import StringIO
2121
from qgis.server import QgsServer
22-
from qgis.core import QgsMessageLog
22+
from qgis.core import QgsMessageLog, QgsRenderChecker
2323
from qgis.testing import unittest
24+
from qgis.PyQt.QtCore import QSize
2425
from utilities import unitTestDataPath
2526
import osgeo.gdal
27+
import tempfile
28+
import base64
2629

2730
# Strip path and content length because path may vary
2831
RE_STRIP_PATH = r'MAP=[^&]+|Content-Length: \d+|<Attribute typeName="[^>]+'
@@ -388,6 +391,81 @@ def test_getLegendGraphics(self):
388391
self.assertEqual(-1, h.find('Content-Type: text/xml; charset=utf-8'), "Header: %s\nResponse:\n%s" % (h, r))
389392
self.assertNotEquals(-1, h.find('Content-Type: image/png'), "Header: %s\nResponse:\n%s" % (h, r))
390393

394+
def test_getLegendGraphics_layertitle(self):
395+
"""Test that does not return an exception but an image"""
396+
parms = {
397+
'MAP': self.testdata_path + "test_project.qgs",
398+
'SERVICE': 'WMS',
399+
'VERSION': '1.3.0',
400+
'REQUEST': 'GetLegendGraphic',
401+
'FORMAT': 'image/png',
402+
#'WIDTH': '20', # optional
403+
#'HEIGHT': '20', # optional
404+
'LAYER': u'testlayer%20èé',
405+
'LAYERTITLE': 'TRUE',
406+
}
407+
qs = '&'.join([u"%s=%s" % (k, v) for k, v in parms.items()])
408+
r, h = self._result(self.server.handleRequest(qs))
409+
self._img_diff_error(r, h, "WMS_GetLegendGraphic_test", 250, QSize(10, 10))
410+
411+
parms = {
412+
'MAP': self.testdata_path + "test_project.qgs",
413+
'SERVICE': 'WMS',
414+
'VERSION': '1.3.0',
415+
'REQUEST': 'GetLegendGraphic',
416+
'FORMAT': 'image/png',
417+
#'WIDTH': '20', # optional
418+
#'HEIGHT': '20', # optional
419+
'LAYER': u'testlayer%20èé',
420+
'LAYERTITLE': 'FALSE',
421+
}
422+
qs = '&'.join([u"%s=%s" % (k, v) for k, v in parms.items()])
423+
r, h = self._result(self.server.handleRequest(qs))
424+
self._img_diff_error(r, h, "WMS_GetLegendGraphic_test_layertitle_false", 250, QSize(10, 10))
425+
426+
def _result(self, data):
427+
headers = {}
428+
for line in data[0].decode('UTF-8').split("\n"):
429+
if line != "":
430+
header = line.split(":")
431+
self.assertEqual(len(header), 2, line)
432+
headers[str(header[0])] = str(header[1]).strip()
433+
434+
return data[1], headers
435+
436+
def _img_diff(self, image, control_image, max_diff, max_size_diff=QSize()):
437+
temp_image = os.path.join(tempfile.gettempdir(), "%s_result.png" % control_image)
438+
439+
with open(temp_image, "wb") as f:
440+
f.write(image)
441+
442+
control = QgsRenderChecker()
443+
control.setControlPathPrefix("qgis_server")
444+
control.setControlName(control_image)
445+
control.setRenderedImage(temp_image)
446+
if max_size_diff.isValid():
447+
control.setSizeTolerance(max_size_diff.width(), max_size_diff.height())
448+
return control.compareImages(control_image), control.report()
449+
450+
def _img_diff_error(self, response, headers, image, max_diff=10, max_size_diff=QSize()):
451+
self.assertEqual(
452+
headers.get("Content-Type"), "image/png",
453+
"Content type is wrong: %s" % headers.get("Content-Type"))
454+
test, report = self._img_diff(response, image, max_diff, max_size_diff)
455+
456+
with open(os.path.join(tempfile.gettempdir(), image + "_result.png"), "rb") as rendered_file:
457+
encoded_rendered_file = base64.b64encode(rendered_file.read())
458+
message = "Image is wrong\n%s\nImage:\necho '%s' | base64 -d >%s/%s_result.png" % (
459+
report, encoded_rendered_file.strip(), tempfile.gettempdir(), image
460+
)
461+
462+
with open(os.path.join(tempfile.gettempdir(), image + "_result_diff.png"), "rb") as diff_file:
463+
encoded_diff_file = base64.b64encode(diff_file.read())
464+
message += "\nDiff:\necho '%s' | base64 -d > %s/%s_result_diff.png" % (
465+
encoded_diff_file.strip(), tempfile.gettempdir(), image
466+
)
467+
468+
self.assertTrue(test, message)
391469

392470
if __name__ == '__main__':
393471
unittest.main()

0 commit comments

Comments
 (0)