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 2019/05/29 22:34:09 UTC

[airavata-django-portal] 01/04: AIRAVATA-3040 WIP group membership editor

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 c9d3eb291246ccf7fbd69648c47111f3ce5423f1
Author: Marcus Christie <ma...@apache.org>
AuthorDate: Wed May 29 18:20:22 2019 -0400

    AIRAVATA-3040 WIP group membership editor
---
 .../components/users/UserGroupMembershipEditor.vue | 57 ++++++++++++++++++++++
 .../components/users/UserManagementContainer.vue   | 32 +++++++++++-
 django_airavata/apps/api/serializers.py            |  1 +
 .../js/models/ManagedUserProfile.js                |  1 +
 django_airavata/apps/api/views.py                  | 11 ++++-
 5 files changed, 99 insertions(+), 3 deletions(-)

diff --git a/django_airavata/apps/admin/static/django_airavata_admin/src/components/users/UserGroupMembershipEditor.vue b/django_airavata/apps/admin/static/django_airavata_admin/src/components/users/UserGroupMembershipEditor.vue
new file mode 100644
index 0000000..494f862
--- /dev/null
+++ b/django_airavata/apps/admin/static/django_airavata_admin/src/components/users/UserGroupMembershipEditor.vue
@@ -0,0 +1,57 @@
+<template>
+  <b-form-group label="Groups">
+    <b-form-checkbox-group
+      :checked="selected"
+      :options="options"
+      stacked
+    ></b-form-checkbox-group>
+  </b-form-group>
+</template>
+
+<script>
+export default {
+  name: "user-group-membership-editor",
+  props: {
+    groups: {
+      type: Array,
+      required: true
+    },
+    editableGroups: {
+      type: Array,
+      required: true
+    }
+  },
+  data() {
+    return {
+    }
+  },
+  computed: {
+    selected() {
+      return this.groups.map(g => g.id);
+    },
+    options() {
+      const options = this.groups.map(g => {
+        return {
+          text: g.name,
+          value: g.id,
+          disabled: true
+        }
+      });
+      this.editableGroups.forEach(g => {
+        const editableOption = options.find(opt => opt.value === g.id);
+        if (editableOption) {
+          editableOption.disabled = false;
+        } else {
+          options.push({
+            text: g.name,
+            value: g.id,
+            disabled: false
+          })
+        }
+      })
+      return options;
+    }
+  }
+};
+</script>
+
diff --git a/django_airavata/apps/admin/static/django_airavata_admin/src/components/users/UserManagementContainer.vue b/django_airavata/apps/admin/static/django_airavata_admin/src/components/users/UserManagementContainer.vue
index 4a5d7c0..dbbcb13 100644
--- a/django_airavata/apps/admin/static/django_airavata_admin/src/components/users/UserManagementContainer.vue
+++ b/django_airavata/apps/admin/static/django_airavata_admin/src/components/users/UserManagementContainer.vue
@@ -14,6 +14,23 @@
               :fields="fields"
               :items="items"
             >
+              <template
+                slot="action"
+                slot-scope="data"
+              >
+                <b-button
+                  v-if="data.item.airavataUserProfileExists"
+                  @click="data.toggleDetails"
+                >
+                  Edit Groups
+                </b-button>
+              </template>
+              <template
+                slot="row-details"
+                slot-scope="data"
+              >
+                <user-group-membership-editor :groups="data.item.groups" :editableGroups="editableGroups" />
+              </template>
             </b-table>
             <pager
               v-bind:paginator="usersPaginator"
@@ -30,21 +47,27 @@
 <script>
 import { services } from "django-airavata-api";
 import { components } from "django-airavata-common-ui";
+import UserGroupMembershipEditor from "./UserGroupMembershipEditor.vue";
 
 export default {
   name: "user-management-container",
   data() {
     return {
-      usersPaginator: null
+      usersPaginator: null,
+      allGroups: null
     };
   },
   components: {
-    pager: components.Pager
+    pager: components.Pager,
+    UserGroupMembershipEditor
   },
   created() {
     services.ManagedUserProfileService.list({ limit: 10 }).then(
       users => (this.usersPaginator = users)
     );
+    services.GroupService.list({ limit: -1 }).then(
+      groups => (this.allGroups = groups)
+    );
   },
   computed: {
     fields() {
@@ -81,6 +104,11 @@ export default {
     },
     items() {
       return this.usersPaginator ? this.usersPaginator.results : [];
+    },
+    editableGroups() {
+      return this.allGroups
+        ? this.allGroups.filter(g => g.isAdmin || g.isOwner)
+        : [];
     }
   },
   methods: {
diff --git a/django_airavata/apps/api/serializers.py b/django_airavata/apps/api/serializers.py
index 26ebf7e..7e27870 100644
--- a/django_airavata/apps/api/serializers.py
+++ b/django_airavata/apps/api/serializers.py
@@ -771,6 +771,7 @@ class ManagedUserProfile(serializers.Serializer):
     lastName = serializers.CharField()
     enabled = serializers.BooleanField()
     emailVerified = serializers.BooleanField()
+    airavataUserProfileExists = serializers.BooleanField()
     groups = GroupSerializer(many=True)
     url = FullyEncodedHyperlinkedIdentityField(
         view_name='django_airavata_api:managed-user-profile-detail',
diff --git a/django_airavata/apps/api/static/django_airavata_api/js/models/ManagedUserProfile.js b/django_airavata/apps/api/static/django_airavata_api/js/models/ManagedUserProfile.js
index d29065a..0a7b4f0 100644
--- a/django_airavata/apps/api/static/django_airavata_api/js/models/ManagedUserProfile.js
+++ b/django_airavata/apps/api/static/django_airavata_api/js/models/ManagedUserProfile.js
@@ -11,6 +11,7 @@ const FIELDS = [
   "lastName",
   "enabled",
   "emailVerified",
+  "airavataUserProfileExists",
   {
     name: "groups",
     type: Group,
diff --git a/django_airavata/apps/api/views.py b/django_airavata/apps/api/views.py
index bf25e84..e92135f 100644
--- a/django_airavata/apps/api/views.py
+++ b/django_airavata/apps/api/views.py
@@ -1390,6 +1390,14 @@ class ManagedUserViewSet(mixins.CreateModelMixin,
             iam_admin_client.get_user(lookup_value))
 
     def _convert_user_profile(self, user_profile):
+        user_profile_client = self.request.profile_service['user_profile']
+        group_manager_client = self.request.profile_service['group_manager']
+        airavata_user_profile_exists = user_profile_client.doesUserExist(
+            self.authz_token, user_profile.userId, self.gateway_id)
+        groups = []
+        if airavata_user_profile_exists:
+            groups = group_manager_client.getAllGroupsUserBelongs(
+                self.authz_token, user_profile.airavataInternalUserId)
         return {
             'airavataInternalUserId': user_profile.airavataInternalUserId,
             'userId': user_profile.userId,
@@ -1400,5 +1408,6 @@ class ManagedUserViewSet(mixins.CreateModelMixin,
             # TODO: fix this to distinguish between enabled and emailVerified
             'enabled': user_profile.State == Status.CONFIRMED,
             'emailVerified': user_profile.State == Status.CONFIRMED,
-            'groups': []
+            'airavataUserProfileExists': airavata_user_profile_exists,
+            'groups': groups
         }