def legend(request, layername, layertitle=False, style=None): """Get the legend from a layer. :param layername: The layer name in Geonode. :type layername: basestring :param layertitle: Add the layer title in the legend. Default to False. :type layertitle: bool :param style: Layer style to choose :type style: str :return: The HTTPResponse with a PNG. """ layer = get_object_or_404(Layer, name=layername) qgis_layer = get_object_or_404(QGISServerLayer, layer=layer) # get default style name if not style: # generate style cache if not qgis_layer.default_style: try: style_list(layer, internal=False) except Exception: logger.warning("Failed to fetch styles") # refresh values qgis_layer.refresh_from_db() if qgis_layer.default_style: style = qgis_layer.default_style.name tiles_directory = QGIS_SERVER_CONFIG['tiles_directory'] legend_path = QGIS_SERVER_CONFIG['legend_path'] legend_filename = legend_path % (qgis_layer.qgis_layer_name, style) # GOOD -- Verify with normalised version of path legend_filename = os.path.normpath(legend_filename) if not legend_filename.startswith(tiles_directory): return HttpResponseServerError() if not os.path.exists(legend_filename): if not os.path.exists(os.path.dirname(legend_filename)): os.makedirs(os.path.dirname(legend_filename)) url = legend_url(layer, layertitle, style=style, internal=True) result = cache_request.apply_async((url, legend_filename)) # Attempt to run task synchronously if not result.get(): # If not succeded, provides error message. return HttpResponseServerError('Failed to fetch legend.') if image_format(legend_filename) != 'png': logger.error('%s is not valid PNG.' % legend_filename) os.remove(legend_filename) if not os.path.exists(legend_filename): return HttpResponse('The legend could not be found.', status=409) with open(legend_filename, 'rb') as f: return HttpResponse(f.read(), content_type='image/png')
def legend(request, layername, layertitle=False, style=None): """Get the legend from a layer. :param layername: The layer name in Geonode. :type layername: basestring :param layertitle: Add the layer title in the legend. Default to False. :type layertitle: bool :param style: Layer style to choose :type style: str :return: The HTTPResponse with a PNG. """ layer = get_object_or_404(Layer, name=layername) qgis_layer = get_object_or_404(QGISServerLayer, layer=layer) # get default style name if not style: # generate style cache if not qgis_layer.default_style: try: style_list(layer, internal=False) except BaseException: print 'Failed to fetch styles' # refresh values qgis_layer.refresh_from_db() if qgis_layer.default_style: style = qgis_layer.default_style.name legend_path = QGIS_SERVER_CONFIG['legend_path'] legend_filename = legend_path % (qgis_layer.qgis_layer_name, style) if not os.path.exists(legend_filename): if not os.path.exists(os.path.dirname(legend_filename)): os.makedirs(os.path.dirname(legend_filename)) url = legend_url(layer, layertitle, style=style, internal=True) result = cache_request.delay(url, legend_filename) # Attempt to run task synchronously if not result.get(): # If not succeded, provides error message. return HttpResponseServerError('Failed to fetch legend.') if image_format(legend_filename) != 'png': logger.error('%s is not valid PNG.' % legend_filename) os.remove(legend_filename) if not os.path.exists(legend_filename): return HttpResponse('The legend could not be found.', status=409) with open(legend_filename, 'rb') as f: return HttpResponse(f.read(), content_type='image/png')