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

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

commit bb64ad244ed54f3b4b6de3f089609ab46452b61a
Author: Marcus Christie <[email protected]>
AuthorDate: Tue Feb 21 13:56:56 2023 -0500

    AIRAVATA-3682 Make shared directory work with remote user storage API
---
 django_airavata/apps/api/serializers.py | 23 +++++++++++++++++++++++
 django_airavata/apps/api/view_utils.py  |  3 ++-
 2 files changed, 25 insertions(+), 1 deletion(-)

diff --git a/django_airavata/apps/api/serializers.py 
b/django_airavata/apps/api/serializers.py
index b259c716..030b4a8b 100644
--- a/django_airavata/apps/api/serializers.py
+++ b/django_airavata/apps/api/serializers.py
@@ -2,6 +2,7 @@ import copy
 import datetime
 import json
 import logging
+from pathlib import Path
 from urllib.parse import quote
 
 from airavata.model.appcatalog.appdeployment.ttypes import (
@@ -944,6 +945,26 @@ class 
UserHasWriteAccessToPathSerializer(serializers.Serializer):
 
     def get_userHasWriteAccess(self, instance):
         request = self.context['request']
+        # Special handling when using remote API to access user data storage
+        if hasattr(settings, 'GATEWAY_DATA_STORE_REMOTE_API'):
+            if "userHasWriteAccess" in instance:
+                return instance["userHasWriteAccess"]
+            elif instance.get("isDir", False):
+                path = Path(instance.get("path", ""))
+                if path != Path(""):
+                    # get parent directory listing and use that to figure out 
if
+                    # there is write access to this directory
+                    directories, _ = user_storage.listdir(request, path.parent)
+                    for d in directories:
+                        if Path(d["path"]) == path:
+                            return d.get("userHasWriteAccess", False)
+                    return False
+                else:
+                    # User always has write access on home directory
+                    return True
+            else:
+                return False
+
         is_shared_dir = view_utils.is_shared_dir(instance["path"])
         is_shared_path = view_utils.is_shared_path(instance["path"])
         if is_shared_dir:
@@ -984,6 +1005,8 @@ class 
UserStorageDirectorySerializer(UserHasWriteAccessToPathSerializer):
     isSharedDir = serializers.SerializerMethodField()
 
     def get_isSharedDir(self, directory):
+        if "isSharedDir" in directory:
+            return directory["isSharedDir"]
         return view_utils.is_shared_dir(directory["path"])
 
 
diff --git a/django_airavata/apps/api/view_utils.py 
b/django_airavata/apps/api/view_utils.py
index bda38db6..a827434f 100644
--- a/django_airavata/apps/api/view_utils.py
+++ b/django_airavata/apps/api/view_utils.py
@@ -2,6 +2,7 @@ import logging
 import os
 from collections.__init__ import OrderedDict
 from datetime import datetime
+from pathlib import Path
 
 import pytz
 from airavata_django_portal_sdk import user_storage
@@ -232,7 +233,7 @@ class ReadOnly(permissions.BasePermission):
 
 def is_shared_dir(path):
     shared_dirs: dict = getattr(settings, 'GATEWAY_DATA_SHARED_DIRECTORIES', 
{})
-    return any(map(lambda n: n == path, shared_dirs.keys()))
+    return any(map(lambda n: Path(n) == Path(path), shared_dirs.keys()))
 
 
 def is_shared_path(path):

Reply via email to