diff --git a/addons/base/controllers/main.py b/addons/base/controllers/main.py index 35289e487af..f07a8e462a7 100644 --- a/addons/base/controllers/main.py +++ b/addons/base/controllers/main.py @@ -461,15 +461,20 @@ class View(openerpweb.Controller): Model = request.session.model(model) fvg = Model.fields_view_get(view_id, view_type, request.context, toolbar, submenu) + self.process_view(request.session, fvg, request.context, transform) + return fvg + + def process_view(self, session, fvg, context, transform): if transform: - evaluation_context = request.session.evaluation_context( - request.context or {}) - xml = self.transform_view( - fvg['arch'], request.session, evaluation_context) + evaluation_context = session.evaluation_context(context or {}) + xml = self.transform_view(fvg['arch'], session, evaluation_context) else: xml = ElementTree.fromstring(fvg['arch']) fvg['arch'] = Xml2Json.convert_element(xml) - return fvg + for field in fvg["fields"].values(): + if field["views"]: + for view in field["views"].values(): + self.process_view(session, view, None, transform) def normalize_attrs(self, elem, context): """ Normalize @attrs, @invisible, @required, @readonly and @states, so diff --git a/addons/base/static/src/js/form.js b/addons/base/static/src/js/form.js index 787f50b75b4..cc1fbb2de76 100644 --- a/addons/base/static/src/js/form.js +++ b/addons/base/static/src/js/form.js @@ -31,15 +31,24 @@ openerp.base.FormView = openerp.base.View.extend( /** @lends openerp.base.FormV this.touched = false; this.flags = this.view_manager.flags || {}; }, - start: function(fields_view) { + start: function() { //this.log('Starting FormView '+this.model+this.view_id) - if (fields_view) { - return $.Deferred().then(this.on_loaded).resolve({fields_view: fields_view}); + if (this.embedded_view) { + return $.Deferred().then(this.on_loaded).resolve({fields_view: this.embedded_view}); } else { return this.rpc("/base/formview/load", {"model": this.model, "view_id": this.view_id, toolbar:!!this.flags.sidebar}, this.on_loaded); } }, + /** + * Directly set a view to use instead of calling fields_view_get. This method must + * be called before start(). + * + * @param embedded_view A view. + */ + set_embedded_view: function(embedded_view) { + this.embedded_view = embedded_view; + }, on_loaded: function(data) { var self = this; this.fields_view = data.fields_view; @@ -995,7 +1004,6 @@ openerp.base.form.FieldMany2One = openerp.base.form.Field.extend({ openerp.base.form.FieldOne2Many = openerp.base.form.Field.extend({ init: function(view, node) { this._super(view, node); - debugger; this.template = "FieldOne2Many"; this.is_started = $.Deferred(); this.is_setted = $.Deferred(); @@ -1014,7 +1022,17 @@ openerp.base.form.FieldOne2Many = openerp.base.form.Field.extend({ self.on_ui_change(); }); - var views = [ [false,"list"], [false,"form"] ]; + var modes = this.node.attrs.mode; + modes = !!modes ? modes.split(",") : ["tree", "form"]; + var views = []; + _.each(modes, function(mode) { + var view = [false, mode == "tree" ? "list" : mode]; + if (self.field.views && self.field.views[mode]) { + view.push(self.field.views[mode]); + } + views.push(view); + }); + this.viewmanager = new openerp.base.ViewManager(this.view.session, this.element_id, this.dataset, views); this.viewmanager.start(); diff --git a/addons/base/static/src/js/list.js b/addons/base/static/src/js/list.js index 43c90708805..7bc14298fb6 100644 --- a/addons/base/static/src/js/list.js +++ b/addons/base/static/src/js/list.js @@ -94,9 +94,9 @@ openerp.base.ListView = openerp.base.View.extend( /** @lends openerp.base.ListVi * * @returns {$.Deferred} loading promise */ - start: function(fields_view) { + start: function() { this.$element.addClass('oe-listview'); - return this.reload_view(undefined, fields_view); + return this.reload_view(); }, /** * Called after loading the list view's description, sets up such things @@ -254,15 +254,15 @@ openerp.base.ListView = openerp.base.View.extend( /** @lends openerp.base.ListVi * * @param {Boolean} [grouped] Should the list be displayed grouped */ - reload_view: function (grouped, fields_view) { + reload_view: function (grouped) { var self = this; this.dataset.offset = 0; this.dataset.limit = false; var callback = function (field_view_get) { self.on_loaded(field_view_get, grouped); }; - if (fields_view) { - return $.Deferred().then(callback).resolve({fields_view: fields_view}); + if (this.embedded_view) { + return $.Deferred().then(callback).resolve({fields_view: this.embedded_view}); } else { return this.rpc('/base/listview/load', { model: this.model, @@ -271,6 +271,15 @@ openerp.base.ListView = openerp.base.View.extend( /** @lends openerp.base.ListVi }, callback); } }, + /** + * Directly set a view to use instead of calling fields_view_get. This method must + * be called before start(). + * + * @param embedded_view A view. + */ + set_embedded_view: function(embedded_view) { + this.embedded_view = embedded_view; + }, /** * re-renders the content of the list view */ diff --git a/addons/base/static/src/js/views.js b/addons/base/static/src/js/views.js index a332454ed58..39708e717a0 100644 --- a/addons/base/static/src/js/views.js +++ b/addons/base/static/src/js/views.js @@ -95,7 +95,8 @@ openerp.base.ViewManager = openerp.base.Controller.extend({ self.on_mode_switch($(this).data('view-type')); }); _.each(this.views_src, function(view) { - self.views[view[1]] = { view_id: view[0], controller: null }; + self.views[view[1]] = { view_id: view[0], controller: null, + embedded_view: view[2]}; }); if (this.flags.views_switcher === false) { this.$element.find('.oe_vm_switch').hide(); @@ -119,6 +120,9 @@ openerp.base.ViewManager = openerp.base.Controller.extend({ // Lazy loading of views var controllerclass = openerp.base.views.get_object(view_type); var controller = new controllerclass( this, this.session, this.element_id + "_view_" + view_type, this.dataset, view.view_id); + if (view.embedded_view) { + controller.set_embedded_view(view.embedded_view); + } view_promise = controller.start(); var self = this; $.when(view_promise).then(function() {