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 2023/02/21 21:40:44 UTC
[airavata-django-portal] 04/04: AIRAVATA-3682 Make text editor readonly when file is in shared dir
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 8fe3e7ac4b650be9a00840864a45bede707eb395
Author: Marcus Christie <ma...@apache.org>
AuthorDate: Tue Feb 21 16:36:43 2023 -0500
AIRAVATA-3682 Make text editor readonly when file is in shared dir
---
django_airavata/apps/api/serializers.py | 14 ++++++++++++++
.../static/django_airavata_api/js/models/DataProduct.js | 1 +
.../storage/storage-edit/UserStorageTextEditViewer.vue | 17 ++++++++++++++---
.../js/containers/UserStorageContainer.vue | 1 +
4 files changed, 30 insertions(+), 3 deletions(-)
diff --git a/django_airavata/apps/api/serializers.py b/django_airavata/apps/api/serializers.py
index 030b4a8b..618075f2 100644
--- a/django_airavata/apps/api/serializers.py
+++ b/django_airavata/apps/api/serializers.py
@@ -549,6 +549,7 @@ class DataProductSerializer(
downloadURL = serializers.SerializerMethodField()
isInputFileUpload = serializers.SerializerMethodField()
filesize = serializers.SerializerMethodField()
+ userHasWriteAccess = serializers.SerializerMethodField()
def get_downloadURL(self, data_product):
"""Getter for downloadURL field. Returns None if file is not available."""
@@ -572,6 +573,19 @@ class DataProductSerializer(
else:
return 0
+ def get_userHasWriteAccess(self, data_product: DataProductModel):
+ request = self.context['request']
+ file_metadata = user_storage.get_data_product_metadata(request, data_product_uri=data_product.productUri)
+ if "userHasWriteAccess" in file_metadata:
+ return file_metadata["userHasWriteAccess"]
+ else:
+ path = file_metadata["path"]
+ shared_path = view_utils.is_shared_path(path)
+ if shared_path:
+ # Only admins can edit files/directories in a shared directory
+ return request.is_gateway_admin
+ return True
+
# TODO move this into airavata_sdk?
class FullExperiment:
diff --git a/django_airavata/apps/api/static/django_airavata_api/js/models/DataProduct.js b/django_airavata/apps/api/static/django_airavata_api/js/models/DataProduct.js
index 34c1e143..507d5bdb 100644
--- a/django_airavata/apps/api/static/django_airavata_api/js/models/DataProduct.js
+++ b/django_airavata/apps/api/static/django_airavata_api/js/models/DataProduct.js
@@ -29,6 +29,7 @@ const FIELDS = [
"downloadURL",
"isInputFileUpload",
"filesize",
+ "userHasWriteAccess",
];
const FILENAME_REGEX = /[^/]+$/;
diff --git a/django_airavata/apps/workspace/static/django_airavata_workspace/js/components/storage/storage-edit/UserStorageTextEditViewer.vue b/django_airavata/apps/workspace/static/django_airavata_workspace/js/components/storage/storage-edit/UserStorageTextEditViewer.vue
index a78a528e..aa8ff0c1 100644
--- a/django_airavata/apps/workspace/static/django_airavata_workspace/js/components/storage/storage-edit/UserStorageTextEditViewer.vue
+++ b/django_airavata/apps/workspace/static/django_airavata_workspace/js/components/storage/storage-edit/UserStorageTextEditViewer.vue
@@ -2,8 +2,12 @@
<div>
<div class="user-storage-file-edit-viewer-status">
<div class="user-storage-file-edit-viewer-status-message">
- <span v-if="editAvailable && saved">All the changes are saved.</span>
- <span v-if="editAvailable && !saved">Changes are not saved.</span>
+ <span v-if="editAvailable && !readOnly && saved"
+ >All the changes are saved.</span
+ >
+ <span v-if="editAvailable && !readOnly && !saved"
+ >Changes are not saved.</span
+ >
</div>
<div class="user-storage-file-edit-viewer-status-actions">
<user-storage-download-button
@@ -11,7 +15,7 @@
:file-name="fileName"
/>
<b-button
- v-if="editAvailable"
+ v-if="editAvailable && !readOnly"
:disabled="saved"
@click="fileContentChanged"
>Save</b-button
@@ -76,6 +80,12 @@ export default {
editAvailable() {
return !this.dataProduct || this.dataProduct.filesize < MAX_EDIT_FILESIZE;
},
+ userHasWriteAccess() {
+ return this.dataProduct && this.dataProduct.userHasWriteAccess;
+ },
+ readOnly() {
+ return !this.userHasWriteAccess;
+ },
},
methods: {
fileContentChanged() {
@@ -124,6 +134,7 @@ export default {
scrollbarStyle: "native",
extraKeys: { "Ctrl-Space": "autocomplete" },
value: value,
+ readOnly: this.readOnly,
});
this.editor.on("change", () => {
this.saved = false;
diff --git a/django_airavata/apps/workspace/static/django_airavata_workspace/js/containers/UserStorageContainer.vue b/django_airavata/apps/workspace/static/django_airavata_workspace/js/containers/UserStorageContainer.vue
index bd0e83da..919e0ab6 100644
--- a/django_airavata/apps/workspace/static/django_airavata_workspace/js/containers/UserStorageContainer.vue
+++ b/django_airavata/apps/workspace/static/django_airavata_workspace/js/containers/UserStorageContainer.vue
@@ -87,6 +87,7 @@ export default {
mimeType: dataProduct.productMetadata["mime-type"],
name: dataProduct.productName,
size: dataProduct.productSize,
+ userHasWriteAccess: dataProduct.userHasWriteAccess,
},
],
parts: [],