From 5bff091d37e608ae13dc9e28c403a54106970b0a Mon Sep 17 00:00:00 2001 From: Sinisa Veseli <sveseli@aps.anl.gov> Date: Mon, 29 Jun 2015 20:23:33 +0000 Subject: [PATCH] add api/cli for assigning user a role with experiment --- src/python/dm/__init__.py | 2 +- .../dm/ds_web_service/api/userRestApi.py | 13 +++++ .../cli/addUserExperimentRoleCli.py | 49 +++++++++++++++++++ .../impl/experimentSessionControllerImpl.py | 2 +- .../impl/userInfoSessionControllerImpl.py | 3 ++ .../service/userInfoSessionController.py | 13 +++++ .../service/userRouteDescriptor.py | 9 ++++ 7 files changed, 89 insertions(+), 2 deletions(-) create mode 100755 src/python/dm/ds_web_service/cli/addUserExperimentRoleCli.py diff --git a/src/python/dm/__init__.py b/src/python/dm/__init__.py index bdbb0843..703bf576 100644 --- a/src/python/dm/__init__.py +++ b/src/python/dm/__init__.py @@ -1 +1 @@ -__version__ = "Development Snapshot" +__version__ = "0.1 (2015.06.29)" diff --git a/src/python/dm/ds_web_service/api/userRestApi.py b/src/python/dm/ds_web_service/api/userRestApi.py index ee43ab21..901182c1 100755 --- a/src/python/dm/ds_web_service/api/userRestApi.py +++ b/src/python/dm/ds_web_service/api/userRestApi.py @@ -7,6 +7,7 @@ from dm.common.utility.encoder import Encoder from dm.common.exceptions.dmException import DmException from dm.common.exceptions.invalidRequest import InvalidRequest from dm.common.objects.userInfo import UserInfo +from dm.common.objects.userExperimentRole import UserExperimentRole from dsRestApi import DsRestApi class UserRestApi(DsRestApi): @@ -36,6 +37,18 @@ class UserRestApi(DsRestApi): responseData = self.sendSessionRequest(url=url, method='GET') return UserInfo(responseData) + @DsRestApi.execute + def addUserExperimentRole(self, username, experimentName, roleName): + if not username: + raise InvalidRequest('Username must be provided.') + if not experimentName: + raise InvalidRequest('Experiment name must be provided.') + if not roleName: + raise InvalidRequest('Role name must be provided.') + url = '%s/usersByExperiment/%s/%s/%s' % (self.getContextRoot(), username, experimentName, roleName) + responseData = self.sendSessionRequest(url=url, method='POST') + return UserExperimentRole(responseData) + ####################################################################### # Testing. diff --git a/src/python/dm/ds_web_service/cli/addUserExperimentRoleCli.py b/src/python/dm/ds_web_service/cli/addUserExperimentRoleCli.py new file mode 100755 index 00000000..ff044163 --- /dev/null +++ b/src/python/dm/ds_web_service/cli/addUserExperimentRoleCli.py @@ -0,0 +1,49 @@ +#!/usr/bin/env python + +from dm.common.exceptions.invalidRequest import InvalidRequest +from dm.ds_web_service.api.userRestApi import UserRestApi +from dsWebServiceSessionCli import DsWebServiceSessionCli + +class AddUserExperimentRoleCli(DsWebServiceSessionCli): + def __init__(self): + DsWebServiceSessionCli.__init__(self) + self.addOption('', '--username', dest='username', help='User username.') + self.addOption('', '--experiment', dest='experimentName', help='Experiment name.') + self.addOption('', '--role', dest='roleName', help='Role name.') + + def checkArgs(self): + if not self.options.username: + raise InvalidRequest('Username must be provided.') + if not self.options.experimentName: + raise InvalidRequest('Experiment name must be provided.') + if not self.options.roleName: + raise InvalidRequest('Role name must be provided.') + + def getUsername(self): + return self.options.username + + def getExperimentName(self): + return self.options.experimentName + + def getRoleName(self): + return self.options.roleName + + def runCommand(self): + self.parseArgs(usage=""" + dm-add-user-experiment-role --username=USERNAME --experiment=EXPERIMENTNAME + --role=ROLENAME + +Description: + Assigns experiment role to the given user. + """) + self.checkArgs() + api = UserRestApi(self.getLoginUsername(), self.getLoginPassword(), self.getServiceHost(), self.getServicePort(), self.getServiceProtocol()) + userExperimentRole = api.addUserExperimentRole(self.getUsername(), self.getExperimentName(), self.getRoleName()) + print userExperimentRole.getDisplayString(self.getDisplayKeys(), self.getDisplayFormat()) + +####################################################################### +# Run command. +if __name__ == '__main__': + cli = AddUserExperimentRoleCli() + cli.run() + diff --git a/src/python/dm/ds_web_service/service/impl/experimentSessionControllerImpl.py b/src/python/dm/ds_web_service/service/impl/experimentSessionControllerImpl.py index 426f2611..cc060092 100755 --- a/src/python/dm/ds_web_service/service/impl/experimentSessionControllerImpl.py +++ b/src/python/dm/ds_web_service/service/impl/experimentSessionControllerImpl.py @@ -28,7 +28,7 @@ class ExperimentSessionControllerImpl(DmObjectManager): return experimentList def getExperimentByName(self, name): - experiment = self.experimentDbApi.getExperimentByName(name) + experiment = self.experimentDbApi.getExperimentWithUsers(name) ExperimentManager.getInstance().updateExperimentWithStorageDataDirectory(experiment) return experiment diff --git a/src/python/dm/ds_web_service/service/impl/userInfoSessionControllerImpl.py b/src/python/dm/ds_web_service/service/impl/userInfoSessionControllerImpl.py index 2fbeb83a..53baa1ed 100755 --- a/src/python/dm/ds_web_service/service/impl/userInfoSessionControllerImpl.py +++ b/src/python/dm/ds_web_service/service/impl/userInfoSessionControllerImpl.py @@ -24,3 +24,6 @@ class UserInfoSessionControllerImpl(DmObjectManager): def getUserByUsername(self, username): return self.userDbApi.getUserByUsername(username) + def addUserExperimentRole(self, username, experimentName, roleName): + return self.userDbApi.addUserExperimentRole(username, experimentName, roleName) + diff --git a/src/python/dm/ds_web_service/service/userInfoSessionController.py b/src/python/dm/ds_web_service/service/userInfoSessionController.py index 14e1d5e0..2b9849a0 100755 --- a/src/python/dm/ds_web_service/service/userInfoSessionController.py +++ b/src/python/dm/ds_web_service/service/userInfoSessionController.py @@ -36,3 +36,16 @@ class UserInfoSessionController(DmSessionController): self.logger.debug('Returning user info for %s: %s' % (username,response)) return response + @cherrypy.expose + @DmSessionController.require(DmSessionController.isAdministrator()) + @DmSessionController.execute + def addUserExperimentRole(self, username, experimentName, roleName, **kwargs): + if not username: + raise InvalidRequest('Invalid username provided.') + if not experimentName: + raise InvalidRequest('Invalid experiment name provided.') + if not roleName: + raise InvalidRequest('Invalid role name provided.') + response = self.userInfoSessionControllerImpl.addUserExperimentRole(username, experimentName, roleName).getFullJsonRep() + return response + diff --git a/src/python/dm/ds_web_service/service/userRouteDescriptor.py b/src/python/dm/ds_web_service/service/userRouteDescriptor.py index 651727f1..eac2dbbd 100755 --- a/src/python/dm/ds_web_service/service/userRouteDescriptor.py +++ b/src/python/dm/ds_web_service/service/userRouteDescriptor.py @@ -46,6 +46,15 @@ class UserRouteDescriptor: 'method' : ['GET'] }, + # Add user experiment role + { + 'name' : 'addUserExperimentRole', + 'path' : '%s/usersByExperiment/:(username)/:(experimentName)/:(roleName)' % contextRoot, + 'controller' : userInfoSessionController, + 'action' : 'addUserExperimentRole', + 'method' : ['POST'] + }, + ] return routes -- GitLab