From 31e7760e1a49f2d995e8ccb6b420eacc3606fb18 Mon Sep 17 00:00:00 2001 From: niv-openerp Date: Tue, 28 Jun 2011 19:18:52 +0200 Subject: [PATCH] [imp] refactoring of the name_... methods + refactoring of the context and domain handling in many2ones bzr revid: nicolas.vanhoren@openerp.com-20110628171852-1393loyd5ln1tsom --- addons/base/static/src/js/data.js | 22 ++++++++----- addons/base/static/src/js/form.js | 51 +++++++++++++++++++----------- addons/base/static/src/js/views.js | 2 +- 3 files changed, 47 insertions(+), 28 deletions(-) diff --git a/addons/base/static/src/js/data.js b/addons/base/static/src/js/data.js index 2d2b36f696a..a29bb850e66 100644 --- a/addons/base/static/src/js/data.js +++ b/addons/base/static/src/js/data.js @@ -328,14 +328,19 @@ openerp.base.DataSet = openerp.base.Controller.extend( /** @lends openerp.base. args: args || [] }, callback, error_callback); }, - /** - * Arguments: - * name='', args=[], operator='ilike', context=None, limit=100 + name_get: function(ids, callback) { + return this.call_and_eval('name_get', [ids, this.context], null, 1, callback); + }, + /* + * args = domain */ - name_search: function (args, callback, error_callback) { + name_search: function (name, args, operator, limit, callback) { return this.call_and_eval('name_search', - args, 1, 3, - callback, error_callback); + [name || '', args || false, operator || 'ilike', this.context, limit || 100], + 1, 3, callback); + }, + name_create: function(name, callback) { + return this.call_and_eval('name_create', [name, this.context], null, 1, callback); }, exec_workflow: function (id, signal, callback) { return this.rpc('/base/dataset/exec_workflow', { @@ -347,8 +352,8 @@ openerp.base.DataSet = openerp.base.Controller.extend( /** @lends openerp.base. }); openerp.base.DataSetStatic = openerp.base.DataSet.extend({ - init: function(session, model, ids) { - this._super(session, model); + init: function(session, model, context, ids) { + this._super(session, model, context); // all local records this.ids = ids || []; this.count = this.ids.length; @@ -612,6 +617,7 @@ openerp.base.CompoundDomain = function() { this.__ref = "compound_domain"; this.__domains = []; this.__eval_context = null; + var self = this; _.each(arguments, function(x) { self.add(x); }); diff --git a/addons/base/static/src/js/form.js b/addons/base/static/src/js/form.js index 8044c425661..cc7993e210e 100644 --- a/addons/base/static/src/js/form.js +++ b/addons/base/static/src/js/form.js @@ -1083,13 +1083,26 @@ openerp.base.form.FieldSelection = openerp.base.form.Field.extend({ * the fields'context with the action's context. */ var build_relation_context = function(relation_field) { - var action = relation_field.view.view_manager.action || {}; - var a_context = action.context || {}; - var f_context = relation_field.field.context || {}; + var a_context = relation_field.view.dataset.context || {}; var fields_values = relation_field.view.get_fields_values(); - var ctx = new openerp.base.CompoundContext(a_context).add(f_context).set_eval_context(fields_values); + var parent_values = a_context.get_eval_context ? a_context.get_eval_context() || {} : {}; + parent_values = _.clone(parent_values); + delete parent_values.parent; + fields_values.parent = parent_values; + var f_context = new openerp.base.CompoundContext(relation_field.field.context || {}).set_eval_context(fields_values); + var ctx = new openerp.base.CompoundContext(a_context, f_context); return ctx; } +var build_relation_domain = function(relation_field) { + var a_context = relation_field.view.dataset.context || {}; + var fields_values = relation_field.view.get_fields_values(); + var parent_values = a_context.get_eval_context ? a_context.get_eval_context() || {} : {}; + parent_values = _.clone(parent_values); + delete parent_values.parent; + fields_values.parent = parent_values; + var f_domain = new openerp.base.CompoundDomain(relation_field.field.domain || []).set_eval_context(fields_values); + return f_domain; +} openerp.base.form.FieldMany2One = openerp.base.form.Field.extend({ init: function(view, node) { @@ -1203,10 +1216,10 @@ openerp.base.form.FieldMany2One = openerp.base.form.Field.extend({ var search_val = request.term; var self = this; - var dataset = new openerp.base.DataSetStatic(this.session, this.field.relation, []); + var dataset = new openerp.base.DataSetStatic(this.session, this.field.relation, build_relation_context(self)); - dataset.name_search([search_val, self.field.domain || [], 'ilike', - build_relation_context(self), this.limit + 1], function(data) { + dataset.name_search(search_val, build_relation_domain(self), 'ilike', + this.limit + 1, function(data) { self.last_search = data.result; // possible selections for the m2o var values = _.map(data.result, function(x) { @@ -1217,8 +1230,8 @@ openerp.base.form.FieldMany2One = openerp.base.form.Field.extend({ if (values.length > self.limit) { values = values.slice(0, self.limit); values.push({label: "   Search More...", action: function() { - dataset.name_search([search_val, self.field.domain || [], 'ilike', - build_relation_context(self), false], function(data) { + dataset.name_search(search_val, build_relation_domain(self), 'ilike' + , false, function(data) { self._change_int_value(null); self._search_create_popup("search", data.result); }); @@ -1245,27 +1258,27 @@ openerp.base.form.FieldMany2One = openerp.base.form.Field.extend({ }, _quick_create: function(name) { var self = this; - var dataset = new openerp.base.DataSetStatic(this.session, this.field.relation, []); - dataset.call("name_create", [name, build_relation_context(self)], function(data) { + var dataset = new openerp.base.DataSetStatic(this.session, this.field.relation, build_relation_context(self)); + dataset.name_create(name, function(data) { self._change_int_ext_value(data.result); - }, function(a, b) { + }).fail(function() { self._change_int_value(null); self._search_create_popup("form", undefined, {"default_name": name}); }); }, // all search/create popup handling _search_create_popup: function(view, ids, context) { - var dataset = new openerp.base.DataSetStatic(this.session, this.field.relation, []); var self = this; var pop = new openerp.base.form.SelectCreatePopup(null, self.view.session); pop.select_element(self.field.relation,{ initial_ids: ids ? _.map(ids, function(x) {return x[0]}) : undefined, initial_view: view, disable_multiple_selection: true - }, self.view.domain || [], - new openerp.base.CompoundContext(build_relation_context(self)).add(context || {})); + }, build_relation_domain(self), + new openerp.base.CompoundContext(build_relation_context(self), context || {})); pop.on_select_elements.add(function(element_ids) { - dataset.call("name_get", [[element_ids[0]]], function(data) { + var dataset = new openerp.base.DataSetStatic(this.session, this.field.relation, build_relation_context(self)); + dataset.name_get([element_ids[0]], function(data) { self._change_int_ext_value(data.result[0]); pop.stop(); }); @@ -1302,8 +1315,8 @@ openerp.base.form.FieldMany2One = openerp.base.form.Field.extend({ self._change_int_ext_value(rval); }; if(typeof(value) === "number") { - var dataset = new openerp.base.DataSetStatic(this.session, this.field.relation, []); - dataset.call("name_get", [[value]], function(data) { + var dataset = new openerp.base.DataSetStatic(this.session, this.field.relation, build_relation_context(self)); + dataset.name_get([value], function(data) { real_set_value(data.result[0]); }).fail(function() {self.tmp_value = undefined;}); } else { @@ -1631,7 +1644,7 @@ openerp.base.form.SelectCreatePopup = openerp.base.BaseWidget.extend({ }); this.searchview.on_search.add(function(domains, contexts, groupbys) { if (self.initial_ids) { - self.view_list.do_search.call(self,[[["id", "in", self.initial_ids]]], + self.view_list.do_search.call(self, domains.concat([[["id", "in", self.initial_ids]]]), contexts, groupbys); self.initial_ids = undefined; } else { diff --git a/addons/base/static/src/js/views.js b/addons/base/static/src/js/views.js index 6852e5595e4..7bf34e2f73c 100644 --- a/addons/base/static/src/js/views.js +++ b/addons/base/static/src/js/views.js @@ -259,7 +259,7 @@ openerp.base.ViewManagerAction = openerp.base.ViewManager.extend({ if (!action.res_id) { dataset = new openerp.base.DataSetSearch(session, action.res_model, action.context || null); } else { - dataset = new openerp.base.DataSetStatic(session, action.res_model, [action.res_id]); + dataset = new openerp.base.DataSetStatic(session, action.res_model, {}, [action.res_id]); if (action.context) { // TODO fme: should normalize all DataSets constructors to (session, model, context, ...) dataset.context = action.context;