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):
