feat(workbench): add runtime GIS and sample integrations
This commit is contained in:
@@ -94,6 +94,89 @@ class GeoServerAdminClient:
|
||||
)
|
||||
return True
|
||||
|
||||
def feature_type_exists(
|
||||
self,
|
||||
*,
|
||||
workspace: str,
|
||||
datastore: str,
|
||||
layer: str,
|
||||
) -> bool:
|
||||
response = self._client.get(
|
||||
f"/rest/workspaces/{workspace}/datastores/{datastore}/featuretypes/{layer}.json"
|
||||
)
|
||||
if response.status_code == 404:
|
||||
return False
|
||||
if response.is_error:
|
||||
raise GeoServerProvisioningError(
|
||||
f"GeoServer feature type check failed with HTTP {response.status_code}"
|
||||
)
|
||||
return True
|
||||
|
||||
def publish_feature_type(
|
||||
self,
|
||||
*,
|
||||
workspace: str,
|
||||
datastore: str,
|
||||
layer: str,
|
||||
title: str,
|
||||
map_bbox: tuple[float, float, float, float],
|
||||
) -> None:
|
||||
minx, miny, maxx, maxy = map_bbox
|
||||
payload = {
|
||||
"featureType": {
|
||||
"name": layer,
|
||||
"nativeName": layer,
|
||||
"title": title,
|
||||
"srs": "EPSG:3857",
|
||||
"projectionPolicy": "FORCE_DECLARED",
|
||||
"enabled": True,
|
||||
"advertised": True,
|
||||
"nativeBoundingBox": {
|
||||
"minx": minx,
|
||||
"miny": miny,
|
||||
"maxx": maxx,
|
||||
"maxy": maxy,
|
||||
"crs": "EPSG:3857",
|
||||
},
|
||||
"latLonBoundingBox": {
|
||||
"minx": _longitude(minx),
|
||||
"miny": _latitude(miny),
|
||||
"maxx": _longitude(maxx),
|
||||
"maxy": _latitude(maxy),
|
||||
"crs": "EPSG:4326",
|
||||
},
|
||||
}
|
||||
}
|
||||
if self.feature_type_exists(
|
||||
workspace=workspace,
|
||||
datastore=datastore,
|
||||
layer=layer,
|
||||
):
|
||||
self._request(
|
||||
"PUT",
|
||||
f"/rest/workspaces/{workspace}/datastores/{datastore}/featuretypes/{layer}",
|
||||
json=payload,
|
||||
)
|
||||
else:
|
||||
self._request(
|
||||
"POST",
|
||||
f"/rest/workspaces/{workspace}/datastores/{datastore}/featuretypes",
|
||||
json=payload,
|
||||
)
|
||||
self._set_client_cache(workspace, layer)
|
||||
|
||||
def truncate_layer_cache(self, workspace: str, layer: str) -> None:
|
||||
self._request(
|
||||
"POST",
|
||||
"/gwc/rest/masstruncate",
|
||||
content=(
|
||||
"<truncateLayer><layerName>"
|
||||
f"{workspace}:{layer}"
|
||||
"</layerName></truncateLayer>"
|
||||
),
|
||||
headers={"Content-Type": "text/xml"},
|
||||
)
|
||||
|
||||
def create_project_workspace(
|
||||
self,
|
||||
*,
|
||||
|
||||
Reference in New Issue
Block a user