From 6b00fad92cd912b2a0010fafd8f2c466c2d38215 Mon Sep 17 00:00:00 2001 From: Holger Brunn Date: Tue, 8 Sep 2015 14:50:44 +0200 Subject: [PATCH 1/4] [FIX] use a nonserialized cursor for updating user groups --- auth_dynamic_groups/model/res_users.py | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/auth_dynamic_groups/model/res_users.py b/auth_dynamic_groups/model/res_users.py index ee96be56b..01233d6b2 100644 --- a/auth_dynamic_groups/model/res_users.py +++ b/auth_dynamic_groups/model/res_users.py @@ -35,10 +35,9 @@ class res_users(Model): return uid def update_dynamic_groups(self, uid, db): - pool = RegistryManager.get(db) - cr = pool._db.cursor() - user = pool.get('res.users').browse(cr, SUPERUSER_ID, uid) - groups_obj = pool.get('res.groups') + cr = self.pool._db.cursor(serialized=True) + user = self.pool.get('res.users').browse(cr, SUPERUSER_ID, uid) + groups_obj = self.pool.get('res.groups') user.write( { 'groups_id': [ From 3f2e12d416c1a294b3757e60aa6659fec4710f96 Mon Sep 17 00:00:00 2001 From: Holger Brunn Date: Tue, 8 Sep 2015 14:56:58 +0200 Subject: [PATCH 2/4] [FIX] actually use a nonserialized cursor --- auth_dynamic_groups/model/res_users.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/auth_dynamic_groups/model/res_users.py b/auth_dynamic_groups/model/res_users.py index 01233d6b2..69d0447ce 100644 --- a/auth_dynamic_groups/model/res_users.py +++ b/auth_dynamic_groups/model/res_users.py @@ -35,7 +35,7 @@ class res_users(Model): return uid def update_dynamic_groups(self, uid, db): - cr = self.pool._db.cursor(serialized=True) + cr = self.pool._db.cursor(serialized=False) user = self.pool.get('res.users').browse(cr, SUPERUSER_ID, uid) groups_obj = self.pool.get('res.groups') user.write( From cf9509cb9a807707e662eac11b8119bc22fa833d Mon Sep 17 00:00:00 2001 From: Holger Brunn Date: Tue, 8 Sep 2015 15:32:44 +0200 Subject: [PATCH 3/4] [FIX] update groups with sql --- auth_dynamic_groups/model/res_users.py | 33 +++++++++++++------------- 1 file changed, 17 insertions(+), 16 deletions(-) diff --git a/auth_dynamic_groups/model/res_users.py b/auth_dynamic_groups/model/res_users.py index 69d0447ce..f6d89fbb3 100644 --- a/auth_dynamic_groups/model/res_users.py +++ b/auth_dynamic_groups/model/res_users.py @@ -19,7 +19,6 @@ # ############################################################################## from openerp.models import Model -from openerp.modules.registry import RegistryManager from openerp import SUPERUSER_ID @@ -36,19 +35,21 @@ class res_users(Model): def update_dynamic_groups(self, uid, db): cr = self.pool._db.cursor(serialized=False) - user = self.pool.get('res.users').browse(cr, SUPERUSER_ID, uid) groups_obj = self.pool.get('res.groups') - user.write( - { - 'groups_id': [ - (4, dynamic_group.id) - if dynamic_group.eval_dynamic_group_condition(uid=uid) - else (3, dynamic_group.id) - for dynamic_group in groups_obj.browse( - cr, SUPERUSER_ID, - groups_obj.search(cr, SUPERUSER_ID, - [('is_dynamic', '=', True)])) - ], - }) - cr.commit() - cr.close() + try: + dynamic_groups = groups_obj.browse( + cr, SUPERUSER_ID, groups_obj.search( + cr, SUPERUSER_ID, [('is_dynamic', '=', True)])) + cr.execute( + 'delete from res_groups_users_rel where uid=%s and gid in %s', + (uid, tuple(dynamic_groups.ids))) + for dynamic_group in dynamic_groups: + if dynamic_group.eval_dynamic_group_condition(uid=uid): + cr.execute( + 'insert into res_groups_users_rel (uid, gid) values ' + '(%s, %s)', + (uid, dynamic_group.id)) + self.invalidate_cache(cr, uid, ['groups_id'], [uid]) + cr.commit() + finally: + cr.close() From 3db7523d7f88c1fac0b842376dd447d7c20c48b0 Mon Sep 17 00:00:00 2001 From: Holger Brunn Date: Tue, 8 Sep 2015 15:34:14 +0200 Subject: [PATCH 4/4] [FIX] don't do anything for admin --- auth_dynamic_groups/model/res_users.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/auth_dynamic_groups/model/res_users.py b/auth_dynamic_groups/model/res_users.py index f6d89fbb3..8ce916e19 100644 --- a/auth_dynamic_groups/model/res_users.py +++ b/auth_dynamic_groups/model/res_users.py @@ -28,7 +28,7 @@ class res_users(Model): def _login(self, db, login, password): uid = super(res_users, self)._login(db, login, password) - if uid: + if uid and uid != SUPERUSER_ID: self.update_dynamic_groups(uid, db) return uid