class LayerGroup(ResourceInfo): """ Represents a layer group in geoserver """ resource_type = "layerGroup" save_method = "PUT" def __init__(self, catalog, name): super(LayerGroup, self).__init__() assert isinstance(name, basestring) self.catalog = catalog self.name = name @property def href(self): return url(self.catalog.service_url, ["layergroups", self.name + ".xml"]) styles = xml_property("styles", _style_list) layers = xml_property("publishables", _layer_list) bounds = xml_property("bounds", bbox) writers = dict(name=write_string("name"), styles=_write_styles, layers=_write_layers, bounds=write_bbox("bounds")) def __str__(self): return "<LayerGroup %s>" % self.name __repr__ = __str__
class Workspace(ResourceInfo): resource_type = "workspace" def __init__(self, catalog, name): super(Workspace, self).__init__() self.catalog = catalog self.name = name @property def href(self): return url(self.catalog.service_url, ["workspaces", self.name + ".xml"]) @property def coveragestore_url(self): return url(self.catalog.service_url, ["workspaces", self.name, "coveragestores.xml"]) @property def datastore_url(self): return url(self.catalog.service_url, ["workspaces", self.name, "datastores.xml"]) name = xml_property("name") writers = dict(name=write_string("name")) def __repr__(self): return "%s @ %s" % (self.name, self.href)
class Style(ResourceInfo): def __init__(self, catalog, name, workspace=None): super(Style, self).__init__() assert isinstance(name, basestring) self.catalog = catalog self.workspace = workspace self.name = name self._sld_dom = None @property def href(self): if self.workspace is not None: return url(self.catalog.service_url, [ "workspaces", self.workspace.name, "styles", self.name + ".xml" ]) else: return url(self.catalog.service_url, ["styles", self.name + ".xml"]) #return url(self.catalog.service_url, ["styles", self.name + ".xml"]) def body_href(self): return self.href.rstrip("xml") + "sld" #return url(self.catalog.service_url, ["styles", self.name + ".sld"]) filename = xml_property("filename") def _get_sld_dom(self): if self._sld_dom is None: self._sld_dom = self.catalog.get_xml(self.body_href()) return self._sld_dom @property def sld_title(self): user_style = self._get_sld_dom().find( "{http://www.opengis.net/sld}NamedLayer/{http://www.opengis.net/sld}UserStyle" ) title_node = user_style.find("{http://www.opengis.net/sld}Title") return title_node.text if title_node is not None else None @property def sld_name(self): user_style = self._get_sld_dom().find( "{http://www.opengis.net/sld}NamedLayer/{http://www.opengis.net/sld}UserStyle" ) name_node = user_style.find("{http://www.opengis.net/sld}Name") return name_node.text if name_node is not None else None @property def sld_body(self): content = self.catalog.http.request(self.body_href())[1] return content def update_body(self, body): headers = {"Content-Type": "application/vnd.ogc.sld+xml"} response, content = self.catalog.http.request(self.body_href(), "PUT", body, headers) if response.status != 200: raise Exception(content)
class CoverageStore(ResourceInfo): resource_type = 'coverageStore' save_method = "PUT" def __init__(self, catalog, workspace, name): super(CoverageStore, self).__init__() assert isinstance(workspace, Workspace) assert isinstance(name, basestring) self.catalog = catalog self.workspace = workspace self.name = name @property def href(self): return url(self.catalog.service_url, [ "workspaces", self.workspace.name, "coveragestores", self.name + ".xml" ]) enabled = xml_property("enabled", lambda x: x.text == "true") name = xml_property("name") url = xml_property("url") type = xml_property("type") writers = dict(enabled=write_bool("enabled"), name=write_string("name"), url=write_string("url"), type=write_string("type")) def get_resources(self): res_url = url(self.catalog.service_url, [ "workspaces", self.workspace.name, "coveragestores", self.name, "coverages.xml" ]) xml = self.catalog.get_xml(res_url) def cov_from_node(node): return coverage_from_index(self.catalog, self.workspace, self, node) return [cov_from_node(node) for node in xml.findall("coverage")]
class FeatureType(ResourceInfo): resource_type = "featureType" save_method = "PUT" def __init__(self, catalog, workspace, store, name): super(FeatureType, self).__init__() assert isinstance(store, ResourceInfo) assert isinstance(name, basestring) self.catalog = catalog self.workspace = workspace self.store = store self.name = name @property def href(self): return url(self.catalog.service_url, [ "workspaces", self.workspace.name, "datastores", self.store.name, "featuretypes", self.name + ".xml" ]) title = xml_property("title") abstract = xml_property("abstract") enabled = xml_property("enabled") native_bbox = xml_property("nativeBoundingBox", bbox) latlon_bbox = xml_property("latLonBoundingBox", bbox) projection = xml_property("srs") projection_policy = xml_property("projectionPolicy") keywords = xml_property("keywords", string_list) attributes = xml_property("attributes", attribute_list) metadata_links = xml_property("metadataLinks", metadata_link_list) writers = dict(title=write_string("title"), abstract=write_string("abstract"), enabled=write_bool("enabled"), nativeBoundingBox=write_bbox("nativeBoundingBox"), latLonBoundingBox=write_bbox("latLonBoundingBox"), srs=write_string("srs"), projectionPolicy=write_string("projectionPolicy"), keywords=write_string_list("keywords"), metadataLinks=write_metadata_link_list("metadataLinks"))
class DataStore(ResourceInfo): resource_type = "dataStore" save_method = "PUT" def __init__(self, catalog, workspace, name): super(DataStore, self).__init__() assert isinstance(workspace, Workspace) assert isinstance(name, basestring) self.catalog = catalog self.workspace = workspace self.name = name @property def href(self): return url(self.catalog.service_url, [ "workspaces", self.workspace.name, "datastores", self.name + ".xml" ]) enabled = xml_property("enabled", lambda x: x.text == "true") name = xml_property("name") connection_parameters = xml_property("connectionParameters", key_value_pairs) writers = dict(enabled=write_bool("enabled"), name=write_string("name"), connectionParameters=write_dict("connectionParameters")) def get_resources(self): res_url = url(self.catalog.service_url, [ "workspaces", self.workspace.name, "datastores", self.name, "featuretypes.xml" ]) xml = self.catalog.get_xml(res_url) def ft_from_node(node): return featuretype_from_index(self.catalog, self.workspace, self, node) return [ft_from_node(node) for node in xml.findall("featureType")]
class Layer(ResourceInfo): def __init__(self, catalog, name): super(Layer, self).__init__() self.catalog = catalog self.name = name resource_type = "layer" save_method = "PUT" @property def href(self): return url(self.catalog.service_url, ["layers", self.name + ".xml"]) @property def resource(self): if self.dom is None: self.fetch() name = self.dom.find("resource/name").text return self.catalog.get_resource(name) @property def abstract(self): return self.resource.abstract @property def title(self): return self.resource.title def _get_default_style(self): if 'default_style' in self.dirty: style = self.dirty['default_style'] if isinstance(style, basestring): style = self.catalog.get_style(style) return style if self.dom is None: self.fetch() name = self.dom.find("defaultStyle/name") # aborted data uploads can result in no default style if name is not None: return self.catalog.get_style(name.text) else: return None def _set_default_style(self, style): if isinstance(style, Style): style = style.name self.dirty["default_style"] = style def _get_alternate_styles(self): if "alternate_styles" in self.dirty: return self.dirty["alternate_styles"] if self.dom is None: self.fetch() styles = self.dom.findall("styles/style/name") return [self.catalog.get_style(s.text) for s in styles] def _set_alternate_styles(self, styles): self.dirty["alternate_styles"] = styles default_style = property(_get_default_style, _set_default_style) styles = property(_get_alternate_styles, _set_alternate_styles) attribution_object = xml_property("attribution", _read_attribution) enabled = xml_property("enabled", lambda x: x.text == "true") def _get_attr_text(self): return self.attribution_object.title def _set_attr_text(self, text): self.dirty["attribution"] = _attribution( text, self.attribution_object.width, self.attribution_object.height) assert self.attribution_object.title == text attribution = property(_get_attr_text, _set_attr_text) writers = dict(attribution=_write_attribution, enabled=write_bool("enabled"), default_style=_write_default_style, alternate_styles=_write_alternate_styles)
class Coverage(ResourceInfo): def __init__(self, catalog, workspace, store, name): super(Coverage, self).__init__() self.catalog = catalog self.workspace = workspace self.store = store self.name = name @property def href(self): return url(self.catalog.service_url, [ "workspaces", self.workspace.name, "coveragestores", self.store.name, "coverages", self.name + ".xml" ]) resource_type = "coverage" save_method = "PUT" title = xml_property("title") abstract = xml_property("abstract") enabled = xml_property("enabled") native_bbox = xml_property("nativeBoundingBox", bbox) latlon_bbox = xml_property("latLonBoundingBox", bbox) projection = xml_property("srs") projection_policy = xml_property("projectionPolicy") keywords = xml_property("keywords", string_list) request_srs_list = xml_property("requestSRS", string_list) response_srs_list = xml_property("responseSRS", string_list) supported_formats = xml_property("supportedFormats", string_list) metadata_links = xml_property("metadataLinks", metadata_link_list) writers = dict(title=write_string("title"), abstract=write_string("abstract"), enabled=write_bool("enabled"), nativeBoundingBox=write_bbox("nativeBoundingBox"), latLonBoundingBox=write_bbox("latLonBoundingBox"), srs=write_string("srs"), projection_policy=write_string("projectionPolicy"), keywords=write_string_list("keywords"), metadataLinks=write_metadata_link_list("metadataLinks"), requestSRS=write_string_list("requestSRS"), responseSRS=write_string_list("responseSRS"), supportedFormats=write_string_list("supportedFormats"))