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:
1 parent
498bb5ff54
commit
76c442aa20
4 files changed
+19
-46
No files matched your search
@@ -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
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in new issue
Block a user