From 76c442aa203a9bdb56c2045b7d7155d979fa709a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?C=C3=A9dric=20Krier?= Date: Fri, 22 Sep 2023 11:04:29 +0200 Subject: [PATCH] Use user groups instead of user id in key of access cache This increases the cache hint as it should be less group combinations than users. --- trytond/trytond/ir/action.py | 5 +++-- trytond/trytond/ir/model.py | 40 +++++++++++------------------------- trytond/trytond/res/group.py | 4 +--- trytond/trytond/res/user.py | 16 +++------------ 4 files changed, 19 insertions(+), 46 deletions(-) diff --git a/trytond/trytond/ir/action.py b/trytond/trytond/ir/action.py index 32c476caec..4b35d42f2a 100644 --- a/trytond/trytond/ir/action.py +++ b/trytond/trytond/ir/action.py @@ -257,8 +257,9 @@ class ActionKeyword(ModelSQL, ModelView): Action = pool.get('ir.action') Menu = pool.get('ir.ui.menu') ModelAccess = pool.get('ir.model.access') - user = Transaction().user - key = (user, keyword, tuple(value)) + User = pool.get('res.user') + groups = User.get_groups() + key = (groups, keyword, tuple(value)) keywords = cls._get_keyword_cache.get(key) if keywords is not None: return keywords diff --git a/trytond/trytond/ir/model.py b/trytond/trytond/ir/model.py index 374b53eaf3..49e3971f55 100644 --- a/trytond/trytond/ir/model.py +++ b/trytond/trytond/ir/model.py @@ -532,18 +532,16 @@ class ModelAccess(DeactivableMixin, ModelSQL, ModelView): pool = Pool() Model = pool.get('ir.model') - UserGroup = pool.get('res.user-res.group') - Group = pool.get('res.group') + User = pool.get('res.user') cursor = Transaction().connection.cursor() - user = Transaction().user model_access = cls.__table__() ir_model = Model.__table__() - user_group = UserGroup.user_group_all_table() - group = Group.__table__() + + groups = User.get_groups() access = {} for model in models: - maccess = cls._get_access_cache.get((user, model), default=-1) + maccess = cls._get_access_cache.get((groups, model), default=-1) if maccess == -1: break access[model] = maccess @@ -578,10 +576,6 @@ class ModelAccess(DeactivableMixin, ModelSQL, ModelView): access[model] = default cursor.execute(*model_access.join(ir_model, 'LEFT', condition=model_access.model == ir_model.id - ).join(user_group, 'LEFT', - condition=user_group.group == model_access.group - ).join(group, 'LEFT', - condition=model_access.group == group.id ).select( ir_model.model, Max(Case( @@ -598,9 +592,7 @@ class ModelAccess(DeactivableMixin, ModelSQL, ModelView): else_=0)), where=ir_model.model.in_(all_models) & (model_access.active == Literal(True)) - & (( - (user_group.user == user) - & (group.active == Literal(True))) + & (model_access.group.in_(groups or [-1]) | (model_access.group == Null)), group_by=ir_model.model)) raw_access = { @@ -615,7 +607,7 @@ class ModelAccess(DeactivableMixin, ModelSQL, ModelView): default=access[model][perm]) for perm in ['read', 'write', 'create', 'delete']} for model, maccess in access.items(): - cls._get_access_cache.set((user, model), maccess) + cls._get_access_cache.set((groups, model), maccess) return access @classmethod @@ -755,18 +747,16 @@ class ModelFieldAccess(DeactivableMixin, ModelSQL, ModelView): pool = Pool() Model = pool.get('ir.model') ModelField = pool.get('ir.model.field') - UserGroup = pool.get('res.user-res.group') - Group = pool.get('res.group') - user = Transaction().user + User = pool.get('res.user') field_access = cls.__table__() ir_model = Model.__table__() model_field = ModelField.__table__() - user_group = UserGroup.user_group_all_table() - group = Group.__table__() + + groups = User.get_groups() accesses = {} for model in models: - maccesses = cls._get_access_cache.get((user, model)) + maccesses = cls._get_access_cache.get((groups, model)) if maccesses is None: break accesses[model] = maccesses @@ -780,10 +770,6 @@ class ModelFieldAccess(DeactivableMixin, ModelSQL, ModelView): condition=field_access.field == model_field.id ).join(ir_model, condition=model_field.model == ir_model.id - ).join(user_group, 'LEFT', - condition=user_group.group == field_access.group - ).join(group, 'LEFT', - condition=field_access.group == group.id ).select( ir_model.model, model_field.name, @@ -801,15 +787,13 @@ class ModelFieldAccess(DeactivableMixin, ModelSQL, ModelView): else_=0)), where=ir_model.model.in_(models) & (field_access.active == Literal(True)) - & (( - (user_group.user == user) - & (group.active == Literal(True))) + & (field_access.group.in_(groups or [-1]) | (field_access.group == Null)), group_by=[ir_model.model, model_field.name])) for m, f, r, w, c, d in cursor: accesses[m][f] = {'read': r, 'write': w, 'create': c, 'delete': d} for model, maccesses in accesses.items(): - cls._get_access_cache.set((user, model), maccesses) + cls._get_access_cache.set((groups, model), maccesses) return accesses @classmethod diff --git a/trytond/trytond/res/group.py b/trytond/trytond/res/group.py index d393a014b2..fd6de02206 100644 --- a/trytond/trytond/res/group.py +++ b/trytond/trytond/res/group.py @@ -66,9 +66,7 @@ class Group(DeactivableMixin, tree(), ModelSQL, ModelView): pool.get('ir.rule')._domain_get_cache.clear() # Restart the cache for get_groups pool.get('res.user')._get_groups_cache.clear() - # Restart the cache for model access and view - pool.get('ir.model.access')._get_access_cache.clear() - pool.get('ir.model.field.access')._get_access_cache.clear() + # Restart the cache for view ModelView._fields_view_get_cache.clear() @classmethod diff --git a/trytond/trytond/res/user.py b/trytond/trytond/res/user.py index 70c1fe1941..ad86a98c9b 100644 --- a/trytond/trytond/res/user.py +++ b/trytond/trytond/res/user.py @@ -419,10 +419,6 @@ class User(avatar_mixin(100, 'login'), DeactivableMixin, ModelSQL, ModelView): pool.get('ir.rule')._domain_get_cache.clear() # Restart the cache for get_groups cls._get_groups_cache.clear() - # Restart the cache of check - pool.get('ir.model.access')._get_access_cache.clear() - # Restart the cache of check - pool.get('ir.model.field.access')._get_access_cache.clear() # Restart the cache ModelView._fields_view_get_cache.clear() @@ -1028,9 +1024,7 @@ class UserGroup(ModelSQL): pool.get('ir.rule')._domain_get_cache.clear() # Restart the cache for get_groups pool.get('res.user')._get_groups_cache.clear() - # Restart the cache for model access and view - pool.get('ir.model.access')._get_access_cache.clear() - pool.get('ir.model.field.access')._get_access_cache.clear() + # Restart the cache for view ModelView._fields_view_get_cache.clear() return records @@ -1042,9 +1036,7 @@ class UserGroup(ModelSQL): pool.get('ir.rule')._domain_get_cache.clear() # Restart the cache for get_groups pool.get('res.user')._get_groups_cache.clear() - # Restart the cache for model access and view - pool.get('ir.model.access')._get_access_cache.clear() - pool.get('ir.model.field.access')._get_access_cache.clear() + # Restart the cache for view ModelView._fields_view_get_cache.clear() @classmethod @@ -1055,9 +1047,7 @@ class UserGroup(ModelSQL): pool.get('ir.rule')._domain_get_cache.clear() # Restart the cache for get_groups pool.get('res.user')._get_groups_cache.clear() - # Restart the cache for model access and view - pool.get('ir.model.access')._get_access_cache.clear() - pool.get('ir.model.field.access')._get_access_cache.clear() + # Restart the cache for view ModelView._fields_view_get_cache.clear() @classmethod