From 805c912610903f71abe4842dbe9e29af07d19b8a Mon Sep 17 00:00:00 2001 From: Sinisa Veseli <sveseli@aps.anl.gov> Date: Mon, 10 Oct 2016 15:09:37 +0000 Subject: [PATCH] added ability to update/add users via rest web service --- .../dm/ds_web_service/api/userRestApi.py | 65 +++++++++++++++++++ .../impl/userInfoSessionControllerImpl.py | 8 +++ .../service/userInfoSessionController.py | 51 +++++++++++++++ .../service/userRouteDescriptor.py | 18 +++++ 4 files changed, 142 insertions(+) diff --git a/src/python/dm/ds_web_service/api/userRestApi.py b/src/python/dm/ds_web_service/api/userRestApi.py index 95dccf5a..3ed80831 100755 --- a/src/python/dm/ds_web_service/api/userRestApi.py +++ b/src/python/dm/ds_web_service/api/userRestApi.py @@ -37,6 +37,71 @@ class UserRestApi(DsRestApi): responseData = self.sendSessionRequest(url=url, method='GET') return UserInfo(responseData) + @DsRestApi.execute + def addUser(self, username, firstName, lastName, middleName, email, badge, globusUsername, description, password, isLocalUser, lastUpdate): + if username is None: + raise InvalidRequest('Username must be provided.') + if firstName is None: + raise InvalidRequest('firstName must be provided.') + if lastName is None: + raise InvalidRequest('lastName must be provided.') + url = '%s/users' % (self.getContextRoot()) + url += '?username=%s' % username + url += '&firstName=%s' % Encoder.encode(firstName) + url += '&lastName=%s' % Encoder.encode(lastName) + if middleName: + url += '&middleName=%s' % Encoder.encode(middleName) + if email: + url += '&email=%s' % Encoder.encode(email) + if badge: + url += '&badge=%s' % Encoder.encode(badge) + if globusUsername: + url += '&globusUsername=%s' % Encoder.encode(globusUsername) + if description: + url += '&description=%s' % Encoder.encode(description) + if password: + url += '&password=%s' % Encoder.encode(password) + if isLocalUser: + url += '&isLocaUser=%s' % isLocalUser + if lastUpdate: + url += '&lastUpdate=%s' % lastUpdate + responseData = self.sendSessionRequest(url=url, method='POST') + return UserInfo(responseData) + + @DsRestApi.execute + def updateUser(self, id, username, firstName, lastName, middleName, email, badge, globusUsername, description, password, isLocalUser, lastUpdate): + if id is None: + raise InvalidRequest('User id must be provided.') + url = '' + if username: + url += '&username=%s' % username + if firstName: + url += '&firstName=%s' % Encoder.encode(firstName) + if lastName: + url += '&lastName=%s' % Encoder.encode(lastName) + if middleName: + url += '&middleName=%s' % Encoder.encode(middleName) + if email: + url += '&email=%s' % Encoder.encode(email) + if badge: + url += '&badge=%s' % Encoder.encode(badge) + if globusUsername: + url += '&globusUsername=%s' % Encoder.encode(globusUsername) + if description: + url += '&description=%s' % Encoder.encode(description) + if password: + url += '&password=%s' % Encoder.encode(password) + if isLocalUser: + url += '&isLocaUser=%s' % isLocalUser + if lastUpdate: + url += '&lastUpdate=%s' % lastUpdate + if not url: + raise InvalidRequest('No user attributes have been modified.') + # Remove first '&' character + url = '%s/users/%s?%s' % (self.getContextRoot(), id, url[1:]) + responseData = self.sendSessionRequest(url=url, method='POST') + return UserInfo(responseData) + @DsRestApi.execute def addUserExperimentRole(self, username, experimentName, roleName): if not username: 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 1cc0aec6..6a973d35 100755 --- a/src/python/dm/ds_web_service/service/impl/userInfoSessionControllerImpl.py +++ b/src/python/dm/ds_web_service/service/impl/userInfoSessionControllerImpl.py @@ -25,6 +25,14 @@ class UserInfoSessionControllerImpl(DmObjectManager): def getUserByUsername(self, username): return self.userDbApi.getUserByUsername(username) + def addUser(self, username, firstName, lastName, middleName, email, badge, globusUsername, description, password, isLocalUser, lastUpdate): + userInfo = self.userDbApi.addUser(username, firstName, lastName, middleName, email, badge, globusUsername, description, password, isLocalUser, lastUpdate) + return userInfo + + def updateUser(self, id, username, firstName, lastName, middleName, email, badge, globusUsername, description, password, isLocalUser, lastUpdate): + userInfo = self.userDbApi.updateUser(id, username, firstName, lastName, middleName, email, badge, globusUsername, description, password, isLocalUser, lastUpdate) + return userInfo + def addUserExperimentRole(self, username, experimentName, roleName): userInfo = self.userDbApi.addUserExperimentRole(username, experimentName, roleName) ExperimentManager.getInstance().addUserToGroup(username, experimentName) diff --git a/src/python/dm/ds_web_service/service/userInfoSessionController.py b/src/python/dm/ds_web_service/service/userInfoSessionController.py index 533c2080..52756f87 100755 --- a/src/python/dm/ds_web_service/service/userInfoSessionController.py +++ b/src/python/dm/ds_web_service/service/userInfoSessionController.py @@ -36,6 +36,57 @@ 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 addUser(self, **kwargs): + username = kwargs.get('username') + if not username: + raise InvalidRequest('Invalid username provided.') + firstName = kwargs.get('firstName') + if not firstName: + raise InvalidRequest('Invalid first name provided.') + firstName = Encoder.decode(firstName) + lastName = kwargs.get('lastName') + if not lastName: + raise InvalidRequest('Invalid last name provided.') + lastName = Encoder.decode(lastName) + middleName = Encoder.decode(kwargs.get('middleName')) + email = Encoder.decode(kwargs.get('email')) + badge = Encoder.decode(kwargs.get('badge')) + globusUsername = Encoder.decode(kwargs.get('globusUsername')) + description = Encoder.decode(kwargs.get('description')) + password = Encoder.decode(kwargs.get('password')) + isLocalUser = kwargs.get('isLocalUser') + lastUpdate = Encoder.decode(kwargs.get('lastUpdate')) + + response = self.userInfoSessionControllerImpl.addUser(username, firstName, lastName, middleName, email, badge, globusUsername, description, password, isLocalUser, lastUpdate).getFullJsonRep() + return response + + @cherrypy.expose + @DmSessionController.require(DmSessionController.isAdministrator()) + @DmSessionController.execute + def updateUser(self, id, **kwargs): + if not id: + raise InvalidRequest('Invalid user id provided.') + username = kwargs.get('username') + firstName = Encoder.decode(kwargs.get('firstName')) + lastName = Encoder.decode(kwargs.get('lastName')) + middleName = Encoder.decode(kwargs.get('middleName')) + email = Encoder.decode(kwargs.get('email')) + badge = Encoder.decode(kwargs.get('badge')) + globusUsername = Encoder.decode(kwargs.get('globusUsername')) + description = Encoder.decode(kwargs.get('description')) + password = Encoder.decode(kwargs.get('password')) + isLocalUser = kwargs.get('isLocalUser') + lastUpdate = Encoder.decode(kwargs.get('lastUpdate')) + + response = self.userInfoSessionControllerImpl.updateUser(id, username, firstName, lastName, middleName, email, badge, globusUsername, description, password, isLocalUser, lastUpdate).getFullJsonRep() + return response + + @cherrypy.expose + @DmSessionController.require(DmSessionController.isAdministrator()) + @DmSessionController.execute @cherrypy.expose @DmSessionController.require(DmSessionController.isAdministrator()) @DmSessionController.execute diff --git a/src/python/dm/ds_web_service/service/userRouteDescriptor.py b/src/python/dm/ds_web_service/service/userRouteDescriptor.py index 004b4739..ddffb965 100755 --- a/src/python/dm/ds_web_service/service/userRouteDescriptor.py +++ b/src/python/dm/ds_web_service/service/userRouteDescriptor.py @@ -46,6 +46,24 @@ class UserRouteDescriptor: 'method' : ['GET'] }, + # Add user + { + 'name' : 'addUser', + 'path' : '%s/users' % contextRoot, + 'controller' : userInfoSessionController, + 'action' : 'addUser', + 'method' : ['POST'] + }, + + # Update user + { + 'name' : 'updateUser', + 'path' : '%s/users/:(id)' % contextRoot, + 'controller' : userInfoSessionController, + 'action' : 'updateUser', + 'method' : ['PUT'] + }, + # Add user experiment role { 'name' : 'addUserExperimentRole', -- GitLab