diff --git a/addons/analytic/models/analytic.py b/addons/analytic/models/analytic.py index 346d1d00877..0235b5d2e1a 100644 --- a/addons/analytic/models/analytic.py +++ b/addons/analytic/models/analytic.py @@ -303,20 +303,22 @@ class account_analytic_account(osv.osv): args=[] if context is None: context={} + account_ids = [] if name: account_ids = self.search(cr, uid, [('code', '=', name)] + args, limit=limit, context=context) if not account_ids: dom = [] - for name2 in name.split('/'): - name = name2.strip() - account_ids = self.search(cr, uid, dom + [('name', operator, name)], limit=limit, context=context) - if not account_ids: break - dom = [('parent_id','in',account_ids)] - if account_ids and args: - # final filtering according to domain (args) - account_ids = self.search(cr, uid, [('id', 'in', account_ids)] + args, limit=limit, context=context) - else: - account_ids = self.search(cr, uid, args, limit=limit, context=context) + if '/' in name: + for name2 in name.split('/'): + # intermediate search without limit and args - could be expensive for large tables if `name` is not selective + account_ids = self.search(cr, uid, dom + [('name', operator, name2.strip())], limit=None, context=context) + if not account_ids: break + dom = [('parent_id','in',account_ids)] + if account_ids and args: + # final filtering according to domain (args)4 + account_ids = self.search(cr, uid, [('id', 'in', account_ids)] + args, limit=limit, context=context) + if not account_ids: + return super(account_analytic_account, self).name_search(cr, uid, name, args, operator=operator, context=context, limit=limit) return self.name_get(cr, uid, account_ids, context=context) def _track_subtype(self, cr, uid, ids, init_values, context=None): diff --git a/addons/base_action_rule/base_action_rule.py b/addons/base_action_rule/base_action_rule.py index e84b9cc9d3e..97e5cad8dab 100644 --- a/addons/base_action_rule/base_action_rule.py +++ b/addons/base_action_rule/base_action_rule.py @@ -117,15 +117,24 @@ class base_action_rule(osv.osv): ir_filter = self.pool['ir.filters'].browse(cr, uid, filter_id, context=context) return {'value': {'filter_domain': ir_filter.domain}} + def _get_eval_context(self, cr, uid, context=None): + """ Prepare the context used when evaluating python code + :returns: dict -- evaluation context given to (safe_)eval """ + return { + 'time': time, + 'user': self.pool['res.users'].browse(cr, uid, uid, context=context), + } + def _filter(self, cr, uid, action, action_filter, record_ids, domain=False, context=None): """ Filter the list record_ids that satisfy the domain or the action filter. """ if record_ids and (domain is not False or action_filter): + eval_context = self._get_eval_context(cr, uid, context=context) if domain is not False: - new_domain = [('id', 'in', record_ids)] + eval(domain) + new_domain = [('id', 'in', record_ids)] + eval(domain, eval_context) ctx = context elif action_filter: assert action.model == action_filter.model_id, "Filter model different from action rule model" - new_domain = [('id', 'in', record_ids)] + eval(action_filter.domain) + new_domain = [('id', 'in', record_ids)] + eval(action_filter.domain, eval_context) ctx = dict(context or {}) ctx.update(eval(action_filter.context)) record_ids = self.pool[action.model].search(cr, uid, new_domain, context=ctx) @@ -381,6 +390,7 @@ class base_action_rule(osv.osv): # retrieve all the action rules to run based on a timed condition action_dom = [('kind', '=', 'on_time')] action_ids = self.search(cr, uid, action_dom, context=dict(context, active_test=True)) + eval_context = self._get_eval_context(cr, uid, context=context) for action in self.browse(cr, uid, action_ids, context=context): now = datetime.now() if action.last_run: @@ -392,9 +402,9 @@ class base_action_rule(osv.osv): domain = [] ctx = dict(context) if action.filter_domain is not False: - domain = eval(action.filter_domain) + domain = eval(action.filter_domain, eval_context) elif action.filter_id: - domain = eval(action.filter_id.domain) + domain = eval(action.filter_id.domain, eval_context) ctx.update(eval(action.filter_id.context)) if 'lang' not in ctx: # Filters might be language-sensitive, attempt to reuse creator lang diff --git a/addons/claim_from_delivery/claim_delivery_view.xml b/addons/claim_from_delivery/claim_delivery_view.xml index 8ce2e7bb7ce..7fd3377678b 100644 --- a/addons/claim_from_delivery/claim_delivery_view.xml +++ b/addons/claim_from_delivery/claim_delivery_view.xml @@ -13,6 +13,7 @@ crm.claim.from_delivery.form stock.picking +