changeset a18d951b647d in trytond:default
details: https://hg.tryton.org/trytond?cmd=changeset&node=a18d951b647d
description:
Remove user login and user preferences cache
The user login cache could result in an error when using trytond in a
multiprocess environment due to a delay in the broadcast of the cache
invalidation.
The user preferences cache was there only to set the context when
validating
the records but it is useless since the context is now set from the
transaction.
review401251002
issue11430
diffstat:
trytond/model/modelstorage.py | 12 +---------
trytond/res/__init__.py | 2 -
trytond/res/ir.py | 39 ----------------------------------
trytond/res/user.py | 49 ++----------------------------------------
4 files changed, 4 insertions(+), 98 deletions(-)
diffs (232 lines):
diff -r 633a31cb1026 -r a18d951b647d trytond/model/modelstorage.py
--- a/trytond/model/modelstorage.py Wed Apr 27 18:28:46 2022 +0200
+++ b/trytond/model/modelstorage.py Fri Apr 29 17:14:27 2022 +0200
@@ -1146,15 +1146,6 @@
# also convert iterator to list
records = cls.browse(records)
- ctx_pref = {}
- if Transaction().user:
- try:
- User = pool.get('res.user')
- except KeyError:
- pass
- else:
- ctx_pref = User.get_preferences(context_only=True)
-
def is_pyson(test):
if isinstance(test, PYSON):
return True
@@ -1324,8 +1315,7 @@
field_names = set(field_names)
function_fields = {name for name, field in cls._fields.items()
if isinstance(field, fields.Function)}
- ctx_pref['active_test'] = False
- with Transaction().set_context(ctx_pref):
+ with Transaction().set_context(active_test=False):
for field_name, field in cls._fields.items():
if (field_name not in field_names
and not (field.validation_depends & field_names)
diff -r 633a31cb1026 -r a18d951b647d trytond/res/__init__.py
--- a/trytond/res/__init__.py Wed Apr 27 18:28:46 2022 +0200
+++ b/trytond/res/__init__.py Fri Apr 29 17:14:27 2022 +0200
@@ -30,10 +30,8 @@
ir.ModelButtonRule,
ir.ModelButtonClick,
ir.RuleGroupGroup,
- ir.Lang,
ir.SequenceType,
ir.SequenceTypeGroup,
- ir.ModuleConfigWizardItem,
ir.Export,
ir.Export_Group,
ir.Export_Write_Group,
diff -r 633a31cb1026 -r a18d951b647d trytond/res/ir.py
--- a/trytond/res/ir.py Wed Apr 27 18:28:46 2022 +0200
+++ b/trytond/res/ir.py Fri Apr 29 17:14:27 2022 +0200
@@ -176,16 +176,6 @@
select=True, required=True)
-class Lang(metaclass=PoolMeta):
- __name__ = 'ir.lang'
-
- @classmethod
- def write(cls, langs, values, *args):
- super(Lang, cls).write(langs, values, *args)
- # Restart the cache for get_preferences
- Pool().get('res.user')._get_preferences_cache.clear()
-
-
class SequenceType(metaclass=PoolMeta):
__name__ = 'ir.sequence.type'
groups = fields.Many2Many('ir.sequence.type-res.group', 'sequence_type',
@@ -224,35 +214,6 @@
Rule._domain_get_cache.clear()
-class ModuleConfigWizardItem(metaclass=PoolMeta):
- __name__ = 'ir.module.config_wizard.item'
-
- @classmethod
- def create(cls, vlist):
- pool = Pool()
- User = pool.get('res.user')
- result = super(ModuleConfigWizardItem, cls).create(vlist)
- # Restart the cache for get_preferences
- User._get_preferences_cache.clear()
- return result
-
- @classmethod
- def write(cls, items, values, *args):
- pool = Pool()
- User = pool.get('res.user')
- super(ModuleConfigWizardItem, cls).write(items, values, *args)
- # Restart the cache for get_preferences
- User._get_preferences_cache.clear()
-
- @classmethod
- def delete(cls, items):
- pool = Pool()
- User = pool.get('res.user')
- super(ModuleConfigWizardItem, cls).delete(items)
- # Restart the cache for get_preferences
- User._get_preferences_cache.clear()
-
-
class Export(metaclass=PoolMeta):
__name__ = 'ir.export'
diff -r 633a31cb1026 -r a18d951b647d trytond/res/user.py
--- a/trytond/res/user.py Wed Apr 27 18:28:46 2022 +0200
+++ b/trytond/res/user.py Fri Apr 29 17:14:27 2022 +0200
@@ -155,9 +155,7 @@
warnings = fields.One2Many('res.user.warning', 'user', 'Warnings')
sessions = fields.Function(fields.Integer('Sessions'),
'get_sessions')
- _get_preferences_cache = Cache('res_user.get_preferences')
_get_groups_cache = Cache('res_user.get_groups', context=False)
- _get_login_cache = Cache('res_user._get_login', context=False)
@classmethod
def __setup__(cls):
@@ -374,10 +372,7 @@
@classmethod
def create(cls, vlist):
vlist = [cls._convert_vals(vals) for vals in vlist]
- res = super(User, cls).create(vlist)
- # Restart the cache for _get_login
- cls._get_login_cache.clear()
- return res
+ return super(User, cls).create(vlist)
@classmethod
def write(cls, users, values, *args):
@@ -413,10 +408,6 @@
pool.get('ir.rule')._domain_get_cache.clear()
# Restart the cache for get_groups
cls._get_groups_cache.clear()
- # Restart the cache for _get_login
- cls._get_login_cache.clear()
- # Restart the cache for get_preferences
- cls._get_preferences_cache.clear()
# Restart the cache of check
pool.get('ir.model.access')._get_access_cache.clear()
# Restart the cache of check
@@ -534,15 +525,9 @@
@classmethod
def get_preferences(cls, context_only=False):
- key = (Transaction().user, context_only)
- preferences = cls._get_preferences_cache.get(key)
- if preferences is not None:
- return preferences.copy()
user = Transaction().user
user = cls(user)
- preferences = cls._get_preferences(user, context_only=context_only)
- cls._get_preferences_cache.set(key, preferences)
- return preferences.copy()
+ return cls._get_preferences(user, context_only=context_only)
@classmethod
def set_preferences(cls, values):
@@ -642,9 +627,6 @@
@classmethod
def _get_login(cls, login):
- result = cls._get_login_cache.get(login)
- if result:
- return result
cursor = Transaction().connection.cursor()
table = cls.__table__()
cursor.execute(*table.select(table.id, table.password_hash,
@@ -654,9 +636,7 @@
else_=None),
where=(table.login == login)
& (table.active == Literal(True))))
- result = cursor.fetchone() or (None, None, None)
- cls._get_login_cache.set(login, result)
- return result
+ return cursor.fetchone() or (None, None, None)
@classmethod
def get_login(cls, login, parameters):
@@ -1014,8 +994,6 @@
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 get_preferences
- pool.get('res.user')._get_preferences_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()
@@ -1030,8 +1008,6 @@
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 get_preferences
- pool.get('res.user')._get_preferences_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()
@@ -1045,8 +1021,6 @@
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 get_preferences
- pool.get('res.user')._get_preferences_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()
@@ -1179,31 +1153,14 @@
@classmethod
def create(cls, vlist):
- pool = Pool()
- User = pool.get('res.user')
vlist = [v.copy() for v in vlist]
for values in vlist:
# Ensure we get a different key for each record
# default methods are called only once
values.setdefault('key', cls.default_key())
applications = super(UserApplication, cls).create(vlist)
- User._get_preferences_cache.clear()
return applications
- @classmethod
- def write(cls, *args):
- pool = Pool()
- User = pool.get('res.user')
- super(UserApplication, cls).write(*args)
- User._get_preferences_cache.clear()
-
- @classmethod
- def delete(cls, applications):
- pool = Pool()
- User = pool.get('res.user')
- super(UserApplication, cls).delete(applications)
- User._get_preferences_cache.clear()
-
class EmailResetPassword(Report):
__name__ = 'res.user.email_reset_password'