This is an automated email from the ASF dual-hosted git repository. machristie pushed a commit to branch mft-integration in repository https://gitbox.apache.org/repos/asf/airavata-django-portal-sdk.git
commit 197731ff0587e1f9e58f7d2a87cc0fb583076771 Author: Marcus Christie <[email protected]> AuthorDate: Mon Apr 26 15:54:31 2021 -0400 AIRAVATA-3420 /sdk/download redirects to the download url --- airavata_django_portal_sdk/urls.py | 3 +- airavata_django_portal_sdk/user_storage/api.py | 38 +++++++++++++--------- .../backends/django_filesystem_provider.py | 8 ----- airavata_django_portal_sdk/views.py | 16 +++------ 4 files changed, 30 insertions(+), 35 deletions(-) diff --git a/airavata_django_portal_sdk/urls.py b/airavata_django_portal_sdk/urls.py index 652157e..2337ef6 100644 --- a/airavata_django_portal_sdk/urls.py +++ b/airavata_django_portal_sdk/urls.py @@ -15,5 +15,6 @@ def get_download_url(data_product_uri): app_name = 'airavata_django_portal_sdk' urlpatterns = [ - path('download', views.download_file, name='download_file'), + path('download-file', views.download_file, name='download_file'), + path('download', views.download, name='download'), ] diff --git a/airavata_django_portal_sdk/user_storage/api.py b/airavata_django_portal_sdk/user_storage/api.py index 600a3b3..afd8eba 100644 --- a/airavata_django_portal_sdk/user_storage/api.py +++ b/airavata_django_portal_sdk/user_storage/api.py @@ -19,10 +19,13 @@ from airavata.model.data.replica.ttypes import ( ) from django.conf import settings from django.core.exceptions import ObjectDoesNotExist +from django.urls import reverse + +from airavata_django_portal_sdk.user_storage.backends.base import ( + ProvidesDownloadUrl +) from ..util import convert_iso8601_to_datetime -from django.urls import reverse -from airavata_django_portal_sdk.user_storage.backends.base import ProvidesDownloadUrl logger = logging.getLogger(__name__) @@ -186,20 +189,25 @@ def move_input_file(request, data_product=None, path=None, data_product_uri=None def get_download_url(request, data_product=None, data_product_uri=None): if data_product is None: data_product = _get_data_product(request, data_product_uri) - if _is_remote_api(): - raise NotImplementedError() + storage_resource_id, path = _get_replica_resource_id_and_filepath(data_product) + backend = get_user_storage_provider(request, + owner_username=data_product.ownerName, + storage_resource_id=storage_resource_id) + if isinstance(backend, ProvidesDownloadUrl): + return backend.get_download_url(path) else: - storage_resource_id, path = _get_replica_resource_id_and_filepath(data_product) - backend = get_user_storage_provider(request, - owner_username=data_product.ownerName, - storage_resource_id=storage_resource_id) - if isinstance(backend, ProvidesDownloadUrl): - return backend.get_download_url(path) - else: - # if backend doesn't provide a download url, then use default one - # that uses backend to read the file - return (reverse("airavata_django_portal_sdk:download_file") + "?" + - urlencode({"data-product-uri": data_product.productUri})) + # if backend doesn't provide a download url, then use default one + # that uses backend to read the file + return (reverse("airavata_django_portal_sdk:download_file") + "?" + + urlencode({"data-product-uri": data_product.productUri})) + + +def get_lazy_download_url(request, data_product=None, data_product_uri=None): + if data_product is None: + data_product = _get_data_product(request, data_product_uri) + # /download will call get_download_url and redirect to it + return (reverse("airavata_django_portal_sdk:download") + "?" + + urlencode({"data-product-uri": data_product.productUri})) def open_file(request, data_product=None, data_product_uri=None): diff --git a/airavata_django_portal_sdk/user_storage/backends/django_filesystem_provider.py b/airavata_django_portal_sdk/user_storage/backends/django_filesystem_provider.py index 97e2f9e..98a0038 100644 --- a/airavata_django_portal_sdk/user_storage/backends/django_filesystem_provider.py +++ b/airavata_django_portal_sdk/user_storage/backends/django_filesystem_provider.py @@ -20,17 +20,9 @@ class DjangoFileSystemProvider(UserStorageProvider): full_path = self.datastore.save(path, file, name=name) return self.storage_resource_id, full_path - def get_upload_url(self, resource_path): - # TODO: implement - return super().get_upload_url(resource_path) - def open(self, resource_path): return self.datastore.open(resource_path) - def get_download_url(self, resource_path): - # TODO: implement - return super().get_download_url(resource_path) - def exists(self, resource_path): return self.datastore.exists(resource_path) diff --git a/airavata_django_portal_sdk/views.py b/airavata_django_portal_sdk/views.py index 688ca84..e9e3612 100644 --- a/airavata_django_portal_sdk/views.py +++ b/airavata_django_portal_sdk/views.py @@ -1,32 +1,26 @@ import logging import os -from urllib.parse import urlparse from django.contrib.auth.decorators import login_required from django.core.exceptions import ObjectDoesNotExist from django.http import FileResponse, Http404 from django.shortcuts import redirect -from django.urls import reverse from airavata_django_portal_sdk import user_storage logger = logging.getLogger(__name__) -# TODO: moving this view out of REST API means losing access token based authentication @login_required -def download_file(request): - +def download(request): data_product_uri = request.GET.get('data-product-uri', '') download_url = user_storage.get_download_url(request, data_product_uri=data_product_uri) - # If the download_url resolves to this view, then handle it directly - if urlparse(download_url).path == reverse('airavata_django_portal_sdk:download_file'): - return _internal_download_file(request) - else: - return redirect(download_url) + return redirect(download_url) -def _internal_download_file(request): +# TODO: moving this view out of REST API means losing access token based authentication +@login_required +def download_file(request): data_product_uri = request.GET.get('data-product-uri', '') force_download = 'download' in request.GET data_product = None
