Skip to content

Commit 18f4238

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 56ced86 commit 18f4238

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+'
@@ -383,6 +386,81 @@ def test_getLegendGraphics(self):
383386
self.assertEqual(-1, h.find('Content-Type: text/xml; charset=utf-8'), "Header: %s\nResponse:\n%s" % (h, r))
384387
self.assertNotEquals(-1, h.find('Content-Type: image/png'), "Header: %s\nResponse:\n%s" % (h, r))
385388

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

387465
if __name__ == '__main__':
388466
unittest.main()
2.89 KB
Loading
265 Bytes
Loading
355 Bytes
Loading
Loading

0 commit comments

Comments
 (0)