Skip to content

Commit

Permalink
Expose asset download link in download_urls
Browse files Browse the repository at this point in the history
  • Loading branch information
mattiagiupponi committed Jun 18, 2024
1 parent d008bad commit d7127c1
Show file tree
Hide file tree
Showing 8 changed files with 27 additions and 18 deletions.
4 changes: 2 additions & 2 deletions geonode/assets/handlers.py
Original file line number Diff line number Diff line change
Expand Up @@ -38,10 +38,10 @@ def clone(self, asset: Asset) -> Asset:
def create_link_url(self, asset: Asset) -> str:
raise NotImplementedError()

def get_download_handler(self, asset: Asset) -> AssetDownloadHandlerInterface:
def get_download_handler(self, asset: Asset = None) -> AssetDownloadHandlerInterface:
raise NotImplementedError()

def get_storage_manager(self, asset):
def get_storage_manager(self, asset = None):
raise NotImplementedError()


Expand Down
2 changes: 1 addition & 1 deletion geonode/assets/local.py
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ class LocalAssetHandler(AssetHandlerInterface):
def handled_asset_class():
return LocalAsset

def get_download_handler(self, asset):
def get_download_handler(self, asset=None):
return LocalAssetDownloadHandler()

def get_storage_manager(self, asset):
Expand Down
8 changes: 8 additions & 0 deletions geonode/assets/tests.py
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,14 @@

class AssetsTests(APITestCase):

def test_api_is_closed_if_not_logged_in(self):
response = self.client.get(reverse('assets-list'))
self.assertEqual(response.status_code, 403)

self.assertTrue(self.client.force_login(username="admin", password="admin"), "Login failed")
response = self.client.get(reverse('assets-list'))
self.assertEqual(response.status_code, 200)

def test_handler_registry(self):
# Test registry
self.assertIsNotNone(asset_handler_registry)
Expand Down
3 changes: 0 additions & 3 deletions geonode/assets/tests/data/one.json

This file was deleted.

3 changes: 0 additions & 3 deletions geonode/assets/tests/data/three.json

This file was deleted.

3 changes: 0 additions & 3 deletions geonode/assets/tests/data/two.json

This file was deleted.

18 changes: 14 additions & 4 deletions geonode/base/api/serializers.py
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@
from django.forms.models import model_to_dict
from django.contrib.auth import get_user_model
from django.db.models.query import QuerySet
from geonode.assets.utils import get_default_asset
from geonode.people import Roles
from django.http import QueryDict
from deprecated import deprecated
Expand Down Expand Up @@ -62,7 +63,8 @@
from geonode.geoapps.models import GeoApp
from geonode.groups.models import GroupCategory, GroupProfile
from geonode.base.api.fields import ComplexDynamicRelationField
from geonode.layers.utils import get_dataset_download_handlers, get_default_dataset_download_handler
from geonode.layers.utils import get_download_handlers, get_default_dataset_download_handler
from geonode.assets.handlers import asset_handler_registry
from geonode.utils import build_absolute_uri
from geonode.security.utils import get_resources_with_perms, get_geoapp_subtypes
from geonode.resource.models import ExecutionRequest
Expand Down Expand Up @@ -298,14 +300,20 @@ def get_attribute(self, instance):
except Exception as e:
logger.exception(e)
raise e

asset = get_default_asset(_instance)
asset_url = asset_handler_registry.get_handler(asset)\
.create_download_url(asset)

if _instance.resource_type in ["map"] + get_geoapp_subtypes():
return []
elif _instance.resource_type in ["document"]:
return [
{
"url": _instance.download_url,
"ajax_safe": _instance.download_is_ajax_safe,
}
},
{"url": asset_url, "ajax_safe": False, "default": False},
]
elif _instance.resource_type in ["dataset"]:
download_urls = []
Expand All @@ -315,11 +323,13 @@ def get_attribute(self, instance):
if obj.download_url:
download_urls.append({"url": obj.download_url, "ajax_safe": obj.is_ajax_safe, "default": True})
# then let's prepare the payload with everything
handler_list = get_dataset_download_handlers()
for handler in handler_list:
for handler in get_download_handlers():
obj = handler(self.context.get("request"), _instance.alternate)
if obj.download_url:
download_urls.append({"url": obj.download_url, "ajax_safe": obj.is_ajax_safe, "default": False})

download_urls.append({"url": asset_url, "ajax_safe": True, "default": False if download_urls else True})

return download_urls
else:
return []
Expand Down
4 changes: 2 additions & 2 deletions geonode/layers/utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,7 @@
from geonode.utils import check_ogc_backend
from geonode import GeoNodeException, geoserver
from geonode.layers.models import shp_exts, csv_exts, vec_exts, cov_exts, Dataset
from geonode.assets.handlers import asset_handler_registry

READ_PERMISSIONS = ["view_resourcebase"]
WRITE_PERMISSIONS = ["change_dataset_data", "change_dataset_style", "change_resourcebase_metadata"]
Expand Down Expand Up @@ -506,8 +507,7 @@ def get_uuid_handler():
default_dataset_download_handler = None
dataset_download_handler_list = []


def get_dataset_download_handlers():
def get_download_handlers():
if not dataset_download_handler_list and getattr(settings, "DATASET_DOWNLOAD_HANDLERS", None):
dataset_download_handler_list.append(import_string(settings.DATASET_DOWNLOAD_HANDLERS[0]))

Expand Down

0 comments on commit d7127c1

Please sign in to comment.