def test_plugin_compatibility(self): """Default plugins perform as expected """ # Upload a raster and a vector data set hazard_filename = os.path.join(TESTDATA, 'shakemap_padang_20090930.asc') hazard_layer = save_to_geonode(hazard_filename) check_layer(hazard_layer, full=True) exposure_filename = os.path.join(TESTDATA, 'lembang_schools.shp') exposure_layer = save_to_geonode(exposure_filename) check_layer(exposure_layer, full=True) # Test plugin_list = get_plugins() assert len(plugin_list) > 0 geoserver = {'url': settings.GEOSERVER_BASE_URL + 'ows', 'name': 'Local Geoserver', 'version': '1.0.0', 'id': 0} metadata = get_layer_descriptors(geoserver['url']) msg = 'There were no layers in test geoserver' assert len(metadata) > 0, msg # Characterisation test to preserve the behaviour of # get_layer_descriptors. FIXME: I think we should change this to be # a dictionary of metadata entries (ticket #126). reference = [['geonode:lembang_schools', {'layer_type': 'feature', 'category': 'exposure', 'subcategory': 'building', 'title': 'lembang_schools'}], ['geonode:shakemap_padang_20090930', {'layer_type': 'raster', 'category': 'hazard', 'subcategory': 'earthquake', 'title': 'shakemap_padang_20090930'}]] for entry in reference: name, mdblock = entry i = [x[0] for x in metadata].index(name) assert name == metadata[i][0] for key in entry[1]: assert entry[1][key] == metadata[i][1][key] # Check plugins are returned annotated_plugins = [{'name': name, 'doc': f.__doc__, 'layers': compatible_layers(f, metadata)} for name, f in plugin_list.items()] msg = 'No compatible layers returned' assert len(annotated_plugins) > 0, msg
def layers(request): """ Get the list of all layers annotated with metadata If a parameter called 'category' is passed, it will be used to filter the list. """ # FIXME (Ole): Why does the word 'category' have a special meaning? # Someone, please revisit this code! geoservers = get_servers(request.user) if 'category' in request.REQUEST: requested_category = request.REQUEST['category'] else: requested_category = None # Iterate across all available geoservers and all layer descriptors layer_descriptors = [] for geoserver in geoservers: ld = get_layer_descriptors(geoserver['url']) for layer in ld: out = {'name': layer[0], 'title': titelize(layer[1]['title']), 'server_url': geoserver['url']} metadata = layer[1] name_category = out['name'].split('_') if 'category' in metadata.keys(): category = metadata['category'] elif len(name_category) > 1: # FIXME: This is a temporary measure until we get the keywords: # https://github.com/AIFDR/riab/issues/46 # If there is no metadata then try using format category_name # FIXME (Ole): This section should definitely be cleaned up # FIXME (Ole): CLEAN IT - NOW!!! category = name_category[0] else: category = None if requested_category is not None: if requested_category == category: layer_descriptors.append(out) else: layer_descriptors.append(out) output = {'objects': layer_descriptors} jsondata = json.dumps(output) return HttpResponse(jsondata, mimetype='application/json')
def functions(request): """Get a list of all the functions Will provide a list of plugin functions and the layers that the plugins will work with. Takes geoserver urls as a GET parameter can have a comma separated list e.g. http://127.0.0.1:8000/riab/api/v1/functions/?geoservers=http:... assumes version 1.0.0 """ plugin_list = get_plugins() if 'geoservers' in request.GET: # FIXME for the moment assume version 1.0.0 geolist = request.GET['geoservers'].split(',') geoservers = [{'url': geoserver, 'version': '1.0.0'} for geoserver in geolist] else: geoservers = get_servers(request.user) # Iterate across all available geoservers and return all # layer descriptors for use with the plugin subsystem layer_descriptors = [] for geoserver in geoservers: layer_descriptors.extend( get_layer_descriptors(geoserver['url'])) # For each plugin return all layers that meet the requirements # an empty layer is returned where the plugin cannot run annotated_plugins = [] for name, f in plugin_list.items(): layers = compatible_layers(f, layer_descriptors) annotated_plugins.append({'name': name, 'doc': f.__doc__, 'layers': layers}) output = {'functions': annotated_plugins} jsondata = json.dumps(output) return HttpResponse(jsondata, mimetype='application/json')
def test_plugin_compatibility(self): """Default plugins perform as expected """ # Upload a raster and a vector data set hazard_filename = os.path.join(TESTDATA, 'shakemap_padang_20090930.asc') hazard_layer = save_to_geonode(hazard_filename) check_layer(hazard_layer, full=True) exposure_filename = os.path.join(TESTDATA, 'lembang_schools.shp') exposure_layer = save_to_geonode(exposure_filename) check_layer(exposure_layer, full=True) # Test plugin_list = get_plugins() assert len(plugin_list) > 0 geoserver = { 'url': settings.GEOSERVER_BASE_URL + 'ows', 'name': 'Local Geoserver', 'version': '1.0.0', 'id': 0 } metadata = get_layer_descriptors(geoserver['url']) msg = 'There were no layers in test geoserver' assert len(metadata) > 0, msg # Characterisation test to preserve the behaviour of # get_layer_descriptors. FIXME: I think we should change this to be # a dictionary of metadata entries (ticket #126). reference = [[ 'geonode:lembang_schools', { 'layer_type': 'vector', 'category': 'exposure', 'subcategory': 'building', 'title': 'lembang_schools' } ], [ 'geonode:shakemap_padang_20090930', { 'layer_type': 'raster', 'category': 'hazard', 'subcategory': 'earthquake', 'title': 'shakemap_padang_20090930' } ]] for entry in reference: name, mdblock = entry i = [x[0] for x in metadata].index(name) msg = 'Got name %s, expected %s' % (name, metadata[i][0]) assert name == metadata[i][0], msg for key in entry[1]: refval = entry[1][key] val = metadata[i][1][key] msg = ('Got value "%s" for key "%s" ' 'Expected "%s"' % (val, key, refval)) assert refval == val, msg # Check plugins are returned annotated_plugins = [{ 'name': name, 'doc': f.__doc__, 'layers': compatible_layers(f, metadata) } for name, f in plugin_list.items()] msg = 'No compatible layers returned' assert len(annotated_plugins) > 0, msg