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 2018/06/04 18:15:05 UTC

[airavata-django-portal] 03/04: AIRAVATA-2794 Prevent deleting GatewayGroups groups

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

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

commit b82da7c30e02a546b6f0dae9e6ff02f848bbbde7
Author: Marcus Christie <ma...@iu.edu>
AuthorDate: Tue May 22 17:40:40 2018 -0400

    AIRAVATA-2794 Prevent deleting GatewayGroups groups
---
 django_airavata/apps/api/serializers.py            | 24 ++++++++++++++++++++++
 .../static/django_airavata_api/js/models/Group.js  |  3 +++
 .../js/group_components/GroupListItem.vue          | 18 ++++++++++++++--
 3 files changed, 43 insertions(+), 2 deletions(-)

diff --git a/django_airavata/apps/api/serializers.py b/django_airavata/apps/api/serializers.py
index fffdd5f..6b4398d 100644
--- a/django_airavata/apps/api/serializers.py
+++ b/django_airavata/apps/api/serializers.py
@@ -138,6 +138,9 @@ class GroupSerializer(serializers.Serializer):
     isAdmin = serializers.SerializerMethodField()
     isOwner = serializers.SerializerMethodField()
     isMember = serializers.SerializerMethodField()
+    isGatewayAdminsGroup = serializers.SerializerMethodField()
+    isReadOnlyGatewayAdminsGroup = serializers.SerializerMethodField()
+    isDefaultGatewayUsersGroup = serializers.SerializerMethodField()
 
     def create(self, validated_data):
         validated_data['ownerId'] = self.context['request'].user.username + "@" + settings.GATEWAY_ID
@@ -170,6 +173,27 @@ class GroupSerializer(serializers.Serializer):
         username = request.user.username + "@" + settings.GATEWAY_ID
         return group.members and username in group.members
 
+    def get_isGatewayAdminsGroup(self, group):
+        request = self.context['request']
+        return group.id == self._gateway_groups()['adminsGroupId']
+
+    def get_isReadOnlyGatewayAdminsGroup(self, group):
+        request = self.context['request']
+        return group.id == self._gateway_groups()['readOnlyAdminsGroupId']
+
+    def get_isDefaultGatewayUsersGroup(self, group):
+        return group.id == self._gateway_groups()['defaultGatewayUsersGroupId']
+
+    def _gateway_groups(self):
+        request = self.context['request']
+        # gateway_groups_middleware sets this session variable
+        if 'GATEWAY_GROUPS' in request.session:
+            return request.session['GATEWAY_GROUPS']
+        else:
+            gateway_groups = request.airavata_client.getGatewayGroups(
+                request.authz_token)
+            return copy.deepcopy(gateway_groups.__dict__)
+
 
 class ProjectSerializer(serializers.Serializer):
     url = FullyEncodedHyperlinkedIdentityField(view_name='django_airavata_api:project-detail', lookup_field='projectID', lookup_url_kwarg='project_id')
diff --git a/django_airavata/apps/api/static/django_airavata_api/js/models/Group.js b/django_airavata/apps/api/static/django_airavata_api/js/models/Group.js
index f570c2e..54afe01 100644
--- a/django_airavata/apps/api/static/django_airavata_api/js/models/Group.js
+++ b/django_airavata/apps/api/static/django_airavata_api/js/models/Group.js
@@ -9,6 +9,9 @@ const FIELDS = [
     'isOwner',
     'isAdmin',
     'isMember',
+    'isGatewayAdminsGroup',
+    'isReadOnlyGatewayAdminsGroup',
+    'isDefaultGatewayUsersGroup',
 ];
 
 export default class Group extends BaseModel {
diff --git a/django_airavata/apps/groups/static/django_airavata_groups/js/group_components/GroupListItem.vue b/django_airavata/apps/groups/static/django_airavata_groups/js/group_components/GroupListItem.vue
index 04155f0..6357d9f 100644
--- a/django_airavata/apps/groups/static/django_airavata_groups/js/group_components/GroupListItem.vue
+++ b/django_airavata/apps/groups/static/django_airavata_groups/js/group_components/GroupListItem.vue
@@ -1,6 +1,10 @@
 <template>
     <tr>
-        <td>{{ group.name }}</td>
+        <td>{{ group.name }}
+            <b-badge v-if="group.isGatewayAdminsGroup">Admins</b-badge>
+            <b-badge v-if="group.isReadOnlyGatewayAdminsGroup">Read Only Admins</b-badge>
+            <b-badge v-if="group.isDefaultGatewayUsersGroup">Default</b-badge>
+        </td>
         <td>{{ group.ownerId }}</td>
         <td>{{ group.description }}</td>
         <td>
@@ -8,7 +12,7 @@
                 :href="'/groups/edit/' + encodeURIComponent(group.id) + '/'">
                 Edit <i class="fa fa-pencil"></i>
             </a>
-            <a href="#" v-if="group.isOwner" @click="show=true" :variant="deleteButtonVariant">
+            <a href="#" v-if="deleteable" @click="show=true" :variant="deleteButtonVariant">
                 Delete <i class="fa fa-trash"></i>
             </a>
             <b-modal :header-bg-variant="headerBgVariant" :header-text-variant="headerTextVariant" :body-bg-variant="bodyBgVariant" v-model="show" :id="'modal'+group.id" title="Are you sure?">
@@ -41,6 +45,16 @@ export default {
       }
     },
     props: ['group'],
+    computed: {
+        deleteable: function() {
+            return this.group.isOwner
+                // Don't allow deleting "GatewayGroups" groups since they serve
+                // a special function in the gateway
+                && this.group.isGatewayAdminsGroup === false
+                && this.group.isReadOnlyGatewayAdminsGroup === false
+                && this.group.isDefaultGatewayUsersGroup === false;
+        }
+    },
     methods: {
       deleteGroup(id) {
           this.deleting = true;

-- 
To stop receiving notification emails like this one, please contact
machristie@apache.org.