Skip to content

Commit 762f7c9

Browse files
authored
Fix for WMS Geoserver API error. Request changed to include Files. (#17)
* Removed WMS Store from href due to REST error This is a workaround for a Geoserver issue - including store name in the URL causes a failure in Geoserver (500 error) but works (200) without. For Geoserver Testing see: https://docs.geoserver.org/stable/en/api/#1.0.0/wmslayers.yaml 1. PUT for /workspaces/{workspace}/wmslayers/{wmslayer} - WORKS! 2. PUT for /workspaces/{workspace}/wmsstores/{wmsstore}/wmslayers - FAILS! Sample xml payload to enable/disable a wmslayer: <wmsLayer> <enabled>true</enabled> <advertised>true</advertised> </wmsLayer> * Fix for http_request to allow files to be uploaded. E.g. for importing shapefiles via Importer. * Fixes editing existing styles - requires recursive flag to get existing format * Fixes for creating/listing Geoserver styles with recursion.
1 parent c168699 commit 762f7c9

File tree

4 files changed

+28
-23
lines changed

4 files changed

+28
-23
lines changed

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,3 +6,4 @@ include/
66
lib/
77
lib64
88
doc/_build/
9+
.idea/

examples/layersusing.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,4 +20,4 @@ def has_the_style(l):
2020
return (l.default_style.name == style_to_check or
2121
any(s.name == style_to_check for s in l.styles))
2222

23-
print [l.name for l in cat.get_layers() if has_the_style(l)]
23+
print([l.name for l in cat.get_layers() if has_the_style(l)])

src/geoserver/catalog.py

Lines changed: 24 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -141,7 +141,7 @@ def setup_connection(self, retries=3, backoff_factor=0.9):
141141
)
142142
self.client.mount("{}://".format(parsed_url.scheme), HTTPAdapter(max_retries=retry))
143143

144-
def http_request(self, url, data=None, method='get', headers={}):
144+
def http_request(self, url, data=None, method='get', headers={}, files=None):
145145
req_method = getattr(self.client, method.lower())
146146

147147
if self.access_token:
@@ -152,14 +152,13 @@ def http_request(self, url, data=None, method='get', headers={}):
152152
params = urlencode(params)
153153
url = "{proto}://{address}{path}?{params}".format(proto=parsed_url.scheme, address=parsed_url.netloc,
154154
path=parsed_url.path, params=params)
155-
156-
resp = req_method(url, headers=headers, data=data)
157-
else:
155+
elif self.username and self.password:
158156
valid_uname_pw = base64.b64encode(
159157
("%s:%s" % (self.username, self.password)).encode("utf-8")).decode("ascii")
160158
headers['Authorization'] = 'Basic {}'.format(valid_uname_pw)
161-
resp = req_method(url, headers=headers, data=data)
162-
return resp
159+
160+
return req_method(url, headers=headers, data=data, files=files)
161+
163162

164163
def get_version(self):
165164
'''obtain the version or just 2.2.x if < 2.3.x
@@ -1070,11 +1069,18 @@ def get_styles(self, names=None, workspaces=None, recursive=False):
10701069
Will always return an array.
10711070
'''
10721071
all_styles = []
1072+
1073+
# Get Names first to speed up recursive queries
1074+
if names is None:
1075+
names = []
1076+
elif isinstance(names, string_types):
1077+
names = [s.strip() for s in names.split(',') if s.strip()]
1078+
10731079
if not workspaces:
10741080
# Add global styles
10751081
url = "{}/styles.xml".format(self.service_url)
10761082
styles = self.get_xml(url)
1077-
all_styles += self.__build_style_list(styles, recursive=recursive)
1083+
all_styles += self.__build_style_list(styles, recursive=recursive, names=names)
10781084
workspaces = []
10791085
elif isinstance(workspaces, string_types):
10801086
workspaces = [s.strip() for s in workspaces.split(',') if s.strip()]
@@ -1098,32 +1104,30 @@ def get_styles(self, names=None, workspaces=None, recursive=False):
10981104
continue
10991105
else:
11001106
raise FailedRequestError("Failed to get styles: {}".format(e))
1101-
all_styles += self.__build_style_list(styles, workspace=ws, recursive=recursive)
1102-
1103-
if names is None:
1104-
names = []
1105-
elif isinstance(names, string_types):
1106-
names = [s.strip() for s in names.split(',') if s.strip()]
1107+
all_styles += self.__build_style_list(styles, workspace=ws, recursive=recursive, names=names)
11071108

11081109
if all_styles and names:
11091110
return ([style for style in all_styles if style.name in names])
11101111

11111112
return all_styles
11121113

1113-
def __build_style_list(self, styles_tree, workspace=None, recursive=False):
1114+
def __build_style_list(self, styles_tree, workspace=None, recursive=False, names=None):
11141115
all_styles = []
11151116
for s in styles_tree.findall("style"):
11161117
try:
1118+
style_name = s.find('name').text
1119+
if names and style_name not in names:
1120+
continue
11171121
if recursive:
1118-
style_format = self.get_xml(s[1].attrib.get('href')).find('format').text
1119-
style_version = self.get_xml(s[1].attrib.get('href')).find('languageVersion').find(
1120-
'version').text.replace('.', '')[:-1]
1122+
style_xml = self.get_xml(s[1].attrib.get('href'))
1123+
style_format = style_xml.find('format').text
1124+
style_version = style_xml.find('languageVersion').find('version').text.replace('.', '')[:-1]
11211125
all_styles.append(
1122-
Style(self, s.find("name").text, _name(workspace), style_format + style_version)
1126+
Style(self, style_name, _name(workspace), style_format + style_version)
11231127
)
11241128
else:
11251129
all_styles.append(
1126-
Style(self, s.find('name').text, _name(workspace))
1130+
Style(self, style_name, _name(workspace))
11271131
)
11281132
except Exception:
11291133
all_styles.append(
@@ -1142,7 +1146,7 @@ def get_style(self, name, workspace=None, recursive=False):
11421146
return self._return_first_item(styles)
11431147

11441148
def create_style(self, name, data, overwrite=False, workspace=None, style_format="sld10", raw=False):
1145-
styles = self.get_styles(names=name, workspaces=[workspace])
1149+
styles = self.get_styles(names=name, workspaces=[workspace], recursive=True)
11461150
if len(styles) > 0:
11471151
style = styles[0]
11481152
else:

src/geoserver/resource.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -275,11 +275,11 @@ def __init__(self, catalog, workspace, store, name):
275275

276276
@property
277277
def href(self):
278+
# Removed Store from this due to error in the Rest API when including store
278279
return urljoin(
279280
"{}/".format(self.catalog.service_url),
280-
"workspaces/{}/wmsstores/{}/wmslayers/{}.xml".format(
281+
"workspaces/{}/wmslayers/{}.xml".format(
281282
self.workspace.name,
282-
self.store.name,
283283
self.name
284284
)
285285
)

0 commit comments

Comments
 (0)