Changeset - 001c7e2ae986
[Not reviewed]
beta
0 3 0
Marcin Kuzminski - 13 years ago 2012-07-25 00:38:05
marcin@python-works.com
fixed api issue with changing username during update_user
3 files changed with 39 insertions and 16 deletions:
0 comments (0 inline, 0 general)
rhodecode/controllers/api/api.py
Show inline comments
 
@@ -260,24 +260,25 @@ class ApiController(JSONRPCController):
 

	
 
        user = get_user_or_error(userid)
 

	
 
        #return old attribute if Optional is passed. We don't change parameter
 
        # so user doesn't get updated parameters
 
        get = lambda attr, name: (
 
                getattr(user, name) if isinstance(attr, Optional) else attr
 
        )
 
        # call function and store only updated arguments
 
        updates = {}
 

	
 
        def store_update(attr, name):
 
            if not isinstance(attr, Optional):
 
                updates[name] = attr
 

	
 
        try:
 

	
 
            user = UserModel().create_or_update(
 
                username=get(username, 'username'),
 
                password=get(password, 'password'),
 
                email=get(email, 'email'),
 
                firstname=get(firstname, 'name'),
 
                lastname=get(lastname, 'lastname'),
 
                active=get(active, 'active'),
 
                admin=get(admin, 'admin'),
 
                ldap_dn=get(ldap_dn, 'ldap_dn')
 
            )
 
            store_update(username, 'username')
 
            store_update(password, 'password')
 
            store_update(email, 'email')
 
            store_update(firstname, 'name')
 
            store_update(lastname, 'lastname')
 
            store_update(active, 'active')
 
            store_update(admin, 'admin')
 
            store_update(ldap_dn, 'ldap_dn')
 

	
 
            user = UserModel().update_user(user, **updates)
 
            Session().commit()
 
            return dict(
 
                msg='updated user ID:%s %s' % (user.user_id, user.username),
rhodecode/model/user.py
Show inline comments
 
@@ -278,6 +278,28 @@ class UserModel(BaseModel):
 
            log.error(traceback.format_exc())
 
            raise
 

	
 
    def update_user(self, user, **kwargs):
 
        from rhodecode.lib.auth import get_crypt_password
 
        try:
 
            user = self._get_user(user)
 
            if user.username == 'default':
 
                raise DefaultUserException(
 
                    _("You can't Edit this user since it's"
 
                      " crucial for entire application")
 
                )
 

	
 
            for k, v in kwargs.items():
 
                if k == 'password' and v:
 
                    v = get_crypt_password(v)
 
                    user.api_key = generate_api_key(user.username)
 

	
 
                setattr(user, k, v)
 
            self.sa.add(user)
 
            return user
 
        except:
 
            log.error(traceback.format_exc())
 
            raise
 

	
 
    def update_my_account(self, user_id, form_data):
 
        from rhodecode.lib.auth import get_crypt_password
 
        try:
rhodecode/tests/api/api_base.py
Show inline comments
 
@@ -373,7 +373,7 @@ class BaseTestApi(object):
 
        expected = ret
 
        self._compare_ok(id_, expected, given=response.body)
 

	
 
    @mock.patch.object(UserModel, 'create_or_update', crash)
 
    @mock.patch.object(UserModel, 'update_user', crash)
 
    def test_api_update_user_when_exception_happens(self):
 
        usr = UserModel().get_by_username(TEST_USER_ADMIN_LOGIN)
 
        ret = jsonify(usr.get_api_data())
0 comments (0 inline, 0 general)