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.
This commit is contained in:
Cédric Krier committed 2023-09-22 11:04:29 +02:00
1 parent 498bb5ff54
commit 76c442aa20
4 files changed
+19 -46

No files matched your search

+3 -2
View File
@@ -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
+12 -28
View File
@@ -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
+1 -3
View File
@@ -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
+3 -13
View File
@@ -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