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)
