Skip to content

Commit e5bb6b7

Browse files
[Fixes #12880] Asset download doesn't work with 3D Tiles (#12454)
* Fix download urls * Fix download urls * Fix download urls
1 parent 16c2831 commit e5bb6b7

File tree

3 files changed

+32
-29
lines changed

3 files changed

+32
-29
lines changed

geonode/base/api/serializers.py

Lines changed: 2 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,6 @@
2828
from django.forms.models import model_to_dict
2929
from django.contrib.auth import get_user_model
3030
from django.db.models.query import QuerySet
31-
from geonode.assets.utils import get_default_asset
3231
from geonode.people import Roles
3332
from django.http import QueryDict
3433
from deprecated import deprecated
@@ -64,7 +63,6 @@
6463
from geonode.groups.models import GroupCategory, GroupProfile
6564
from geonode.base.api.fields import ComplexDynamicRelationField
6665
from geonode.layers.utils import get_download_handlers, get_default_dataset_download_handler
67-
from geonode.assets.handlers import asset_handler_registry
6866
from geonode.utils import build_absolute_uri
6967
from geonode.security.utils import get_resources_with_perms, get_geoapp_subtypes
7068
from geonode.resource.models import ExecutionRequest
@@ -301,10 +299,6 @@ def get_attribute(self, instance):
301299
logger.exception(e)
302300
raise e
303301

304-
asset = get_default_asset(_instance)
305-
if asset is not None:
306-
asset_url = asset_handler_registry.get_handler(asset).create_download_url(asset)
307-
308302
if _instance.resource_type in ["map"] + get_geoapp_subtypes():
309303
return []
310304
elif _instance.resource_type in ["document"]:
@@ -314,26 +308,21 @@ def get_attribute(self, instance):
314308
"ajax_safe": _instance.download_is_ajax_safe,
315309
},
316310
]
317-
if asset:
318-
payload.append({"url": asset_url, "ajax_safe": False, "default": False})
319311
return payload
320312

321313
elif _instance.resource_type in ["dataset"]:
322314
download_urls = []
323315
# lets get only the default one first to set it
324316
default_handler = get_default_dataset_download_handler()
325-
obj = default_handler(self.context.get("request"), _instance.alternate)
317+
obj = default_handler(self.context.get("request"), _instance.alternate, resource_pk=_instance.pk)
326318
if obj.download_url:
327319
download_urls.append({"url": obj.download_url, "ajax_safe": obj.is_ajax_safe, "default": True})
328320
# then let's prepare the payload with everything
329321
for handler in get_download_handlers():
330-
obj = handler(self.context.get("request"), _instance.alternate)
322+
obj = handler(self.context.get("request"), _instance.alternate, resource_pk=_instance.pk)
331323
if obj.download_url:
332324
download_urls.append({"url": obj.download_url, "ajax_safe": obj.is_ajax_safe, "default": False})
333325

334-
if asset:
335-
download_urls.append({"url": asset_url, "ajax_safe": True, "default": False if download_urls else True})
336-
337326
return download_urls
338327
else:
339328
return []

geonode/base/api/tests.py

Lines changed: 1 addition & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -58,8 +58,6 @@
5858
from geonode.assets.utils import create_asset_and_link
5959
from geonode.maps.models import Map, MapLayer
6060
from geonode.tests.base import GeoNodeBaseTestSupport
61-
from geonode.assets.utils import get_default_asset
62-
from geonode.assets.handlers import asset_handler_registry
6361

6462
from geonode.base import enumerations
6563
from geonode.base.api.serializers import ResourceBaseSerializer
@@ -2509,12 +2507,7 @@ def test_base_resources_return_download_links_for_documents(self):
25092507
Ensure we can access the Resource Base list.
25102508
"""
25112509
doc = Document.objects.first()
2512-
asset = get_default_asset(doc)
2513-
handler = asset_handler_registry.get_handler(asset)
2514-
expected_payload = [
2515-
{"url": build_absolute_uri(doc.download_url), "ajax_safe": doc.download_is_ajax_safe},
2516-
{"ajax_safe": False, "default": False, "url": handler.create_download_url(asset)},
2517-
]
2510+
expected_payload = [{"url": build_absolute_uri(doc.download_url), "ajax_safe": doc.download_is_ajax_safe}]
25182511
# From resource base API
25192512
json = self._get_for_object(doc, "base-resources-detail")
25202513
download_url = json.get("resource").get("download_urls")

geonode/layers/download_handler.py

Lines changed: 29 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,10 @@
2525
from django.urls import reverse
2626
from django.utils.translation import gettext_lazy as _
2727
from django.conf import settings
28+
from geonode.assets.utils import get_default_asset
29+
from geonode.assets.handlers import asset_handler_registry
2830
from geonode.base.auth import get_or_create_token
31+
from geonode.base.views import _resolve_resourcebase
2932
from geonode.geoserver.helpers import wps_format_is_supported
3033
from geonode.layers.views import _resolve_dataset
3134
from geonode.proxy.views import fetch_response_headers
@@ -41,9 +44,10 @@ def __str__(self):
4144
def __repr__(self):
4245
return self.__str__()
4346

44-
def __init__(self, request, resource_name) -> None:
47+
def __init__(self, request, resource_name, resource_pk=None) -> None:
4548
self.request = request
4649
self.resource_name = resource_name
50+
self.resource_pk = resource_pk
4751
self._resource = None
4852

4953
def get_download_response(self):
@@ -75,13 +79,19 @@ def download_url(self):
7579
resource = self.get_resource()
7680
if not resource:
7781
return None
78-
if resource.subtype not in ["vector", "raster", "vector_time"]:
82+
83+
if resource.subtype not in ["vector", "raster", "vector_time", "3dtiles"]:
7984
logger.info("Download URL is available only for datasets that have been harvested and copied locally")
8085
return None
8186

8287
if self.is_link_resource:
8388
return resource.link_set.filter(resource=resource.get_self_resource(), link_type="original").first().url
8489

90+
if resource.subtype == "3dtiles":
91+
asset = get_default_asset(resource)
92+
if asset is not None:
93+
return asset_handler_registry.get_handler(asset).create_download_url(asset)
94+
8595
return reverse("dataset_download", args=[resource.alternate])
8696

8797
def get_resource(self):
@@ -90,12 +100,23 @@ def get_resource(self):
90100
"""
91101
if not self._resource:
92102
try:
93-
self._resource = _resolve_dataset(
94-
self.request,
95-
self.resource_name,
96-
"base.download_resourcebase",
97-
_("You do not have download permissions for this dataset."),
98-
)
103+
104+
if self.resource_pk:
105+
self._resource = _resolve_resourcebase(
106+
self.request,
107+
self.resource_pk,
108+
"base.download_resourcebase",
109+
_("You do not have download permissions for this dataset."),
110+
)
111+
elif self.resource_name:
112+
self._resource = _resolve_dataset(
113+
self.request,
114+
self.resource_name,
115+
"base.download_resourcebase",
116+
_("You do not have download permissions for this dataset."),
117+
)
118+
else:
119+
raise Exception("Layer not found")
99120
except Exception as e:
100121
logger.debug(e)
101122

0 commit comments

Comments
 (0)