def default_qml_style(request, layername, style_name=None): """Set default style used by layer. :param layername: The layer name in Geonode. :type layername: basestring :param style_name: The style name recognized by QGIS Server :type style_name: str """ layer = get_object_or_404(Layer, name=layername) if request.method == 'GET': # Handle querying default style name request default_style = layer.qgis_layer.default_style retval = { 'name': default_style.name, 'title': default_style.title, 'style_url': default_style.style_url } return HttpResponse(json.dumps(retval), content_type='application/json') elif request.method == 'POST': # For people who uses API request if not request.user.has_perm('change_resourcebase', layer.get_self_resource()): return HttpResponse( 'User does not have permission to change QML style.', status=403) if not style_name: return HttpResponseBadRequest() style_url = style_set_default_url(layer, style_name) response = requests.get(style_url) if not (response.status_code == 200 and response.content == 'OK'): return HttpResponseServerError('Failed to change default Style.' 'Error: {0}'.format( response.content)) # Succesfully change default style # Synchronize models style = layer.qgis_layer.styles.get(name=style_name) qgis_layer = layer.qgis_layer qgis_layer.default_style = style qgis_layer.save() alert_message = 'Successfully changed default style %s' % style_name return TemplateResponse( request, 'qgis_server/forms/qml_style.html', { 'resource': layer, 'style_upload_form': QGISLayerStyleUploadForm(), 'alert': True, 'alert_message': alert_message, 'alert_class': 'alert-success' }, status=200).render()
def default_qml_style(request, layername, style_name=None): """Set default style used by layer. :param layername: The layer name in Geonode. :type layername: basestring :param style_name: The style name recognized by QGIS Server :type style_name: str """ layer = get_object_or_404(Layer, name=layername) if request.method == 'GET': # Handle querying default style name request default_style = layer.qgis_layer.default_style retval = { 'name': default_style.name, 'title': default_style.title, 'style_url': default_style.style_url } return HttpResponse( json.dumps(retval), content_type='application/json') elif request.method == 'POST': # For people who uses API request if not request.user.has_perm( 'change_resourcebase', layer.get_self_resource()): return HttpResponse( 'User does not have permission to change QML style.', status=403) if not style_name: return HttpResponseBadRequest() style_url = style_set_default_url(layer, style_name) response = requests.get(style_url) if not (response.status_code == 200 and response.content == 'OK'): return HttpResponseServerError( 'Failed to change default Style.' 'Error: {0}'.format(response.content)) # Succesfully change default style # Synchronize models style = layer.qgis_layer.styles.get(name=style_name) qgis_layer = layer.qgis_layer qgis_layer.default_style = style qgis_layer.save() alert_message = 'Successfully changed default style %s' % style_name return TemplateResponse( request, 'qgis_server/forms/qml_style.html', { 'resource': layer, 'style_upload_form': QGISLayerStyleUploadForm(), 'alert': True, 'alert_message': alert_message, 'alert_class': 'alert-success' }, status=200).render()
def test_style_management_url(self): """Test QGIS Server style management url construction.""" filename = os.path.join(gisdata.GOOD_DATA, 'raster/test_grid.tif') uploaded = file_upload(filename) # Get default style # There will always be a default style when uploading a layer style_url = style_get_url(uploaded, 'default', internal=True) response = requests.get(style_url) self.assertEqual(response.status_code, 200) self.assertEqual(response.headers.get('Content-Type'), 'text/xml') # it has to contains qgis tags style_xml = dlxml.fromstring(response.content) self.assertTrue('qgis' in style_xml.tag) # Add new style # change default style slightly self.assertTrue('WhiteToBlack' not in response.content) self.assertTrue('BlackToWhite' in response.content) new_style_xml = dlxml.fromstring( response.content.replace('BlackToWhite', 'WhiteToBlack')) new_xml_content = etree.tostring(new_style_xml, pretty_print=True) # save it to qml file, accessible by qgis server qgis_layer = QGISServerLayer.objects.get(layer=uploaded) with open(qgis_layer.qml_path, mode='w') as f: f.write(new_xml_content) style_url = style_add_url(uploaded, 'new_style', internal=True) response = requests.get(style_url) self.assertEqual(response.status_code, 200) self.assertEqual(response.content, 'OK') # Get style list qml_styles = style_list(uploaded, internal=False) if qml_styles: expected_style_names = ['default', 'new_style'] actual_style_names = [s.name for s in qml_styles] self.assertEqual(set(expected_style_names), set(actual_style_names)) # Get new style style_url = style_get_url(uploaded, 'new_style', internal=True) response = requests.get(style_url) self.assertEqual(response.status_code, 200) self.assertEqual(response.headers.get('Content-Type'), 'text/xml') self.assertTrue('WhiteToBlack' in response.content) # Set default style style_url = style_set_default_url(uploaded, 'new_style', internal=True) response = requests.get(style_url) self.assertEqual(response.status_code, 200) self.assertEqual(response.content, 'OK') # Remove style style_url = style_remove_url(uploaded, 'new_style', internal=True) response = requests.get(style_url) self.assertEqual(response.status_code, 200) self.assertEqual(response.content, 'OK') # Cleanup uploaded.delete()
def test_style_management_url(self): """Test QGIS Server style management url construction.""" filename = os.path.join(gisdata.GOOD_DATA, 'raster/test_grid.tif') uploaded = file_upload(filename) # Get default style # There will always be a default style when uploading a layer style_url = style_get_url(uploaded, 'default', internal=True) response = requests.get(style_url) self.assertEqual(response.status_code, 200) self.assertEqual(response.headers.get('Content-Type'), 'text/xml') # it has to contains qgis tags style_xml = etree.fromstring(response.content) self.assertTrue('qgis' in style_xml.tag) # Add new style # change default style slightly self.assertTrue('WhiteToBlack' not in response.content) self.assertTrue('BlackToWhite' in response.content) new_style_xml = etree.fromstring( response.content.replace('BlackToWhite', 'WhiteToBlack')) new_xml_content = etree.tostring(new_style_xml, pretty_print=True) # save it to qml file, accessible by qgis server qgis_layer = QGISServerLayer.objects.get(layer=uploaded) with open(qgis_layer.qml_path, mode='w') as f: f.write(new_xml_content) style_url = style_add_url(uploaded, 'new_style', internal=True) response = requests.get(style_url) self.assertEqual(response.status_code, 200) self.assertEqual(response.content, 'OK') # Get style list qml_styles = style_list(uploaded, internal=False) expected_style_names = ['default', 'new_style'] actual_style_names = [s.name for s in qml_styles] self.assertEqual(set(expected_style_names), set(actual_style_names)) # Get new style style_url = style_get_url(uploaded, 'new_style', internal=True) response = requests.get(style_url) self.assertEqual(response.status_code, 200) self.assertEqual(response.headers.get('Content-Type'), 'text/xml') self.assertTrue('WhiteToBlack' in response.content) # Set default style style_url = style_set_default_url( uploaded, 'new_style', internal=True) response = requests.get(style_url) self.assertEqual(response.status_code, 200) self.assertEqual(response.content, 'OK') # Remove style style_url = style_remove_url(uploaded, 'new_style', internal=True) response = requests.get(style_url) self.assertEqual(response.status_code, 200) self.assertEqual(response.content, 'OK') # Cleanup uploaded.delete()