def test_publish_csv(self): """Check that CSV publishing works like it should""" # Create a package p = self.add_package("test_publish_csv") # Create a resource p = self.add_resource(p["id"], {"package_id": p["id"], "url": "http://nothing.com/false.csv"}) # Do the Datastorer part resource_id = p.get("resources")[0]["id"] self.createTable(resource_id) # Assemble params for the publish function context = {"user": self.admin_user().name} params = { "package_id": p["id"], "resource_id": resource_id, "layer_name": "test-csv-publish-layer", "col_latitude": "lat", "col_longitude": "lng" } # Publish it via action response = publish(context, params) # Assertions gs = Geoserver.from_ckan_config() self.assertIsInstance(gs.get_layer("test-csv-publish-layer"), GeoserverLayer)
def __init__(self, package_id, resource_id, layer_name, username, geoserver=Geoserver.from_ckan_config(), lat_field=None, lng_field=None): self.geoserver = geoserver self.store = geoserver.default_datastore() self.name = layer_name self.username = username self.file_resource = toolkit.get_action("resource_show")(None, {"id": resource_id}) self.package_id = package_id self.resource_id = resource_id # Spatialize it url = self.file_resource["url"] kwargs = {"resource_id": self.file_resource["id"]} if url.endswith('.zip'): cls = Shapefile elif url.endswith('.csv'): cls = Datastored kwargs.update({ "lat_field": lat_field, "lng_field": lng_field }) else: # The resource cannot be spatialized raise Exception(toolkit._("Only CSV and Shapefile data can be spatialized")) self.data = cls(**kwargs) # Spatialize if not self.data.publish(): # Spatialization failed raise Exception(toolkit._("Spatialization failed."))
def test_create_layer(self): """Check that a layer exists once create_layer is called""" # Create a layer l = Layer(self._test_package["id"], self._test_resource["id"], "testing-layer", self.admin_user().name) # Push to Geoserver self.assertIsInstance(l.create_layer(), GeoserverLayer) # Check that the layer exists gs = Geoserver.from_ckan_config() self.assertIsInstance(gs.get_layer("testing-layer"), GeoserverLayer)
def publish(cls, package_id, resource_id, layer_name, username, geoserver=Geoserver.from_ckan_config(), lat_field=None, lng_field=None): l = cls(package_id, resource_id, layer_name, username, geoserver, lat_field, lng_field) if l.create(): return l else: return None
def layer_exists(context, data_dict): """ Checks whether layer exists in the geoserver. If not then returns False. @return: Boolean """ if 'layer_name' in data_dict: layer_name = _get_or_bust(data_dict, 'layer_name') geoserver = Geoserver.from_ckan_config() if geoserver.get_layer(layer_name) is None: return False else: return True
def unpublish(context, data_dict): """ Un-publishes the geoserver layer based on the resource identifier. Retrieves the geoserver layer name and package identifier to construct layer and remove it. """ resource_id = data_dict.get("resource_id") layer_name = data_dict.get("layer_name") layer_name = "NGDS:" + resource_id username = context.get('user') geoserver_layer_name = data_dict.get("gs_lyr_name", None) file_resource = toolkit.get_action("resource_show")(None, { "id": resource_id }) if not layer_name: resource = ckan_model.Resource.get(resource_id) geoserver = Geoserver.from_ckan_config() package_id = ckan_model.Resource.get(resource_id).resource_group.package_id def unpub(): if geoserver_layer_name is not None: layer = Layer(geoserver=geoserver, layer_name=geoserver_layer_name, resource_id=resource_id, package_id=package_id, username=username) return layer else: layer = Layer(geoserver=geoserver, layer_name=layer_name, resource_id=resource_id, package_id=package_id, username=username) return layer try: layer = unpub() except socket.error: h.flash_error( _("Error connecting to geoserver. Please contact the site administrator if this problem persists." )) return False layer.remove() h.flash_success(_("This resource has successfully been unpublished.")) return True
def test_publish_shapefile(self): """Check that Shapefile publishing works like it should""" # Create a package and resource package_name = "test_publish_shapefile" res = self.add_shapefile_resource(package_name) # Assemble params context = {"user": self.admin_user().name} params = { "package_id": package_name, "resource_id": res["id"], "layer_name": "test-shapefile-publish-layer", } # Publish it via action response = publish(context, params) # Assertions gs = Geoserver.from_ckan_config() self.assertIsInstance(gs.get_layer("test-shapefile-publish-layer"), GeoserverLayer)
def unpublish(context, data_dict): """ Un-publishes the geoserver layer based on the resource identifier. Retrieves the geoserver layer name and package identifier to construct layer and remove it. """ resource_id = data_dict.get("resource_id") layer_name = data_dict.get("layer_name") layer_name = "NGDS:" + resource_id username = context.get('user') geoserver_layer_name = data_dict.get("gs_lyr_name", None) file_resource = toolkit.get_action("resource_show")(None, {"id": resource_id}) if not layer_name: resource = ckan_model.Resource.get(resource_id) geoserver = Geoserver.from_ckan_config() package_id = ckan_model.Resource.get(resource_id).resource_group.package_id def unpub(): if geoserver_layer_name is not None: layer = Layer(geoserver=geoserver, layer_name=geoserver_layer_name, resource_id=resource_id, package_id=package_id, username=username) return layer else: layer = Layer(geoserver=geoserver, layer_name=layer_name, resource_id=resource_id, package_id=package_id, username=username) return layer try: layer = unpub() except socket.error: h.flash_error( _("Error connecting to geoserver. Please contact the site administrator if this problem persists.")) return False layer.remove() h.flash_success( _("This resource has successfully been unpublished.")) return True
def __init__(self, package_id, resource_id, layer_name, username, geoserver=Geoserver.from_ckan_config(), lat_field=None, lng_field=None): self.geoserver = geoserver self.store = geoserver.default_datastore() self.name = layer_name self.username = username self.file_resource = toolkit.get_action("resource_show")( None, { "id": resource_id }) self.package_id = package_id self.resource_id = resource_id # Spatialize it url = self.file_resource["url"] kwargs = {"resource_id": self.file_resource["id"]} if url.endswith('.zip'): cls = Shapefile elif url.endswith('.csv'): cls = Datastored kwargs.update({"lat_field": lat_field, "lng_field": lng_field}) else: # The resource cannot be spatialized raise Exception( toolkit._("Only CSV and Shapefile data can be spatialized")) self.data = cls(**kwargs) # Spatialize if not self.data.publish(): # Spatialization failed raise Exception(toolkit._("Spatialization failed."))
def setUp(self): self.gs = Geoserver.from_ckan_config()