You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@airavata.apache.org by ma...@apache.org on 2021/08/04 14:25:03 UTC

[airavata-django-portal-sdk] 04/05: AIRAVATA-3420 Implement get_download_url for REMOTE API, return full URL

This is an automated email from the ASF dual-hosted git repository.

machristie pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/airavata-django-portal-sdk.git

commit 5c5b002f22ae59c66cc23d467d6b7fd80839f8db
Author: Marcus Christie <ma...@apache.org>
AuthorDate: Wed Aug 4 10:19:16 2021 -0400

    AIRAVATA-3420 Implement get_download_url for REMOTE API, return full URL
---
 airavata_django_portal_sdk/user_storage/api.py | 32 +++++++++++++++++++++-----
 1 file changed, 26 insertions(+), 6 deletions(-)

diff --git a/airavata_django_portal_sdk/user_storage/api.py b/airavata_django_portal_sdk/user_storage/api.py
index a15b4b7..252ce0d 100644
--- a/airavata_django_portal_sdk/user_storage/api.py
+++ b/airavata_django_portal_sdk/user_storage/api.py
@@ -196,6 +196,17 @@ def get_download_url(request, data_product=None, data_product_uri=None, force_do
     "Return URL for downloading data product. One of `data_product` or `data_product_uri` is required."
     if data_product is None:
         data_product = _get_data_product(request, data_product_uri)
+    if _is_remote_api():
+        resp = _call_remote_api(
+            request,
+            "/data-products/",
+            params={'product-uri': data_product.productUri},
+            raise_for_status=False)
+        if resp.status_code == HTTPStatus.NOT_FOUND:
+            return None
+        resp.raise_for_status()
+        data = resp.json()
+        return data['downloadURL']
     storage_resource_id, path = _get_replica_resource_id_and_filepath(data_product)
     backend = get_user_storage_provider(request,
                                         owner_username=data_product.ownerName,
@@ -210,15 +221,26 @@ def get_download_url(request, data_product=None, data_product_uri=None, force_do
             params['download'] = ''
         if mime_type is not None:
             params['mime-type'] = mime_type
-        return f"{reverse('airavata_django_portal_sdk:download_file')}?{urlencode(params)}"
+        return request.build_absolute_uri(f"{reverse('airavata_django_portal_sdk:download_file')}?{urlencode(params)}")
 
 
 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)
+    if _is_remote_api():
+        resp = _call_remote_api(
+            request,
+            "/data-products/",
+            params={'product-uri': data_product.productUri},
+            raise_for_status=False)
+        if resp.status_code == HTTPStatus.NOT_FOUND:
+            return None
+        resp.raise_for_status()
+        data = resp.json()
+        return data['downloadURL']
     # /download will call get_download_url and redirect to it
-    return (reverse("airavata_django_portal_sdk:download") + "?" +
-            urlencode({"data-product-uri": data_product.productUri}))
+    return request.build_absolute_uri(reverse("airavata_django_portal_sdk:download") + "?" +
+                                      urlencode({"data-product-uri": data_product.productUri}))
 
 
 def open_file(request, data_product=None, data_product_uri=None):
@@ -233,9 +255,7 @@ def open_file(request, data_product=None, data_product_uri=None):
             request,
             "/download",
             params={'data-product-uri': data_product.productUri},
-            # TODO: once /sdk/download is integrated with airavata-django-portal, this can be updated to
-            # base_url="/sdk"
-            base_url="/api")
+            base_url="/sdk")
         file = io.BytesIO(resp.content)
         disposition = resp.headers['Content-Disposition']
         disp_value, disp_params = cgi.parse_header(disposition)