Skip to content

Commit d185929

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 24f3cc5 commit d185929

File tree

6 files changed

+88
-1
lines changed

6 files changed

+88
-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: 80 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,10 +18,13 @@
1818
from mimetools import Message
1919
from StringIO import StringIO
2020
from qgis.server import QgsServer
21-
from qgis.core import QgsMessageLog
21+
from qgis.core import QgsMessageLog, QgsRenderChecker
2222
from qgis.testing import unittest
23+
from qgis.PyQt.QtCore import QSize
2324
from utilities import unitTestDataPath
2425
import osgeo.gdal
26+
import tempfile
27+
import base64
2528

2629
# Strip path and content length because path may vary
2730
RE_STRIP_PATH = r'MAP=[^&]+|Content-Length: \d+'
@@ -372,6 +375,82 @@ def test_getLegendGraphics(self):
372375
self.assertEquals(-1, h.find('Content-Type: text/xml; charset=utf-8'), "Header: %s\nResponse:\n%s" % (h, r))
373376
self.assertNotEquals(-1, h.find('Content-Type: image/png'), "Header: %s\nResponse:\n%s" % (h, r))
374377

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

0 commit comments

Comments
 (0)