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
}