AIRAVATA-3682 Make shared directory work with remote user storage API
diff --git a/django_airavata/apps/api/serializers.py b/django_airavata/apps/api/serializers.py
index b259c71..030b4a8 100644
--- a/django_airavata/apps/api/serializers.py
+++ b/django_airavata/apps/api/serializers.py
@@ -2,6 +2,7 @@
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 @@
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 @@
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 bda38db..a827434 100644
--- a/django_airavata/apps/api/view_utils.py
+++ b/django_airavata/apps/api/view_utils.py
@@ -2,6 +2,7 @@
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 @@
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):