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 2020/10/05 18:26:12 UTC

[airavata-django-portal-sdk] branch master updated: AIRAVATA-3362 list_experiment_dir function

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


The following commit(s) were added to refs/heads/master by this push:
     new 457b189  AIRAVATA-3362 list_experiment_dir function
457b189 is described below

commit 457b189774af0db4b1640706e70c86f54ac9f7d6
Author: Marcus Christie <ma...@iu.edu>
AuthorDate: Mon Oct 5 14:12:27 2020 -0400

    AIRAVATA-3362 list_experiment_dir function
---
 airavata_django_portal_sdk/user_storage.py | 85 +++++++++++++++++++++++++++---
 1 file changed, 77 insertions(+), 8 deletions(-)

diff --git a/airavata_django_portal_sdk/user_storage.py b/airavata_django_portal_sdk/user_storage.py
index 2baaadc..808830b 100644
--- a/airavata_django_portal_sdk/user_storage.py
+++ b/airavata_django_portal_sdk/user_storage.py
@@ -384,6 +384,69 @@ def listdir(request, path):
         raise ObjectDoesNotExist("User storage path does not exist")
 
 
+def list_experiment_dir(request, experiment_id, path=None):
+    """
+    List files, directories in experiment data directory. Returns a tuple,
+    see `listdir`.
+    """
+    if _is_remote_api():
+        raise NotImplementedError()
+
+    experiment = request.airavata_client.getExperiment(
+            request.authz_token, experiment_id)
+    datastore = _Datastore()
+    exp_data_path = experiment.userConfigurationData.experimentDataDir
+    if path is not None:
+        exp_data_path = os.path.join(exp_data_path, path)
+    exp_owner = experiment.userName
+    if datastore.dir_exists(exp_owner, exp_data_path):
+        directories, files = datastore.list_user_dir(
+            exp_owner, exp_data_path)
+        directories_data = []
+        for d in directories:
+            dpath = os.path.join(path, d)
+            created_time = datastore.get_created_time(
+                exp_owner, dpath)
+            size = datastore.size(exp_owner, dpath)
+            directories_data.append(
+                {
+                    "name": d,
+                    "path": dpath,
+                    "created_time": created_time,
+                    "size": size,
+                    "hidden": dpath == TMP_INPUT_FILE_UPLOAD_DIR,
+                }
+            )
+        files_data = []
+        for f in files:
+            user_rel_path = os.path.join(path, f)
+            created_time = datastore.get_created_time(
+                exp_owner, user_rel_path
+            )
+            size = datastore.size(exp_owner, user_rel_path)
+            full_path = datastore.path(exp_owner, user_rel_path)
+            data_product_uri = _get_data_product_uri(request, full_path, owner=exp_owner)
+
+            data_product = request.airavata_client.getDataProduct(
+                request.authz_token, data_product_uri)
+            mime_type = None
+            if 'mime-type' in data_product.productMetadata:
+                mime_type = data_product.productMetadata['mime-type']
+            files_data.append(
+                {
+                    "name": f,
+                    "path": user_rel_path,
+                    "data-product-uri": data_product_uri,
+                    "created_time": created_time,
+                    "mime_type": mime_type,
+                    "size": size,
+                    "hidden": False,
+                }
+            )
+        return directories_data, files_data
+    else:
+        raise ObjectDoesNotExist("Experiment data directory does not exist")
+
 def get_experiment_dir(
         request,
         project_name=None,
@@ -409,36 +472,42 @@ def get_rel_path(request, path):
     return _Datastore().rel_path(request.user.username, path)
 
 
-def _get_data_product_uri(request, full_path):
+def _get_data_product_uri(request, full_path, owner=None):
 
     from airavata_django_portal_sdk import models
+    if owner is None:
+        owner = request.user.username
     user_file = models.UserFiles.objects.filter(
-        username=request.user.username, file_path=full_path)
+        username=owner, file_path=full_path)
     if user_file.exists():
         product_uri = user_file[0].file_dpu
     else:
-        data_product = _save_data_product(request, full_path)
+        data_product = _save_data_product(request, full_path, owner=owner)
         product_uri = data_product.productUri
     return product_uri
 
 
-def _save_data_product(request, full_path, name=None, content_type=None):
+def _save_data_product(request, full_path, name=None, content_type=None, owner=None):
     "Create, register and record in DB a data product for full_path."
+    if owner is None:
+        owner = request.user.username
     data_product = _create_data_product(
-        request.user.username, full_path, name=name, content_type=content_type
+        owner, full_path, name=name, content_type=content_type
     )
-    product_uri = _register_data_product(request, full_path, data_product)
+    product_uri = _register_data_product(request, full_path, data_product, owner=owner)
     data_product.productUri = product_uri
     return data_product
 
 
-def _register_data_product(request, full_path, data_product):
+def _register_data_product(request, full_path, data_product, owner=None):
+    if owner is None:
+        owner = request.user.username
     product_uri = request.airavata_client.registerDataProduct(
         request.authz_token, data_product
     )
     from airavata_django_portal_sdk import models
     user_file_instance = models.UserFiles(
-        username=request.user.username,
+        username=owner,
         file_path=full_path,
         file_dpu=product_uri)
     user_file_instance.save()