diff --git a/modules/company/ir.py b/modules/company/ir.py index 6b4e890489..921ec906f9 100644 --- a/modules/company/ir.py +++ b/modules/company/ir.py @@ -54,8 +54,8 @@ class Rule(metaclass=PoolMeta): '\n- "companies" as list of ids from the current user') @classmethod - def _get_cache_key(cls): - key = super(Rule, cls)._get_cache_key() + def _get_cache_key(cls, model_name): + key = super()._get_cache_key(model_name) # XXX Use company from context instead of browse to prevent infinite # loop, but the cache is cleared when User is written. context = Transaction().context @@ -66,11 +66,11 @@ class Rule(metaclass=PoolMeta): ) @classmethod - def _get_context(cls): + def _get_context(cls, model_name): pool = Pool() User = pool.get('res.user') Employee = pool.get('company.employee') - context = super()._get_context() + context = super()._get_context(model_name) # Use root to avoid infinite loop when accessing user attributes user_id = Transaction().user with Transaction().set_user(0): diff --git a/trytond/CHANGELOG b/trytond/CHANGELOG index 27dc7af7a9..c298d4056c 100644 --- a/trytond/CHANGELOG +++ b/trytond/CHANGELOG @@ -1,3 +1,4 @@ +* Allow customizing context per model for rule * Use multiple jobs to dump and restore a test database * Support database cache as template for tests * Add route test case diff --git a/trytond/trytond/ir/rule.py b/trytond/trytond/ir/rule.py index 3eb353f785..c89f1ed9a6 100644 --- a/trytond/trytond/ir/rule.py +++ b/trytond/trytond/ir/rule.py @@ -132,8 +132,8 @@ class Rule(ModelSQL, ModelView): def check_domain(cls, rules, field_names=None): if field_names and 'domain' not in field_names: return - ctx = cls._get_context() for rule in rules: + ctx = cls._get_context(rule.rule_group.model.model) try: value = PYSONDecoder(ctx).decode(rule.domain) except Exception: @@ -149,8 +149,8 @@ class Rule(ModelSQL, ModelView): raise DomainError(gettext( 'ir.msg_rule_invalid_domain', name=rule.rec_name)) - @staticmethod - def _get_context(): + @classmethod + def _get_context(cls, model_name): User = Pool().get('res.user') transaction = Transaction() user_id = transaction.user @@ -163,8 +163,8 @@ class Rule(ModelSQL, ModelView): 'groups': User.get_groups() } - @staticmethod - def _get_cache_key(): + @classmethod + def _get_cache_key(cls, model_name): # _datetime value will be added to the domain return (Transaction().user, Transaction().context.get('_datetime')) @@ -243,10 +243,11 @@ class Rule(ModelSQL, ModelView): clause = defaultdict(lambda: ['OR']) clause_global = defaultdict(lambda: ['OR']) - decoder = PYSONDecoder(cls._get_context()) # Use root user without context to prevent recursion with transaction.set_user(0), transaction.set_context(user=0): for rule in cls.browse(ids): + decoder = PYSONDecoder( + cls._get_context(rule.rule_group.model.model)) assert rule.domain, ('Rule domain empty,' 'check if migration was done') dom = decoder.decode(rule.domain) @@ -276,7 +277,7 @@ class Rule(ModelSQL, ModelView): assert mode in cls.modes - key = (model_name, mode) + cls._get_cache_key() + key = (model_name, mode) + cls._get_cache_key(model_name) domain = cls._domain_get_cache.get(key, False) if domain is not False: return domain