changeset 1989:0f87c784756e beta

API changes - added removed_user_from_users_group function - fixed errors on wrong username - normalized add/remove members from groups functions - docs updates
author Marcin Kuzminski <marcin@python-works.com>
date Tue, 14 Feb 2012 23:02:23 +0200
parents 5eae67552695
children 24c1ba054b9b
files docs/api/api.rst rhodecode/controllers/api/api.py rhodecode/model/users_group.py
diffstat 3 files changed, 107 insertions(+), 16 deletions(-) [+]
line wrap: on
line diff
--- a/docs/api/api.rst	Wed Feb 08 02:54:13 2012 +0200
+++ b/docs/api/api.rst	Tue Feb 14 23:02:23 2012 +0200
@@ -283,7 +283,8 @@
 add_user_to_users_group
 -----------------------
 
-Adds a user to a users group. This command can be executed only using api_key
+Adds a user to a users group. If user exists in that group success will be 
+`false`. This command can be executed only using api_key
 belonging to user with admin rights
 
 
@@ -300,7 +301,36 @@
 
     result: {
               "id":  "<newusersgroupmemberid>",
-              "msg": "created new users group member"
+              "success": True|False # depends on if member is in group
+              "msg": "added member <username> to users group <groupname> | 
+                      User is already in that group"
+            }
+    error:  null
+
+
+remove_user_from_users_group
+----------------------------
+
+Removes a user from a users group. If user is not in given group success will
+be `false`. This command can be executed only 
+using api_key belonging to user with admin rights
+
+
+INPUT::
+
+    api_key : "<api_key>"
+    method :  "remove_user_from_users_group"
+    args:     {
+                "group_name" :  "<groupname>",
+                "username" :   "<username>"
+              }
+
+OUTPUT::
+
+    result: {
+              "success":  True|False,  # depends on if member is in group
+              "msg": "removed member <username> from users group <groupname> | 
+                      User wasn't in group"
             }
     error:  null
 
--- a/rhodecode/controllers/api/api.py	Wed Feb 08 02:54:13 2012 +0200
+++ b/rhodecode/controllers/api/api.py	Tue Feb 14 23:02:23 2012 +0200
@@ -92,8 +92,8 @@
         """
 
         user = User.get_by_username(username)
-        if not user:
-            return None
+        if user is None:
+            return user
 
         return dict(
             id=user.user_id,
@@ -258,18 +258,52 @@
             if not users_group:
                 raise JSONRPCError('unknown users group %s' % group_name)
 
-            try:
-                user = User.get_by_username(username)
-            except NoResultFound:
+            user = User.get_by_username(username)
+            if user is None:
                 raise JSONRPCError('unknown user %s' % username)
 
             ugm = UsersGroupModel().add_user_to_group(users_group, user)
+            success = True if ugm != True else False
+            msg = 'added member %s to users group %s' % (username, group_name)
+            msg = msg if success else 'User is already in that group'
             Session.commit()
-            return dict(id=ugm.users_group_member_id,
-                        msg='created new users group member')
+
+            return dict(
+                id=ugm.users_group_member_id if ugm != True else None,
+                success=success,
+                msg=msg
+            )
         except Exception:
             log.error(traceback.format_exc())
-            raise JSONRPCError('failed to create users group member')
+            raise JSONRPCError('failed to add users group member')
+
+    @HasPermissionAllDecorator('hg.admin')
+    def remove_user_from_users_group(self, apiuser, group_name, username):
+        """
+        Remove user from a group
+
+        :param apiuser
+        :param group_name
+        :param username
+        """
+
+        try:
+            users_group = UsersGroup.get_by_group_name(group_name)
+            if not users_group:
+                raise JSONRPCError('unknown users group %s' % group_name)
+
+            user = User.get_by_username(username)
+            if user is None:
+                raise JSONRPCError('unknown user %s' % username)
+
+            success = UsersGroupModel().remove_user_from_group(users_group, user)
+            msg = 'removed member %s from users group %s' % (username, group_name)
+            msg = msg if success else "User wasn't in group"
+            Session.commit()
+            return dict(success=success, msg=msg)
+        except Exception:
+            log.error(traceback.format_exc())
+            raise JSONRPCError('failed to remove user from group')
 
     @HasPermissionAnyDecorator('hg.admin')
     def get_repo(self, apiuser, repo_name):
@@ -386,10 +420,9 @@
         """
 
         try:
-            try:
-                owner = User.get_by_username(owner_name)
-            except NoResultFound:
-                raise JSONRPCError('unknown user %s' % owner)
+            owner = User.get_by_username(owner_name)
+            if owner is None:
+                raise JSONRPCError('unknown user %s' % owner_name)
 
             if Repository.get_by_repo_name(repo_name):
                 raise JSONRPCError("repo %s already exist" % repo_name)
--- a/rhodecode/model/users_group.py	Wed Feb 08 02:54:13 2012 +0200
+++ b/rhodecode/model/users_group.py	Tue Feb 14 23:02:23 2012 +0200
@@ -29,7 +29,7 @@
 
 from rhodecode.model import BaseModel
 from rhodecode.model.db import UsersGroupMember, UsersGroup,\
-    UsersGroupRepoToPerm, Permission, UsersGroupToPerm
+    UsersGroupRepoToPerm, Permission, UsersGroupToPerm, User
 from rhodecode.lib.exceptions import UsersGroupsAssignedException
 
 log = logging.getLogger(__name__)
@@ -37,6 +37,9 @@
 
 class UsersGroupModel(BaseModel):
 
+    def __get_user(self, user):
+        return self._get_instance(User, user, callback=User.get_by_username)
+
     def __get_users_group(self, users_group):
         return self._get_instance(UsersGroup, users_group,
                                   callback=UsersGroup.get_by_group_name)
@@ -111,10 +114,13 @@
             raise
 
     def add_user_to_group(self, users_group, user):
+        users_group = self.__get_users_group(users_group)
+        user = self.__get_user(user)
+
         for m in users_group.members:
             u = m.user
             if u.user_id == user.user_id:
-                return m
+                return True
 
         try:
             users_group_member = UsersGroupMember()
@@ -130,6 +136,28 @@
             log.error(traceback.format_exc())
             raise
 
+    def remove_user_from_group(self, users_group, user):
+        users_group = self.__get_users_group(users_group)
+        user = self.__get_user(user)
+
+        users_group_member = None
+        for m in users_group.members:
+            if m.user.user_id == user.user_id:
+                # Found this user's membership row
+                users_group_member = m
+                break
+
+        if users_group_member:
+            try:
+                self.sa.delete(users_group_member)
+                return True
+            except:
+                log.error(traceback.format_exc())
+                raise
+        else:
+            # User isn't in that group
+            return False
+
     def has_perm(self, users_group, perm):
         users_group = self.__get_users_group(users_group)
         perm = self.__get_perm(perm)