From d70220631a8053722b46dd6c4ae68ccac5486c00 Mon Sep 17 00:00:00 2001 From: Xavier Morel Date: Wed, 4 Apr 2012 08:27:27 +0200 Subject: [PATCH] [FIX] custom contexts and domains in search view fields * Remove own_value hack, use compounds instead * Correctly handle compounds evaluation contexts in test eval_domain_and_context js evaluator bzr revid: xmo@openerp.com-20120404062727-r5eoaw73pjw1izk0 --- addons/web/common/nonliterals.py | 24 ++++++------------------ addons/web/static/src/js/core.js | 16 +++++++++++----- addons/web/static/src/js/search.js | 8 ++++---- 3 files changed, 21 insertions(+), 27 deletions(-) diff --git a/addons/web/common/nonliterals.py b/addons/web/common/nonliterals.py index 8128b88fd67..4ee6d122f44 100644 --- a/addons/web/common/nonliterals.py +++ b/addons/web/common/nonliterals.py @@ -45,29 +45,20 @@ class NonLiteralEncoder(simplejson.encoder.JSONEncoder): raise TypeError('Could not encode unknown non-literal %s' % object) _ALLOWED_KEYS = frozenset(['__ref', "__id", '__domains', '__debug', - '__contexts', '__eval_context', 'own_values']) + '__contexts', '__eval_context']) def non_literal_decoder(dct): """ Decodes JSON dicts into :class:`Domain` and :class:`Context` based on magic attribute tags. - - Also handles private context section for the domain or section via the - ``own_values`` dict key. """ if '__ref' in dct: for x in dct: if x not in _ALLOWED_KEYS: raise ValueError("'%s' key not allowed in non literal domain/context" % x) if dct['__ref'] == 'domain': - domain = Domain(None, key=dct['__id']) - if 'own_values' in dct: - domain.own = dct['own_values'] - return domain + return Domain(None, key=dct['__id']) elif dct['__ref'] == 'context': - context = Context(None, key=dct['__id']) - if 'own_values' in dct: - context.own = dct['own_values'] - return context + return Context(None, key=dct['__id']) elif dct["__ref"] == "compound_domain": cdomain = CompoundDomain() for el in dct["__domains"]: @@ -111,7 +102,6 @@ class Domain(BaseDomain): "and a domain string") self.session = session - self.own = {} if domain_string: self.key = binascii.hexlify( hashlib.sha256(domain_string).digest()[:SHORT_HASH_BYTES_SIZE]) @@ -131,8 +121,7 @@ class Domain(BaseDomain): evaluated result. """ ctx = self.session.evaluation_context(context) - if self.own: - ctx.update(self.own) + try: return eval(self.get_domain_string(), SuperDict(ctx)) except NameError as e: @@ -159,7 +148,7 @@ class Context(BaseContext): "and a domain string") self.session = session - self.own = {} + if context_string: self.key = binascii.hexlify( hashlib.sha256(context_string).digest()[:SHORT_HASH_BYTES_SIZE]) @@ -179,8 +168,7 @@ class Context(BaseContext): evaluated result. """ ctx = self.session.evaluation_context(context) - if self.own: - ctx.update(self.own) + try: return eval(self.get_context_string(), SuperDict(ctx)) except NameError as e: diff --git a/addons/web/static/src/js/core.js b/addons/web/static/src/js/core.js index fe0e5200bb0..a79df217a5a 100644 --- a/addons/web/static/src/js/core.js +++ b/addons/web/static/src/js/core.js @@ -620,17 +620,21 @@ openerp.web.Connection = openerp.web.CallbackEnabled.extend( /** @lends openerp. }), true); } }, - test_eval_contexts: function (contexts) { + test_eval_contexts: function (contexts, evaluation_context) { + evaluation_context = evaluation_context || {}; var result_context = _.extend({}, this.user_context), self = this; _(contexts).each(function (ctx) { switch(ctx.__ref) { case 'context': - _.extend(result_context, py.eval(ctx.__debug)); + _.extend(result_context, py.eval( + ctx.__debug, evaluation_context)); break; case 'compound_context': _.extend( - result_context, self.test_eval_contexts(ctx.__contexts)); + result_context, self.test_eval_contexts( + ctx.__contexts, _.extend( + {}, evaluation_context, ctx.__eval_context))); break; default: _.extend(result_context, ctx); @@ -649,7 +653,8 @@ openerp.web.Connection = openerp.web.CallbackEnabled.extend( /** @lends openerp. case 'compound_domain': result_domain.push.apply( result_domain, self.test_eval_domains( - dom.__domains, eval_context)); + dom.__domains, _.extend( + {}, eval_context, dom.__eval_context))); break; default: result_domain.push.apply( @@ -667,7 +672,8 @@ openerp.web.Connection = openerp.web.CallbackEnabled.extend( /** @lends openerp. group = py.eval(ctx.__debug).group_by; break; case 'compound_context': - group = self.test_eval_contexts(ctx.__contexts).group_by; + group = self.test_eval_contexts( + ctx.__contexts, ctx.__eval_context).group_by; break; default: group = ctx.group_by diff --git a/addons/web/static/src/js/search.js b/addons/web/static/src/js/search.js index 8e89595585b..0136d41ada0 100644 --- a/addons/web/static/src/js/search.js +++ b/addons/web/static/src/js/search.js @@ -787,9 +787,8 @@ openerp.web.search.Field = openerp.web.search.Input.extend( /** @lends openerp.w if (!(has_value && context)) { return; } - return _.extend( - {}, context, - {own_values: {self: val}}); + return new openerp.web.CompoundContext(context) + .set_eval_context({self: val}); }, /** * Function creating the returned domain for the field, override this @@ -818,7 +817,8 @@ openerp.web.search.Field = openerp.web.search.Input.extend( /** @lends openerp.w this.attrs.operator || this.default_operator, val); } - return _.extend({}, domain, {own_values: {self: val}}); + return new openerp.web.CompoundDomain(domain) + .set_eval_context({self: val}); } }); /**