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 <[email protected]>
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)

Reply via email to