From 85ff8acecc88048e887b6497c50843250ec8aa14 Mon Sep 17 00:00:00 2001 From: mattiagiupponi <51856725+mattiagiupponi@users.noreply.github.com> Date: Mon, 8 Jan 2024 10:17:04 +0100 Subject: [PATCH] #42 Improve get_style (#43) * Improve get_style * Improve get_style * Add api for delete single style * Improve get_style() * Syntax fix * Fixes #42 call get_style instead of get_styles in layer_resolve_style * Fixes #42 call get_style instead of get_styles in layer_resolve_style * Fixes #42 call get_style instead of get_styles in layer_resolve_style * Fixes #42 call get_style instead of get_styles in layer_resolve_style * Fixes #42 call get_style instead of get_styles in layer_resolve_style --------- Co-authored-by: Emanuele Tajariol --- setup.py | 2 +- src/geoserver/catalog.py | 65 +++++++++++++++++++++++++++++++++++----- src/geoserver/layer.py | 6 ++-- src/geoserver/style.py | 2 +- 4 files changed, 62 insertions(+), 13 deletions(-) diff --git a/setup.py b/setup.py index cad7a3d..8cc5a1e 100644 --- a/setup.py +++ b/setup.py @@ -10,7 +10,7 @@ setup( name="geoserver-restconfig", - version="2.0.9", + version="2.0.10", description="GeoServer REST Configuration", long_description=readme_text, keywords="GeoServer REST Configuration", diff --git a/src/geoserver/catalog.py b/src/geoserver/catalog.py index 8910214..f04ba1f 100644 --- a/src/geoserver/catalog.py +++ b/src/geoserver/catalog.py @@ -31,6 +31,7 @@ import os import re import base64 +from requests.exceptions import HTTPError from xml.etree.ElementTree import XML from xml.parsers.expat import ExpatError import requests @@ -1213,15 +1214,63 @@ def __build_style_list( def get_style(self, name, workspace=None, recursive=False): """ - returns a single style object. + Get single style from geoserver. + Keyword arguments: + name(str): name of the style + Optional keyword arguments: + workspace(str): name of the workspce where the style belong + Legacy: + recursive(bool): no longer used + Return + a single style object. Will return None if no style is found. Will raise an error if more than one style with the same name is found. """ - styles = self.get_styles( - names=name, workspaces=[workspace], recursive=recursive - ) - return self._return_first_item(styles) + url = f"{self.service_url}/workspaces/{workspace}/styles/{name}.json" if workspace \ + else f"{self.service_url}/styles/{name}.json" + + try: + resp = self.http_request(url, headers={"Accept": "application/json"}) + resp.raise_for_status() + payload = resp.json()['style'] + extracted_workspace = payload['workspace'].get("name", workspace) if payload.get("workspace") else workspace + return Style( + self, + payload['name'], + extracted_workspace, + payload['format'] + payload['languageVersion']['version'], + ) + + except HTTPError as e: + if resp.status_code == 404: + return None + logger.exception(e) + raise e + except Exception as e: + logger.exception(e) + raise e + + def delete_style(self, name, workspace=None, purge=True): + if workspace: + ''' + If workspace is passed, we call directly the wanted style + ''' + url = f"{self.service_url}/workspaces/{workspace}/styles/{name}?purge={purge}" + else: + ''' + If is not passed, we try to get the style without passing any workspace + ''' + url = f"{self.service_url}/styles/{name}?purge={purge}" + + try: + resp = self.http_request(url, method="DELETE") + if resp.status_code != 404: + resp.raise_for_status() + return resp.status_code == 201 + except Exception as e: + logger.exception(e) + raise e def create_style( self, @@ -1232,9 +1281,9 @@ def create_style( style_format="sld10", raw=False, ): - styles = self.get_styles(names=name, workspaces=[workspace], recursive=True) - if len(styles) > 0: - style = styles[0] + styles = self.get_style(name=name, workspace=workspace, recursive=True) + if styles: + style = styles else: style = None diff --git a/src/geoserver/layer.py b/src/geoserver/layer.py index 3e5b493..acc8ed2 100644 --- a/src/geoserver/layer.py +++ b/src/geoserver/layer.py @@ -166,9 +166,9 @@ def _resolve_style(self, element, recursive=False): atom_link = [n for n in element if "href" in n.attrib] if atom_link and ws_name is None: ws_name = workspace_from_url(atom_link[0].get("href")) - return self.catalog.get_styles( - names=style_name, workspaces=ws_name, recursive=recursive - )[0] + return self.catalog.get_style( + name=style_name, workspace=ws_name, recursive=recursive + ) return None def _set_default_style(self, style): diff --git a/src/geoserver/style.py b/src/geoserver/style.py index 1bed96a..77b0928 100644 --- a/src/geoserver/style.py +++ b/src/geoserver/style.py @@ -19,7 +19,7 @@ class Style(ResourceInfo): - supported_formats = ["sld10", "sld11", "zip10", "css10"] + supported_formats = ["sld10", "sld11", "zip10", "css10", "sld1.0.0"] content_types = { "sld10": "application/vnd.ogc.sld+xml", "sld11": "application/vnd.ogc.se+xml",