Skip to content

Commit

Permalink
[Fixes #4547] "set_all_layers_metadata" deletes Thumbnail metadata links
Browse files Browse the repository at this point in the history
  • Loading branch information
afabiani committed Jun 19, 2019
1 parent 0c80891 commit 09c7ab9
Show file tree
Hide file tree
Showing 4 changed files with 136 additions and 152 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -77,7 +77,7 @@ def handle(self, *args, **options):
set_attributes(layer, overwrite=True)

# refresh metadata links
set_resource_default_links(layer, layer, prune=True)
set_resource_default_links(layer, layer, prune=False)

# refresh catalogue metadata records
catalogue_post_save(instance=layer, sender=layer.__class__)
Expand Down
27 changes: 18 additions & 9 deletions geonode/base/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@
import traceback

from pyproj import transform, Proj
from urlparse import urlsplit
from urlparse import urlsplit, urljoin

from django.db import models
from django.core import serializers
Expand Down Expand Up @@ -1145,15 +1145,24 @@ def save_thumbnail(self, filename, image):
actual_name = storage.save(upload_path, ContentFile(image))
url = storage.url(actual_name)

# check whether it is an URI or not
parsed = urlsplit(url)
if not parsed.netloc:
# assuming is a relative path to current site
site_url = settings.SITEURL.rstrip('/') if settings.SITEURL.startswith('http') else settings.SITEURL
url = urljoin(site_url, url)

# should only have one 'Thumbnail' link
obj, created = Link.objects.get_or_create(resource=self,
name='Thumbnail',
defaults=dict(
url=url,
extension='png',
mime='image/png',
link_type='image',
))
obj, created = Link.objects.get_or_create(
resource=self,
name='Thumbnail',
defaults=dict(
url=url,
extension='png',
mime='image/png',
link_type='image',
)
)
self.thumbnail_url = url
obj.url = url
obj.save()
Expand Down
4 changes: 2 additions & 2 deletions geonode/layers/tests.py
Original file line number Diff line number Diff line change
Expand Up @@ -310,7 +310,7 @@ def test_layer_links(self):

links = Link.objects.filter(resource=lyr.resourcebase_ptr, link_type="image")
self.assertIsNotNone(links)
self.assertEquals(len(links), 3)
self.assertEquals(len(links), 5)

lyr = Layer.objects.filter(storeType="coverageStore").first()
self.assertEquals(lyr.storeType, "coverageStore")
Expand Down Expand Up @@ -342,7 +342,7 @@ def test_layer_links(self):

links = Link.objects.filter(resource=lyr.resourcebase_ptr, link_type="image")
self.assertIsNotNone(links)
self.assertEquals(len(links), 7)
self.assertEquals(len(links), 9)

def test_get_valid_user(self):
# Verify it accepts an admin user
Expand Down
255 changes: 115 additions & 140 deletions geonode/utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -1473,7 +1473,7 @@ def slugify_zh(text, separator='_'):
def set_resource_default_links(instance, layer, prune=False, **kwargs):

from geonode.base.models import Link
from urlparse import urlparse, urljoin
from urlparse import urljoin
from django.core.urlresolvers import reverse
from django.utils.translation import ugettext

Expand Down Expand Up @@ -1518,14 +1518,16 @@ def set_resource_default_links(instance, layer, prune=False, **kwargs):
# Create Raw Data download link
download_url = urljoin(settings.SITEURL,
reverse('download', args=[instance.id]))
Link.objects.get_or_create(resource=instance.resourcebase_ptr,
url=download_url,
defaults=dict(extension='zip',
name='Original Dataset',
mime='application/octet-stream',
link_type='original',
)
)
Link.objects.update_or_create(
resource=instance.resourcebase_ptr,
url=download_url,
defaults=dict(
extension='zip',
name='Original Dataset',
mime='application/octet-stream',
link_type='original',
)
)

# Set download links for WMS, WCS or WFS and KML
links = wms_links(ogc_server_settings.public_url + 'ows?',
Expand All @@ -1536,15 +1538,16 @@ def set_resource_default_links(instance, layer, prune=False, **kwargs):
width)

for ext, name, mime, wms_url in links:
Link.objects.get_or_create(resource=instance.resourcebase_ptr,
name=ugettext(name),
defaults=dict(
extension=ext,
url=wms_url,
mime=mime,
link_type='image',
)
)
Link.objects.update_or_create(
resource=instance.resourcebase_ptr,
name=ugettext(name),
defaults=dict(
extension=ext,
url=wms_url,
mime=mime,
link_type='image',
)
)

if instance.storeType == "dataStore":
links = wfs_links(ogc_server_settings.public_url + 'ows?',
Expand All @@ -1554,76 +1557,54 @@ def set_resource_default_links(instance, layer, prune=False, **kwargs):
for ext, name, mime, wfs_url in links:
if mime == 'SHAPE-ZIP':
name = 'Zipped Shapefile'
Link.objects.get_or_create(resource=instance.resourcebase_ptr,
url=wfs_url,
defaults=dict(
extension=ext,
name=name,
mime=mime,
url=wfs_url,
link_type='data',
)
)
Link.objects.update_or_create(
resource=instance.resourcebase_ptr,
url=wfs_url,
defaults=dict(
extension=ext,
name=name,
mime=mime,
url=wfs_url,
link_type='data',
)
)

elif instance.storeType == 'coverageStore':
links = wcs_links(ogc_server_settings.public_url + 'wcs?',
instance.alternate.encode('utf-8'),
bbox,
srid)

for ext, name, mime, wcs_url in links:
Link.objects.get_or_create(resource=instance.resourcebase_ptr,
url=wcs_url,
defaults=dict(
extension=ext,
name=name,
mime=mime,
link_type='data',
)
)

# @DEPRECATED: This code targeted to be removed
# kml_reflector_link_download = ogc_server_settings.public_url + "wms/kml?" + \
# urllib.urlencode({'layers': instance.alternate.encode('utf-8'), 'mode': "download"})
#
# Link.objects.get_or_create(resource=instance.resourcebase_ptr,
# url=kml_reflector_link_download,
# defaults=dict(
# extension='kml',
# name="KML",
# mime='text/xml',
# link_type='data',
# )
# )
#
# kml_reflector_link_view = ogc_server_settings.public_url + "wms/kml?" + \
# urllib.urlencode({'layers': instance.alternate.encode('utf-8'), 'mode': "refresh"})
#
# Link.objects.get_or_create(resource=instance.resourcebase_ptr,
# url=kml_reflector_link_view,
# defaults=dict(
# extension='kml',
# name="View in Google Earth",
# mime='text/xml',
# link_type='data',
# )
# )
Link.objects.update_or_create(
resource=instance.resourcebase_ptr,
url=wcs_url,
defaults=dict(
extension=ext,
name=name,
mime=mime,
link_type='data',
)
)

site_url = settings.SITEURL.rstrip('/') if settings.SITEURL.startswith('http') else settings.SITEURL
html_link_url = '%s%s' % (
site_url, instance.get_absolute_url())

if Link.objects.filter(resource=instance.resourcebase_ptr, url=html_link_url).count() > 1:
Link.objects.filter(resource=instance.resourcebase_ptr, url=html_link_url).delete()
Link.objects.get_or_create(resource=instance.resourcebase_ptr,
url=html_link_url,
defaults=dict(
extension='html',
name=instance.alternate,
mime='text/html',
link_type='html',
)
)
Link.objects.get_or_create(
resource=instance.resourcebase_ptr,
url=html_link_url,
defaults=dict(
extension='html',
name=instance.alternate,
mime='text/html',
link_type='html',
)
)

# Legend link
try:
Link.objects.filter(resource=instance.resourcebase_ptr, name='Legend').delete()
except BaseException:
Expand All @@ -1637,33 +1618,52 @@ def set_resource_default_links(instance, layer, prune=False, **kwargs):

if Link.objects.filter(resource=instance.resourcebase_ptr, url=legend_url).count() > 1:
Link.objects.filter(resource=instance.resourcebase_ptr, url=legend_url).delete()
Link.objects.get_or_create(resource=instance.resourcebase_ptr,
url=legend_url,
defaults=dict(
extension='png',
name='Legend',
url=legend_url,
mime='image/png',
link_type='image',
)
)
Link.objects.update_or_create(
resource=instance.resourcebase_ptr,
name='Legend',
url=legend_url,
defaults=dict(
extension='png',
url=legend_url,
mime='image/png',
link_type='image',
)
)

# Thumbnail link
from django.contrib.staticfiles.templatetags import staticfiles
if instance.get_thumbnail_url() == staticfiles.static(settings.MISSING_THUMBNAIL):
from geonode.geoserver.helpers import create_gs_thumbnail
create_gs_thumbnail(instance, overwrite=True, check_bbox=True)
else:
Link.objects.update_or_create(
resource=instance.resourcebase_ptr,
name='Thumbnail',
url=instance.get_thumbnail_url(),
defaults=dict(
extension='png',
mime='image/png',
link_type='image',
)
)

# ogc_wms_path = '%s/ows' % instance.workspace
ogc_wms_path = 'ows'
ogc_wms_url = urljoin(ogc_server_settings.public_url, ogc_wms_path)
ogc_wms_name = 'OGC WMS: %s Service' % instance.workspace
if Link.objects.filter(resource=instance.resourcebase_ptr, name=ogc_wms_name, url=ogc_wms_url).count() > 1:
Link.objects.filter(resource=instance.resourcebase_ptr, name=ogc_wms_name, url=ogc_wms_url).delete()
Link.objects.get_or_create(resource=instance.resourcebase_ptr,
url=ogc_wms_url,
name=ogc_wms_name,
defaults=dict(
extension='html',
url=ogc_wms_url,
mime='text/html',
link_type='OGC:WMS',
)
)
Link.objects.get_or_create(
resource=instance.resourcebase_ptr,
url=ogc_wms_url,
name=ogc_wms_name,
defaults=dict(
extension='html',
url=ogc_wms_url,
mime='text/html',
link_type='OGC:WMS',
)
)

if instance.storeType == "dataStore":
# ogc_wfs_path = '%s/wfs' % instance.workspace
Expand All @@ -1672,16 +1672,17 @@ def set_resource_default_links(instance, layer, prune=False, **kwargs):
ogc_wfs_name = 'OGC WFS: %s Service' % instance.workspace
if Link.objects.filter(resource=instance.resourcebase_ptr, name=ogc_wfs_name, url=ogc_wfs_url).count() > 1:
Link.objects.filter(resource=instance.resourcebase_ptr, name=ogc_wfs_name, url=ogc_wfs_url).delete()
Link.objects.get_or_create(resource=instance.resourcebase_ptr,
url=ogc_wfs_url,
name=ogc_wfs_name,
defaults=dict(
extension='html',
url=ogc_wfs_url,
mime='text/html',
link_type='OGC:WFS',
)
)
Link.objects.get_or_create(
resource=instance.resourcebase_ptr,
url=ogc_wfs_url,
name=ogc_wfs_name,
defaults=dict(
extension='html',
url=ogc_wfs_url,
mime='text/html',
link_type='OGC:WFS',
)
)

if instance.storeType == "coverageStore":
# ogc_wcs_path = '%s/wcs' % instance.workspace
Expand All @@ -1690,43 +1691,17 @@ def set_resource_default_links(instance, layer, prune=False, **kwargs):
ogc_wcs_name = 'OGC WCS: %s Service' % instance.workspace
if Link.objects.filter(resource=instance.resourcebase_ptr, name=ogc_wcs_name, url=ogc_wcs_url).count() > 1:
Link.objects.filter(resource=instance.resourcebase_ptr, name=ogc_wcs_name, url=ogc_wcs_url).delete()
Link.objects.get_or_create(resource=instance.resourcebase_ptr,
url=ogc_wcs_url,
name=ogc_wcs_name,
defaults=dict(
extension='html',
url=ogc_wcs_url,
mime='text/html',
link_type='OGC:WCS',
)
)

# remove links that belong to and old address
for link in instance.link_set.all():
if not urlparse(
settings.SITEURL).hostname == urlparse(
link.url).hostname and not urlparse(
ogc_server_settings.public_url).hostname == urlparse(
link.url).hostname:
link.delete()

# @DEPRECATED: This code does not work anymore
# Define the link after the cleanup, we should use this more rather then remove
# potential parasites
# tile_url = ('%sgwc/service/gmaps?' % ogc_server_settings.public_url +
# 'layers=%s' % instance.alternate.encode('utf-8') +
# '&zoom={z}&x={x}&y={y}' +
# '&format=image/png8'
# )
#
# link, created = Link.objects.get_or_create(resource=instance.resourcebase_ptr,
# extension='tiles',
# name="Tiles",
# mime='image/png',
# link_type='image',
# )
# if created:
# Link.objects.filter(pk=link.pk).update(url=tile_url)
Link.objects.get_or_create(
resource=instance.resourcebase_ptr,
url=ogc_wcs_url,
name=ogc_wcs_name,
defaults=dict(
extension='html',
url=ogc_wcs_url,
mime='text/html',
link_type='OGC:WCS',
)
)
elif check_ogc_backend(qgis_server.BACKEND_PACKAGE):
from geonode.layers.models import LayerFile
from geonode.qgis_server.helpers import (
Expand Down

0 comments on commit 09c7ab9

Please sign in to comment.