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/01/25 23:15:20 UTC

[airavata-django-portal] branch AIRAVATA-3681 created (now 304b3d84)

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

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


      at 304b3d84 AIRAVATA-3681 Disable Ext. User Profile editor form for read-only admins

This branch includes the following new commits:

     new 304b3d84 AIRAVATA-3681 Disable Ext. User Profile editor form for read-only admins

The 1 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.



[airavata-django-portal] 01/01: AIRAVATA-3681 Disable Ext. User Profile editor form for read-only admins

Posted by ma...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

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

commit 304b3d848f23d30d62a0d482c958234337cfca4f
Author: Marcus Christie <ma...@apache.org>
AuthorDate: Wed Jan 25 18:15:06 2023 -0500

    AIRAVATA-3681 Disable Ext. User Profile editor form for read-only admins
---
 .../users/ExtendedUserProfileContainer.vue         | 15 +++++-
 .../ExtendedUserProfileFieldEditor.vue             | 53 +++++++++++++++-------
 .../js/models/ExtendedUserProfileField.js          |  1 +
 django_airavata/apps/auth/serializers.py           |  7 ++-
 4 files changed, 57 insertions(+), 19 deletions(-)

diff --git a/django_airavata/apps/admin/static/django_airavata_admin/src/components/users/ExtendedUserProfileContainer.vue b/django_airavata/apps/admin/static/django_airavata_admin/src/components/users/ExtendedUserProfileContainer.vue
index f2ff36a0..e5ac3a59 100644
--- a/django_airavata/apps/admin/static/django_airavata_admin/src/components/users/ExtendedUserProfileContainer.vue
+++ b/django_airavata/apps/admin/static/django_airavata_admin/src/components/users/ExtendedUserProfileContainer.vue
@@ -19,6 +19,7 @@
           <extended-user-profile-field-editor
             ref="extendedUserProfileFieldEditors"
             :extendedUserProfileField="field"
+            :disabled="!field.userHasWriteAccess"
             @valid="recordValidChildComponent(field)"
             @invalid="recordInvalidChildComponent(field)"
           />
@@ -28,7 +29,7 @@
     <div ref="bottom" />
     <div class="fixed-footer">
       <div class="d-flex">
-        <b-dropdown text="Add Field">
+        <b-dropdown text="Add Field" :disabled="!isGatewayAdmin">
           <b-dropdown-item @click="addField('text')">Text</b-dropdown-item>
           <b-dropdown-item @click="addField('single_choice')"
             >Single Choice</b-dropdown-item
@@ -40,7 +41,13 @@
             >User Agreement</b-dropdown-item
           >
         </b-dropdown>
-        <b-button variant="primary" @click="save" class="ml-2">Save</b-button>
+        <b-button
+          variant="primary"
+          @click="save"
+          class="ml-2"
+          :disabled="!isGatewayAdmin"
+          >Save</b-button
+        >
         <b-button variant="secondary" class="ml-auto" href="/admin/users"
           >Return to Manage Users</b-button
         >
@@ -53,6 +60,7 @@
 import { mapActions, mapGetters } from "vuex";
 import ExtendedUserProfileFieldEditor from "./field-editors/ExtendedUserProfileFieldEditor.vue";
 import { mixins } from "django-airavata-common-ui";
+import { session } from "django-airavata-api";
 export default {
   mixins: [mixins.ValidationParent],
   components: { ExtendedUserProfileFieldEditor },
@@ -123,6 +131,9 @@ export default {
     valid() {
       return this.childComponentsAreValid;
     },
+    isGatewayAdmin() {
+      return session.Session.isGatewayAdmin;
+    },
   },
 };
 </script>
diff --git a/django_airavata/apps/admin/static/django_airavata_admin/src/components/users/field-editors/ExtendedUserProfileFieldEditor.vue b/django_airavata/apps/admin/static/django_airavata_admin/src/components/users/field-editors/ExtendedUserProfileFieldEditor.vue
index 0d2d5944..19438a76 100644
--- a/django_airavata/apps/admin/static/django_airavata_admin/src/components/users/field-editors/ExtendedUserProfileFieldEditor.vue
+++ b/django_airavata/apps/admin/static/django_airavata_admin/src/components/users/field-editors/ExtendedUserProfileFieldEditor.vue
@@ -3,7 +3,7 @@
     :title="title"
     :border-variant="$v.$anyDirty && $v.$invalid ? 'danger' : null"
   >
-    <b-form-group label="Name" label-cols="3">
+    <b-form-group label="Name" label-cols="3" :disabled="disabled">
       <b-form-input v-model="name" :state="validateState($v.name)" />
       <b-form-invalid-feedback :state="validateState($v.name)"
         >This field is required.</b-form-invalid-feedback
@@ -12,6 +12,7 @@
     <b-form-group
       label="Checkbox Label"
       label-cols="3"
+      :disabled="disabled"
       v-if="extendedUserProfileField.field_type === 'user_agreement'"
     >
       <b-form-input
@@ -23,14 +24,14 @@
         >This field is required.</b-form-invalid-feedback
       >
     </b-form-group>
-    <b-form-group label-cols="3">
+    <b-form-group label-cols="3" :disabled="disabled">
       <template #label>
         Help text
         <small class="text-muted text-small">(Optional)</small>
       </template>
       <b-form-input v-model="help_text" />
     </b-form-group>
-    <b-form-group>
+    <b-form-group :disabled="disabled">
       <b-form-checkbox v-model="required" switch> Required </b-form-checkbox>
     </b-form-group>
     <b-card title="Options" v-if="extendedUserProfileField.supportsChoices">
@@ -39,7 +40,7 @@
           v-for="({ $model: choice, display_text: $v_display_text },
           index) in $v.choices.$each.$iter"
         >
-          <b-form-group :key="choice.key">
+          <b-form-group :key="choice.key" :disabled="disabled">
             <b-input-group>
               <b-form-input
                 :value="choice.display_text"
@@ -87,7 +88,11 @@
             >
           </b-form-group>
         </template>
-        <b-form-group :key="'other'" v-if="extendedUserProfileField.other">
+        <b-form-group
+          :key="'other'"
+          v-if="extendedUserProfileField.other"
+          :disabled="disabled"
+        >
           <b-input-group>
             <b-form-input
               placeholder="User will see: Other (please specify)"
@@ -112,14 +117,14 @@
           </b-input-group>
         </b-form-group>
       </transition-group>
-      <b-form-group>
+      <b-form-group :disabled="disabled">
         <b-button
           @click="addChoice({ field: extendedUserProfileField })"
           size="sm"
           >Add Option</b-button
         >
       </b-form-group>
-      <b-form-group>
+      <b-form-group :disabled="disabled">
         <b-form-checkbox v-model="other" switch>
           Allow user to type in an "Other" option
         </b-form-checkbox>
@@ -134,7 +139,7 @@
             .$each.$iter"
           :key="link.key"
         >
-          <b-form-group label="Label" label-cols="3">
+          <b-form-group label="Label" label-cols="3" :disabled="disabled">
             <b-form-input
               :value="link.label"
               @input="handleLinkLabelChanged(link, $event, $v_label)"
@@ -144,7 +149,7 @@
               >This field is required.</b-form-invalid-feedback
             >
           </b-form-group>
-          <b-form-group label="URL" label-cols="3">
+          <b-form-group label="URL" label-cols="3" :disabled="disabled">
             <b-form-input
               :value="link.url"
               @input="handleLinkURLChanged(link, $event, $v_url)"
@@ -156,7 +161,7 @@
           </b-form-group>
           <b-row>
             <b-col>
-              <b-form-group>
+              <b-form-group :disabled="disabled">
                 <b-form-checkbox
                   :checked="link.display_link"
                   @input="handleLinkDisplayLinkChanged(link, $event)"
@@ -167,7 +172,7 @@
               </b-form-group>
             </b-col>
             <b-col>
-              <b-form-group>
+              <b-form-group :disabled="disabled">
                 <b-form-checkbox
                   :checked="link.display_inline"
                   @input="handleLinkDisplayInlineChanged(link, $event)"
@@ -178,18 +183,27 @@
               </b-form-group>
             </b-col>
           </b-row>
-          <b-button @click="handleLinkDeleted(link)" variant="danger" size="sm">
+          <b-button
+            @click="handleLinkDeleted(link)"
+            variant="danger"
+            size="sm"
+            :disabled="disabled"
+          >
             Delete Link
           </b-button>
         </b-card>
       </transition-group>
     </template>
-    <b-button @click="addLink({ field: extendedUserProfileField })" size="sm"
+    <b-button
+      @click="addLink({ field: extendedUserProfileField })"
+      size="sm"
+      :disabled="disabled"
       >Add Link</b-button
     >
     <b-button
       @click="handleMoveUp({ field: extendedUserProfileField })"
       :disabled="
+        disabled ||
         extendedUserProfileFields.indexOf(extendedUserProfileField) === 0
       "
       size="sm"
@@ -198,13 +212,20 @@
     <b-button
       @click="handleMoveDown({ field: extendedUserProfileField })"
       :disabled="
+        disabled ||
         extendedUserProfileFields.indexOf(extendedUserProfileField) ===
-        extendedUserProfileFields.length - 1
+          extendedUserProfileFields.length - 1
       "
       size="sm"
       >Move Down</b-button
     >
-    <b-button @click="handleDelete" variant="danger" size="sm">Delete</b-button>
+    <b-button
+      @click="handleDelete"
+      variant="danger"
+      size="sm"
+      :disabled="disabled"
+      >Delete</b-button
+    >
   </b-card>
 </template>
 
@@ -215,7 +236,7 @@ import { required, requiredIf } from "vuelidate/lib/validators";
 import { errors } from "django-airavata-common-ui";
 export default {
   mixins: [validationMixin],
-  props: ["extendedUserProfileField"],
+  props: ["extendedUserProfileField", "disabled"],
   computed: {
     ...mapGetters("extendedUserProfile", ["extendedUserProfileFields"]),
     name: {
diff --git a/django_airavata/apps/api/static/django_airavata_api/js/models/ExtendedUserProfileField.js b/django_airavata/apps/api/static/django_airavata_api/js/models/ExtendedUserProfileField.js
index 04938ca5..44076bc2 100644
--- a/django_airavata/apps/api/static/django_airavata_api/js/models/ExtendedUserProfileField.js
+++ b/django_airavata/apps/api/static/django_airavata_api/js/models/ExtendedUserProfileField.js
@@ -32,6 +32,7 @@ const FIELDS = [
   },
   "other",
   "required",
+  "userHasWriteAccess",
 ];
 
 export default class ExtendedUserProfileField extends BaseModel {
diff --git a/django_airavata/apps/auth/serializers.py b/django_airavata/apps/auth/serializers.py
index 06d8def8..4b35c111 100644
--- a/django_airavata/apps/auth/serializers.py
+++ b/django_airavata/apps/auth/serializers.py
@@ -126,11 +126,12 @@ class ExtendedUserProfileFieldSerializer(serializers.ModelSerializer):
     choices = ExtendedUserProfileFieldChoiceSerializer(required=False, many=True)
     checkbox_label = serializers.CharField(allow_blank=True, required=False)
     links = ExtendedUserProfileFieldLinkSerializer(required=False, many=True)
+    userHasWriteAccess = serializers.SerializerMethodField()
 
     class Meta:
         model = models.ExtendedUserProfileField
         fields = ['id', 'name', 'help_text', 'order', 'created_date',
-                  'updated_date', 'field_type', 'other', 'choices', 'checkbox_label', 'links', 'required']
+                  'updated_date', 'field_type', 'other', 'choices', 'checkbox_label', 'links', 'required', 'userHasWriteAccess']
         read_only_fields = ('created_date', 'updated_date')
 
     def to_representation(self, instance):
@@ -229,6 +230,10 @@ class ExtendedUserProfileFieldSerializer(serializers.ModelSerializer):
         instance.save()
         return instance
 
+    def get_userHasWriteAccess(self, extendedUserProfileField):
+        request = self.context['request']
+        return request.is_gateway_admin
+
 
 class ExtendedUserProfileValueSerializer(serializers.ModelSerializer):
     id = serializers.IntegerField(label='ID', required=False)