Skip to content

Commit

Permalink
- Backport fixes from master
Browse files Browse the repository at this point in the history
  • Loading branch information
Alessio Fabiani committed May 16, 2018
1 parent 2c3a00c commit c6b85ae
Show file tree
Hide file tree
Showing 18 changed files with 324 additions and 106 deletions.
3 changes: 3 additions & 0 deletions .travis.yml
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,8 @@ services:
- postgresql

addons:
hosts:
- geonode
postgresql: 9.6
apt:
packages:
Expand Down Expand Up @@ -63,6 +65,7 @@ branches:
only:
- master
- 2.9.x
- 2.8.0
- 2.7.x
- 2.6.x

Expand Down
37 changes: 37 additions & 0 deletions docker-compose-geoserver-server.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
version: '2.2'
services:

data-dir-conf:
image: geonode/geoserver_data:2.13.x
restart: on-failure
container_name: gsconf4${COMPOSE_PROJECT_NAME}
labels:
org.geonode.component: conf
org.geonode.instance.name: geonode
command: /bin/true
volumes:
- geoserver-data-dir:/geoserver_data/data

geoserver:
image: geonode/geoserver:2.13.x
restart: unless-stopped
container_name: geoserver4${COMPOSE_PROJECT_NAME}
stdin_open: true
# tty: true
labels:
org.geonode.component: geoserver
org.geonode.instance.name: geonode
depends_on:
- data-dir-conf
volumes:
- /var/run/docker.sock:/var/run/docker.sock
- geoserver-data-dir:/geoserver_data/data
env_file:
- ./scripts/docker/env/production/geoserver.env
ports:
- "${GEOSERVER_SERVER_PORT}:8080"
network_mode: "bridge"

volumes:
geoserver-data-dir:
name: ${COMPOSE_PROJECT_NAME}-gsdatadir
23 changes: 12 additions & 11 deletions docker-compose.yml
Original file line number Diff line number Diff line change
Expand Up @@ -55,6 +55,17 @@ services:
env_file:
- ./scripts/docker/env/production/celery.env

data-dir-conf:
image: geonode/geoserver_data:2.13.x
restart: on-failure
container_name: gsconf4${COMPOSE_PROJECT_NAME}
labels:
org.geonode.component: conf
org.geonode.instance.name: geonode
command: /bin/true
volumes:
- geoserver-data-dir:/geoserver_data/data

geoserver:
image: geonode/geoserver:2.13.x
restart: unless-stopped
Expand All @@ -68,6 +79,7 @@ services:
- db
# - elasticsearch
- rabbitmq
- data-dir-conf
volumes:
- /var/run/docker.sock:/var/run/docker.sock
- geoserver-data-dir:/geoserver_data/data
Expand Down Expand Up @@ -110,17 +122,6 @@ services:
ports:
- "80:80"

data-dir-conf:
image: geonode/geoserver_data:2.13.x
restart: on-failure
container_name: gsconf4${COMPOSE_PROJECT_NAME}
labels:
org.geonode.component: conf
org.geonode.instance.name: geonode
command: /bin/true
volumes:
- geoserver-data-dir:/geoserver_data/data

volumes:
geoserver-data-dir:
name: ${COMPOSE_PROJECT_NAME}-gsdatadir
Expand Down
1 change: 0 additions & 1 deletion geonode/client/templates/geoext/geo_header.html
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,6 @@
OpenLayers.Util.onImageLoadError = function() {
this.src = '{{ STATIC_URL }}geonode/img/light_gray.jpg';
};
Ext.BLANK_IMAGE_URL = "{{ STATIC_URL }}geonode/img/light_gray.jpg";

OpenLayers.Request.DEFAULT_CONFIG.headers = {
'X-CSRFToken': '{{ csrf_token|escapejs }}'
Expand Down
159 changes: 113 additions & 46 deletions geonode/geoserver/helpers.py
Original file line number Diff line number Diff line change
Expand Up @@ -241,12 +241,20 @@ def get_sld_for(gs_catalog, layer):
# GeoServer sometimes fails to associate a style with the data, so
# for now we default to using a point style.(it works for lines and
# polygons, hope this doesn't happen for rasters though)
if layer.default_style is None:
_default_style = None
try:
_default_style = layer.default_style
except:
pass
if _default_style is None:
gs_catalog._cache.clear()
gs_layer = gs_catalog.get_layer(layer.name)
name = gs_layer.default_style.name if gs_layer.default_style is not None else "raster"
try:
gs_layer = gs_catalog.get_layer(layer.name)
name = gs_layer.default_style.name if gs_layer.default_style is not None else "raster"
except:
name = "raster"
else:
name = layer.default_style.name if layer.default_style is not None else "raster"
name = _default_style.name

# Detect geometry type if it is a FeatureType
if layer.resource and layer.resource.resource_type == 'featureType':
Expand Down Expand Up @@ -296,10 +304,6 @@ def fixup_style(cat, resource, style):
lyr.default_style = style
logger.info("Saving changes to %s", lyr)
cat.save(lyr)

# Invalidate GeoWebCache for the updated resource
_invalidate_geowebcache_layer(resource)

logger.info("Successfully updated %s", lyr)


Expand Down Expand Up @@ -355,9 +359,6 @@ def set_layer_style(saved_layer, title, sld, base_file=None):
except Exception as e:
logger.exception(e)

# Invalidate GeoWebCache for the updated resource
_invalidate_geowebcache_layer(saved_layer.alternate)


def cascading_delete(cat, layer_name):
resource = None
Expand Down Expand Up @@ -410,18 +411,23 @@ def cascading_delete(cat, layer_name):
lyr = cat.get_layer(resource_name)
if(lyr is not None): # Already deleted
store = resource.store
styles = lyr.styles + [lyr.default_style]
styles = lyr.styles
try:
styles = styles + [lyr.default_style]
except:
pass
gs_styles = [x for x in cat.get_styles()]
if settings.DEFAULT_WORKSPACE:
gs_styles = gs_styles + [x for x in cat.get_styles(workspace=settings.DEFAULT_WORKSPACE)]
ws_styles = []
for s in styles:
m = re.search(r'\d+$', s.name)
_name = s.name[:-len(m.group())] if m else s.name
_s = "%s_%s" % (settings.DEFAULT_WORKSPACE, _name)
for _gs in gs_styles:
if _s in _gs.name and _gs not in styles:
ws_styles.append(_gs)
if s is not None and s.name not in _default_style_names:
m = re.search(r'\d+$', s.name)
_name = s.name[:-len(m.group())] if m else s.name
_s = "%s_%s" % (settings.DEFAULT_WORKSPACE, _name)
for _gs in gs_styles:
if _s in _gs.name and _gs not in styles:
ws_styles.append(_gs)
styles = styles + ws_styles
cat.delete(lyr)
for s in styles:
Expand Down Expand Up @@ -904,27 +910,39 @@ def set_styles(layer, gs_catalog):

if gs_layer:
default_style = None
if gs_layer.default_style:
default_style = gs_layer.default_style
else:
default_style = gs_catalog.get_style(layer.name, workspace=settings.DEFAULT_WORKSPACE) \
or gs_catalog.get_style(layer.name)
try:
default_style = gs_layer.default_style or None
except:
pass

if not default_style:
try:
default_style = gs_catalog.get_style(layer.name, workspace=layer.workspace) \
or gs_catalog.get_style(layer.name)
gs_layer.default_style = default_style
gs_catalog.save(gs_layer)
except:
logger.exception("GeoServer Layer Default Style issues!")

if default_style:
layer.default_style = save_style(default_style)
# make sure we are not using a defaul SLD (which won't be editable)
if not default_style.workspace or default_style.workspace != layer.workspace:
sld_body = default_style.sld_body
gs_catalog.create_style(layer.name, sld_body, raw=True, workspace=layer.workspace)
style = gs_catalog.get_style(layer.name, workspace=layer.workspace)
else:
style = default_style
layer.default_style = save_style(style)
# FIXME: This should remove styles that are no longer valid
style_set.append(layer.default_style)

if gs_layer.styles:
alt_styles = gs_layer.styles

for alt_style in alt_styles:
style_set.append(save_style(alt_style))
try:
if gs_layer.styles:
alt_styles = gs_layer.styles
for alt_style in alt_styles:
if alt_style:
style_set.append(save_style(alt_style))
except:
pass

layer.styles = style_set

Expand All @@ -935,7 +953,6 @@ def set_styles(layer, gs_catalog):

Layer.objects.filter(id=layer.id).update(**to_update)
layer.refresh_from_db()
return layer


def save_style(gs_style):
Expand Down Expand Up @@ -1167,25 +1184,31 @@ def get_store(cat, name, workspace=None):

if workspace is None:
workspace = cat.get_default_workspace()
try:
store = cat.get_xml('%s/%s.xml' % (workspace.datastore_url[:-4], name))
except FailedRequestError:

if workspace:
try:
store = cat.get_xml('%s/%s.xml' % (workspace.coveragestore_url[:-4], name))
store = cat.get_xml('%s/%s.xml' % (workspace.datastore_url[:-4], name))
except FailedRequestError:
try:
store = cat.get_xml('%s/%s.xml' % (workspace.wmsstore_url[:-4], name))
store = cat.get_xml('%s/%s.xml' % (workspace.coveragestore_url[:-4], name))
except FailedRequestError:
raise FailedRequestError("No store found named: " + name)

if store.tag == 'dataStore':
store = datastore_from_index(cat, workspace, store)
elif store.tag == 'coverageStore':
store = coveragestore_from_index(cat, workspace, store)
elif store.tag == 'wmsStore':
store = wmsstore_from_index(cat, workspace, store)

return store
try:
store = cat.get_xml('%s/%s.xml' % (workspace.wmsstore_url[:-4], name))
except FailedRequestError:
raise FailedRequestError("No store found named: " + name)
if store:
if store.tag == 'dataStore':
store = datastore_from_index(cat, workspace, store)
elif store.tag == 'coverageStore':
store = coveragestore_from_index(cat, workspace, store)
elif store.tag == 'wmsStore':
store = wmsstore_from_index(cat, workspace, store)

return store
else:
raise FailedRequestError("No store found named: " + name)
else:
raise FailedRequestError("No store found named: " + name)


class ServerDoesNotExist(Exception):
Expand Down Expand Up @@ -1446,6 +1469,49 @@ def wps_execute_layer_attribute_statistics(layer_name, field):
# exml = etree.fromstring(response)


def _stylefilterparams_geowebcache_layer(layer_name):
http = httplib2.Http()
username, password = ogc_server_settings.credentials
auth = base64.encodestring(username + ':' + password)
# http.add_credentials(username, password)
headers = {
"Content-Type": "text/xml",
"Authorization": "Basic " + auth
}
url = '%sgwc/rest/layers/%s.xml' % (ogc_server_settings.LOCATION, layer_name)

# read GWC configuration
method = "GET"
response, _ = http.request(url, method, headers=headers)
if response.status != 200:
line = "Error {0} reading Style Filter Params GeoWebCache at {1}".format(
response.status, url
)
logger.error(line)
return

# check/write GWC filter parameters
import xml.etree.ElementTree as ET
body = None
tree = ET.fromstring(_)
param_filters = tree.findall('parameterFilters')
if param_filters and len(param_filters) > 0:
if not param_filters[0].findall('styleParameterFilter'):
style_filters_xml = "<styleParameterFilter><key>STYLES</key>\
<defaultValue></defaultValue></styleParameterFilter>"
style_filters_elem = ET.fromstring(style_filters_xml)
param_filters[0].append(style_filters_elem)
body = ET.tostring(tree)
if body:
method = "POST"
response, _ = http.request(url, method, body=body, headers=headers)
if response.status != 200:
line = "Error {0} writing Style Filter Params GeoWebCache at {1}".format(
response.status, url
)
logger.error(line)


def _invalidate_geowebcache_layer(layer_name, url=None):
http = httplib2.Http()
username, password = ogc_server_settings.credentials
Expand Down Expand Up @@ -1523,6 +1589,7 @@ def style_update(request, url):

# Invalidate GeoWebCache so it doesn't retain old style in tiles
try:
_stylefilterparams_geowebcache_layer(layer_name)
_invalidate_geowebcache_layer(layer_name)
except:
pass
Expand Down

0 comments on commit c6b85ae

Please sign in to comment.