changeset 2657:001c7e2ae986 beta

fixed api issue with changing username during update_user
author Marcin Kuzminski <marcin@python-works.com>
date Wed, 25 Jul 2012 00:38:05 +0200
parents c785ad556d44
children 80d837028c40
files rhodecode/controllers/api/api.py rhodecode/model/user.py rhodecode/tests/api/api_base.py
diffstat 3 files changed, 39 insertions(+), 16 deletions(-) [+]
line wrap: on
line diff
--- a/rhodecode/controllers/api/api.py	Tue Jul 24 22:15:47 2012 +0200
+++ b/rhodecode/controllers/api/api.py	Wed Jul 25 00:38:05 2012 +0200
@@ -260,24 +260,25 @@
 
         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),
--- a/rhodecode/model/user.py	Tue Jul 24 22:15:47 2012 +0200
+++ b/rhodecode/model/user.py	Wed Jul 25 00:38:05 2012 +0200
@@ -278,6 +278,28 @@
             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:
--- a/rhodecode/tests/api/api_base.py	Tue Jul 24 22:15:47 2012 +0200
+++ b/rhodecode/tests/api/api_base.py	Wed Jul 25 00:38:05 2012 +0200
@@ -373,7 +373,7 @@
         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())