summaryrefslogtreecommitdiff
path: root/addons/web/static/src/js/framework/data_manager.js
diff options
context:
space:
mode:
authorAaron Bohy <aab@odoo.com>2016-08-22 15:17:47 +0200
committerGéry Debongnie <ged@odoo.com>2016-09-28 16:55:51 +0200
commit037b7063e27164adf9ff680c34f8f9baa3baaf65 (patch)
tree871a681ea3d869af59422dad3bf016608f48e45a /addons/web/static/src/js/framework/data_manager.js
parent5b94799c820fb1d2ac530fd67f29cfd70722cb5b (diff)
[REF] web: process views arch in data manager
A refactoring of the js views is in progress. Those new views are used in web studio, and this change is part of it. This is necessary to allow web studio to correctly fetch data from the server when rendering a preview. Note: this is necessary for special widgets (status bar, selection, radio widgets)
Diffstat (limited to 'addons/web/static/src/js/framework/data_manager.js')
-rw-r--r--addons/web/static/src/js/framework/data_manager.js35
1 files changed, 34 insertions, 1 deletions
diff --git a/addons/web/static/src/js/framework/data_manager.js b/addons/web/static/src/js/framework/data_manager.js
index f2aa602ab41..55a4b4da15b 100644
--- a/addons/web/static/src/js/framework/data_manager.js
+++ b/addons/web/static/src/js/framework/data_manager.js
@@ -6,6 +6,12 @@ var Model = require('web.DataModel');
var session = require('web.session');
var utils = require('web.utils');
+function traverse(tree, f) {
+ if (f(tree)) {
+ _.each(tree.children, function(c) { traverse(c, f); });
+ }
+}
+
return core.Class.extend({
init: function () {
this.Filters = new Model('ir.filters');
@@ -208,19 +214,46 @@ return core.Class.extend({
*/
_postprocess_fvg: function (fields_view) {
var self = this;
+
+ // Parse and process arch
var doc = $.parseXML(fields_view.arch).documentElement;
+ var fields = fields_view.fields;
fields_view.arch = utils.xml_to_json(doc, (doc.nodeName.toLowerCase() !== 'kanban'));
+ traverse(fields_view.arch, function(node) {
+ if (typeof node === 'string') {
+ return false;
+ }
+ if (node.tag === 'field') {
+ fields[node.attrs.name].__attrs = node.attrs;
+ if (fields[node.attrs.name].type === 'many2one') { // FIXME: this shouldn't be done here
+ if (node.attrs.widget === 'statusbar' || node.attrs.widget === 'radio') {
+ fields[node.attrs.name].__fetch_status = true;
+ } else if (node.attrs.widget === 'selection') {
+ fields[node.attrs.name].__fetch_selection = true;
+ }
+ }
+ if (node.attrs.widget === 'many2many_checkboxes') {
+ fields[node.attrs.name].__fetch_many2manys = true;
+ }
+ return false;
+ }
+ return node.tag !== 'arch';
+ });
+
+ // Special case for id's
if ('id' in fields_view.fields) {
- // Special case for id's
var id_field = fields_view.fields.id;
id_field.original_type = id_field.type;
id_field.type = 'id';
}
+
+ // Process inner views (one2manys)
_.each(fields_view.fields, function(field) {
_.each(field.views || {}, function(view) {
self._postprocess_fvg(view);
});
});
+
return fields_view;
},