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