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 362af100e7e61ad7c39fb0547c26e5b0bc328a8d Author: Marcus Christie <machr...@iu.edu> AuthorDate: Thu Feb 22 10:53:36 2018 -0500 AIRAVATA-2685 List of users for group loaded from UserProfileService --- django_airavata/apps/api/serializers.py | 7 ++ .../api/static/django_airavata_api/js/index.js | 2 + .../django_airavata_api/js/models/UserProfile.js | 50 ++++++++++ .../django_airavata_api/js/models/UserStatus.js | 20 ++++ .../js/services/UserProfileService.js | 17 ++++ django_airavata/apps/api/urls.py | 2 + django_airavata/apps/api/views.py | 10 ++ .../js/groups_components/GroupCreate.vue | 104 +++++++++++---------- 8 files changed, 162 insertions(+), 50 deletions(-) diff --git a/django_airavata/apps/api/serializers.py b/django_airavata/apps/api/serializers.py index 8ca2aa1..da2a10b 100644 --- a/django_airavata/apps/api/serializers.py +++ b/django_airavata/apps/api/serializers.py @@ -24,6 +24,7 @@ from airavata.model.experiment.ttypes import (ExperimentModel, from airavata.model.group.ttypes import GroupModel from airavata.model.job.ttypes import JobModel from airavata.model.status.ttypes import ExperimentStatus +from airavata.model.user.ttypes import UserProfile from airavata.model.workspace.ttypes import Project from . import datastore @@ -384,3 +385,9 @@ class ExperimentSummarySerializer( statusUpdateTime = UTCPosixTimestampDateTimeField() url = FullyEncodedHyperlinkedIdentityField(view_name='django_airavata_api:experiment-detail', lookup_field='experimentId', lookup_url_kwarg='experiment_id') project = FullyEncodedHyperlinkedIdentityField(view_name='django_airavata_api:project-detail', lookup_field='projectId', lookup_url_kwarg='project_id') + + +class UserProfileSerializer( + thrift_utils.create_serializer_class(UserProfile)): + creationTime = UTCPosixTimestampDateTimeField() + lastAccessTime = UTCPosixTimestampDateTimeField() diff --git a/django_airavata/apps/api/static/django_airavata_api/js/index.js b/django_airavata/apps/api/static/django_airavata_api/js/index.js index 352dec1..b9f4b42 100644 --- a/django_airavata/apps/api/static/django_airavata_api/js/index.js +++ b/django_airavata/apps/api/static/django_airavata_api/js/index.js @@ -17,6 +17,7 @@ import ExperimentSearchService from './services/ExperimentSearchService' import FullExperimentService from './services/FullExperimentService' import ProjectService from './services/ProjectService' import GroupService from './services/GroupService' +import UserProfileService from './services/UserProfileService' import FetchUtils from './utils/FetchUtils' import PaginationIterator from './utils/PaginationIterator' @@ -42,6 +43,7 @@ exports.services = { FullExperimentService, ProjectService, GroupService, + UserProfileService, } exports.utils = { diff --git a/django_airavata/apps/api/static/django_airavata_api/js/models/UserProfile.js b/django_airavata/apps/api/static/django_airavata_api/js/models/UserProfile.js new file mode 100644 index 0000000..3130ce7 --- /dev/null +++ b/django_airavata/apps/api/static/django_airavata_api/js/models/UserProfile.js @@ -0,0 +1,50 @@ +import BaseModel from './BaseModel' +import UserStatus from './UserStatus' + +const FIELDS = [ + 'userModelVersion', + 'airavataInternalUserId', + 'userId', + 'gatewayId', + 'emails', + 'firstName', + 'lastName', + 'middleName', + 'namePrefix', + 'nameSuffix', + 'orcidId', + 'phones', + 'country', + 'nationality', + 'homeOrganization', + 'orginationAffiliation', + { + name: 'creationTime', + type: 'date', + }, + { + name: 'lastAccessTime', + type: 'date', + }, + 'validUntil', + { + name: 'State', + type: UserStatus, + }, + 'comments', + 'labeledURI', + 'gpgKey', + 'timeZone', + 'nsfDemographics', + 'customDashboard', +]; + +export default class UserProfile extends BaseModel { + constructor(data = {}) { + super(FIELDS, data); + } + + get email() { + return (emails != null && emails.length > 0) ? emails[0] : null; + } +} diff --git a/django_airavata/apps/api/static/django_airavata_api/js/models/UserStatus.js b/django_airavata/apps/api/static/django_airavata_api/js/models/UserStatus.js new file mode 100644 index 0000000..9740e3a --- /dev/null +++ b/django_airavata/apps/api/static/django_airavata_api/js/models/UserStatus.js @@ -0,0 +1,20 @@ +import BaseEnum from './BaseEnum' + +export default class UserStatus extends BaseEnum { +} +UserStatus.init([ + 'ACTIVE', + 'CONFIRMED', + 'APPROVED', + 'DELETED', + 'DUPLICATE', + 'GRACE_PERIOD', + 'INVITED', + 'DENIED', + 'PENDING', + 'PENDING_APPROVAL', + 'PENDING_CONFIRMATION', + 'SUSPENDED', + 'DECLINED', + 'EXPIRED', +]); diff --git a/django_airavata/apps/api/static/django_airavata_api/js/services/UserProfileService.js b/django_airavata/apps/api/static/django_airavata_api/js/services/UserProfileService.js new file mode 100644 index 0000000..23daf7e --- /dev/null +++ b/django_airavata/apps/api/static/django_airavata_api/js/services/UserProfileService.js @@ -0,0 +1,17 @@ + +import UserProfile from '../models/UserProfile' +import FetchUtils from '../utils/FetchUtils' + +class UserProfileService { + list(data = null) { + if (data) { + return Promise.resolve(data.map(result => new UserProfile(result))); + } else { + return FetchUtils.get('/api/user-profiles/') + .then(results => results.map(result => new UserProfile(result))); + } + } +} + +// Export as a singleton +export default new UserProfileService(); \ No newline at end of file diff --git a/django_airavata/apps/api/urls.py b/django_airavata/apps/api/urls.py index bc63c5a..113cf28 100644 --- a/django_airavata/apps/api/urls.py +++ b/django_airavata/apps/api/urls.py @@ -18,6 +18,8 @@ router.register(r'new/application/module', views.RegisterApplicationModule, base router.register(r'application-interfaces', views.ApplicationInterfaceViewSet, base_name='application-interface') router.register(r'applications', views.ApplicationModuleViewSet, base_name='application') router.register(r'application-deployments', views.ApplicationDeploymentViewSet, base_name='application-deployment') +router.register(r'user-profiles', views.UserProfileViewSet, + base_name='user-profile') app_name = 'django_airavata_api' urlpatterns = [ diff --git a/django_airavata/apps/api/views.py b/django_airavata/apps/api/views.py index 0c4db23..2aa0c47 100644 --- a/django_airavata/apps/api/views.py +++ b/django_airavata/apps/api/views.py @@ -674,3 +674,13 @@ def download_file(request): return response except ObjectDoesNotExist as e: raise Http404(str(e)) from e + + +class UserProfileViewSet(mixins.ListModelMixin, GenericAPIBackedViewSet): + + serializer_class = serializers.UserProfileSerializer + + def get_list(self): + user_profile_client = self.request.profile_service['user_profile'] + return user_profile_client.getAllUserProfilesInGateway( + self.authz_token, self.gateway_id, 0, -1) diff --git a/django_airavata/apps/groups/static/django_airavata_groups/js/groups_components/GroupCreate.vue b/django_airavata/apps/groups/static/django_airavata_groups/js/groups_components/GroupCreate.vue index b15d7cb..c0b7505 100644 --- a/django_airavata/apps/groups/static/django_airavata_groups/js/groups_components/GroupCreate.vue +++ b/django_airavata/apps/groups/static/django_airavata_groups/js/groups_components/GroupCreate.vue @@ -32,56 +32,60 @@ import { models, services } from 'django-airavata-api' import Autocomplete from './Autocomplete.vue' export default { - data () { - return { - selection: '', - suggestions: [ - { id: 1, name: 'Stephen' }, - { id: 2, name: 'marcus@seagrid' }, - { id: 3, name: 'marlonpierce@seagrid' }, - { id: 4, name: 'Suresh' }, - { id: 5, name: 'Eroma' }, - { id: 6, name: 'Sachin' }, - { id: 7, name: 'Jerrin' }, - { id: 8, name: 'Eldho' }, - { id: 9, name: 'Dimuthu' }, - { id: 10, name: 'Ameya' }, - { id: 11, name: 'Sneha' }, - ], - newGroup: new models.Group(), - show: true, - selected: [], - showDismissibleAlert: {'variant':'success', 'message':'no data', 'dismissable':false}, - } - }, - components: { - Autocomplete - }, - methods: { - submitForm () { - var temp = []; - for(var i=0;i<this.selected.length;i++) { - temp.push(this.selected[i].name); - } - this.newGroup.members = temp; - console.log(JSON.stringify(this.newGroup)); - services.GroupService.create(this.newGroup) - .then(result => { - console.log(result.json()); - this.showDismissibleAlert.dismissable = true; - this.showDismissibleAlert.message = "Successfully created a new group"; - this.showDismissibleAlert.variant = "success"; - this.newGroup = new models.Group(); - }) - .catch(error => { - this.showDismissibleAlert.dismissable = true; - this.showDismissibleAlert.message = "Error: "+error.data; - this.showDismissibleAlert.variant = "danger"; - }); + data () { + return { + selection: '', + newGroup: new models.Group(), + show: true, + selected: [], + showDismissibleAlert: {'variant':'success', 'message':'no data', 'dismissable':false}, + userProfiles: [], + } + }, + components: { + Autocomplete + }, + methods: { + submitForm () { + var temp = []; + for(var i=0;i<this.selected.length;i++) { + temp.push(this.selected[i].id); + } + this.newGroup.members = temp; + console.log(JSON.stringify(this.newGroup)); + services.GroupService.create(this.newGroup) + .then(result => { + console.log(result.json()); + this.showDismissibleAlert.dismissable = true; + this.showDismissibleAlert.message = "Successfully created a new group"; + this.showDismissibleAlert.variant = "success"; + this.newGroup = new models.Group(); + }) + .catch(error => { + this.showDismissibleAlert.dismissable = true; + this.showDismissibleAlert.message = "Error: "+error.data; + this.showDismissibleAlert.variant = "danger"; + }); + }, + updateSelectedValue(data) { + this.selected = data; + }, + }, + computed: { + suggestions: function() { + return this.userProfiles.map(userProfile => { + return { + id: userProfile.airavataInternalUserId, + name: userProfile.firstName + ' ' + userProfile.lastName + ' (' + userProfile.userId + ')' + } + }) + } + }, + mounted: function () { + services.UserProfileService.list() + .then(userProfiles => { + this.userProfiles = userProfiles; + }); }, - updateSelectedValue(data) { - this.selected = data; - } - } } </script> -- To stop receiving notification emails like this one, please contact machris...@apache.org.